巧用python“int”函式

理工—王棟軒發表於2018-09-01

在python中,可以利用關鍵詞“int”實現其他資料型別強制轉化為整形資料。不過需要注意,在python2中,有長整型,但是在python3中,無論數字多長,都是整形。

int函式原型為:int(x,[base])

其中x的資料型別可以是字串或者數字,base代表進位制,用中括號括起來,意思是可以省略,預設值預設為10。

例如:

v1="123"
print(type(v1))
v2=int(v1)
print(v2)
print(type(v2))

輸出:<class `str`>
     123
   <class `int`>

可見int將字串型轉為了整形。type()作用類似於C中的sizeof,sizeof可以返回變數所佔位元組數從而確定資料型別,type()直接給出資料型別。

int函式的常見用法大致可以分為如下幾類:

1.當x為float型或為int型時,即為數字型時

v=int(3.3/1) #在python中的運算子“/”和在C中作用相似,在這裡是除法的意思,即3.3/1=3.3
print(v)

輸出顯示為:3

v=int(2e3)  # 2e3是指2*10^3,此用法在C中沒有
print(v)

輸出為:2000

v=int(10,16) #這裡的10是數字10,16是16進位制的意思
print(v)

輸出:報錯。

提示:int() can`t convert non-string with explicit base

翻譯過來的意思就是當“base”存在時,int()不能轉換非字串型別。

2.當x為字串時

v=int("123")
print(v)

輸出:123

此時輸出的123是一百二十三的意思,是整形的123。int()將字串“123”強制轉換成了整形123。需要注意的是,在base省略時,預設值預設為10的。

在C語言有atoi、atol、atof等庫函式,可分別把ASCII編碼的字串轉化為int、long、float型別的數字,需要包含標頭檔案stdlib.h,使用方法不如python中簡便。

v=int("123",16)
print(v)

輸出:291。

字串“123”,先轉為數字123,再按照十進位制輸出,就是291。這裡的123是16進位制的123,輸出時是10進位制,所以實際上是0x123=291。

v=int("GG",16)
print(v)

輸出:錯誤。

提示:invalid literal for int() with base 16: `GG`

在十六進位制中,最大的是“f”,而“G”超出了範圍。如果把程式碼中的“16”改為“17”,程式正確,輸出288,即十七進位制的GG轉為十進位制是288。

注意:在這裡base的範圍是2~36!!!

3.x是字串,且是0x、0b、0引導的十六進位制、二進位制、八進位制等。

a="0x10"
v=int(a, 16)
print(v)

輸出:16。

a="0x10"
v=int(a, 17)
print(v)

輸出:錯誤。

提示:ValueError: invalid literal for int() with base 17: `0x10`。

0x並不是十七進位制的前導符,並且在十七進位制中並無符號“x”。

a="0x10"
v=int(a,35)
print(v)

輸出:40460。

雖然0x並不是35進位制的前導符,但是35進位制中用“x”代表33。

 總結:1.當x為數字時,base必須省略。(或者說base賦值以後,x只能代表字串)

 2.當x為字串時,用print輸出,需要將字串按照base的值轉為十進位制,最終顯示結果一定是十進位制。

經典例題:阿凡提與國王比賽下棋,國王說要是自己輸了的話阿凡提想要什麼他都可以拿得出來。阿凡提說那就要點米吧,棋盤一共64個小格子,在第一個格子裡放1粒米,第二個格子裡放2粒米,第三個格子裡放4粒米,第四個格子裡放8粒米,以此類推,後面每個格子裡的米都是前一個格子裡的2倍,一直把64個格子都放滿。需要多少粒米呢?

這個例題在初中或者高中並不算難題,列方程就可以求解。但是如果按照計算機的思路思考,變得十分簡單。第一個格子放1粒,第二個放2粒,第三個放4粒,以此類推……這個問題實際上就是將一個二進位制數轉為十進位制輸。

如果只有兩個格子,一共就需要1+2=3粒米。兩個格子就是“11”,“11”轉為十進位制就是3。

如果只有三個格子,一共就需要1+2+4=7粒米。兩個格子就是“111”,“111”轉為十進位制就是7。

如果只有兩個格子,一共就需要1+2+4+8=15粒米。兩個格子就是“1111”。“11”轉為十進位制就是15。

…………

所以,64個格子用二進位制表示就是“11……11”,64個1,這個問題就變為了64個1轉為10進位制是多少了,很簡單,2**64-1

用python寫就是

v=int(`1`*64,2)
print(v)

輸出:18446744073709551615

 

相關文章