巧用python“int”函数

在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.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

猜你喜欢

转载自www.cnblogs.com/lgwdx/p/9571173.html