int函数的骚操作,你学废了吗?

简介: int函数的骚操作,你学废了吗?

在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
目录
相关文章
|
5天前
|
Java C语言 C++
定义C语言的int main()函数
定义C语言的int main()函数
|
4天前
|
Java Unix Linux
编写和理解int main()函数的几个重要注意事项
编写和理解int main()函数的几个重要注意事项
|
4天前
|
Java C语言 C++
定义C语言的int main()函数
定义C语言的int main()函数
|
2月前
|
算法 Java C++
数据结构与算法面试题:实现一个函数 fill(int[] a, int n, int v),使其将大小为 n 的数组 a 填满为 v。
数据结构与算法面试题:实现一个函数 fill(int[] a, int n, int v),使其将大小为 n 的数组 a 填满为 v。
19 0
|
7月前
|
C++
INT_MIN,max函数和accumulate函数
INT_MIN,max函数和accumulate函数
|
C语言
C语言: 定义一个函数int isprime(int n),用来判别一个正整数n是否为素数,若为素数函数返回值为1,否则为0。在主函数中输入一个整数x,调用函数isprime(x)来判断这个整数x是
C语言: 定义一个函数int isprime(int n),用来判别一个正整数n是否为素数,若为素数函数返回值为1,否则为0。在主函数中输入一个整数x,调用函数isprime(x)来判断这个整数x是
983 0
C语言: 定义一个函数int isprime(int n),用来判别一个正整数n是否为素数,若为素数函数返回值为1,否则为0。在主函数中输入一个整数x,调用函数isprime(x)来判断这个整数x是
MATLAB求积分函数int
MATLAB中利用int函数用于对符号表达式s求不定积分、定积分、积分限为无穷的广义积分和变限积分等。
499 0
MATLAB求积分函数int
PHP 中,使用 (int) 或者 intval() 函数可以将变量转换为整数类型,区别是什么?底层原理是什么?
PHP 中,使用 (int) 或者 intval() 函数可以将变量转换为整数类型,区别是什么?底层原理是什么?
325 0
有一个整数数组,长度为9,数组里的值是多少不清楚,但是知道数组中有8个值是相等,其中一个小于其他8个值,目前有一个标准函数,compare(int[] a, int[] b),返回0相等1大于
有一个整数数组,长度为9,数组里的值是多少不清楚,但是知道数组中有8个值是相等,其中一个小于其他8个值,目前有一个标准函数,compare(int[] a, int[] b),返回0相等1大于
用int main检验任意函数,如(func)函数
用int main检验任意函数,如(func)函数
79 0
用int main检验任意函数,如(func)函数