巧用python“int”函数
在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