在Python中,int函数或许是一个平常且普通的函数,我们可能天天都在用它,但是却不知它还有一些你不知道的用法。比如下面进制转换的骚操作:
print(int('abcdef',16))#11259375
上面的代码只用int函数就把16进制数字abcdef的字符串形式给干成了10进制数字
int函数还可以完成:数字字符串转换!你还在等什么?赶紧来看看吧!
int函数的语法
int() 函数用于将一个字符串或数字转换为10进
int(x, base=10)
x是字符串或数字,而base一般代表x的进制(范围为2~36或者0,0不代表进制,后面会解释)制整型:即int函数可以把2到36进制的数字(该数字也可以是非10进制整数,如:0xa)或浮点数转化为10进制的整数,又或者将特定的字符串x解释为10进制的整数(base=0的时候)
示例如下:
print(int(123.123))#情形一 #123 print(int(0xabcdef))#情形二 #11259375 print(int('10101', 2))#情形三 #21
对于x的不同类型,int函数的功能不同,下面我们不妨进行一下分类讨论:
①当x的类型为10进制数字时,int函数的功能就是取整,并且是向零取整(不是向下取整!)
②当x的类型为非10进制数字时(如0xabcd),int函数的功能就是将这个非10进制数字转化为10进制数字,而此时要注意的是,这个非10进制数字必须是整数!
③当x的类型不是数字时,int函数的功能就是进制转换,而没有取整功能了【这也解释了为什么int(1.1)可以,而int('1.1')就会报错,因为2到36进制中,都是用字母和数字表示的,没有用小数点表示的!】
更多示例:
1. print(int('12af',16)) 2. #4783 3. print(int(1234,5)) 4. #ValueError
关于进制转换时的字符串,16进制我们都知道,就是用了abcdef这六个字母与0123456789这十个数字去完成16进制,实际上,36进制也是如此,就是26个英文字母全部用上,加上十个数字字符,这样就构成了36进制
大小写问题可以忽略,就算字符串中同时存在大写和小写字母,int函数也能智能识别
base参数的妙处
int函数可以直接为我们转化一些非10进制的数到10进制,而不需要我们自己去写,大大地简化了代码量和编写工作量,而且关键的是,它转换的效率很高!
【注意:输入字符串的时候,字符串不要有前缀标识(2进制是0b,8进制是0o,16进制是0x)】
关于它是怎么实现的
但是我们自己可以仿写一个My_int函数去实现转换进制这个功能(效率没有int高),这里只对2<=base<=36进行仿写
def My_int(x:str, base:int = 10) -> str: if 2<=base<=36:#判断进制是否符合要求 base_lib = '0123456789abcdefghijklmnopqrstuvwxyz'#所有数字和字母字符 out = 0 for i,s in enumerate(x.lower()[::-1]): out += int(base_lib.index(s))*base**i#计算结果 return str(out) else:#进制值不符合base_lib的要求 raise ValueError('invalid value for My_int() with base:%d'%base)
大致就是这样子的。看到了吗?int函数一个简单的参数就实现了至少这么多代码的功能,而且效率还更高!
base为0的作用
当base的值为0的时候,它并不代表进制为0(进制为0无法计算)。官方文档里的描述是这样的:
Base 0 means to interpret the base from the string as an integer literal.
大致的意思应该是,把输入的字符串x合理地解释为10进制整数,它可以直接把2、8、10和16进制的整数转换为10进制整数,但又与前面提到的base方法不同。前面要把m进制的整数转换为10进制,必须要用base指明m的值,而这里base已经是0!这里对输入字符串进制的识别是通过该字符串的进制前缀标识解决的,例如下面的代码:
1. print(int('0b1010',0))#2进制转10进制 2. #10 3. print(int('0xabcd',0))#16进制转10进制 4. #43981
看到这里,我们不妨思考,这个base=0有什么用呢?前面不是可以直接将0xabcd这样的16进制整数转换为10进制整数吗?其实,前面的用法和这里的用法唯一的区别在于输入x的类型。前面输入的x本身就是数字,而这里的x是字符串。所以,base=0的意义就在于省去了将x转换为数字的操作,而是直接对字符串进行分析,节省了时间和内存。
bin函数、oct函数和hex函数
说到进制转换,这里还要给大家说几个要记住的内置函数(只有这3个),他们分别bin()函数、oct()函数和hex()函数
都只有一个参数,分别把整数(非10进制要有前缀标识)转换为2、8和16进制数字的字符串形式
2进制字符串形式的数带一个0b的前缀作为标识符,8进制和16进制分别是0o和0x
示例:
1. print(bin(10), oct(10), hex(10)) 2. #0b1010 0o12 0xa 3. print(bin(0xabcd), oct(0b10101), hex(0o1234567)) 4. #0b1010101111001101 0o25 0x53977