標籤:八進位 字串類型 大致 二進位 符號 3.x 輸出 ror 顯示
在python中,可以利用關鍵詞“int”實現其他資料類型強制轉化為整形資料。不過需要注意,在python2中,有長整型,但是在python3中,無論數字多長,都是整形。
int函數原型為:int(x,[base])
其中x的資料類型可以是字串或者數字,base代表進位,用中括弧括起來,意思是可以省略,預設值預設為10。
int函數的常見用法大致可以分為如下幾類:
1.當x為float型或為int型時,即為數字型時
v=int(3.3/1) #在python中的運算子“/”和在C中作用相似,在這裡是除法的意思,即3.3/1=3.3print(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
巧用python“int”函數