巧用python“int”函数

发布时间:2019-03-06 17:04:56编辑:auto阅读(2118)

    在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

     

关键字