在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