zoukankan      html  css  js  c++  java
  • python基本数据类型之整型和浮点型

    python基本数据类型之数字与浮点型

    在python3中,整数的数据类型为int,而浮点数的数据类型为float。python2中整数可以是int和long(长整型)两种类型,python3只保留了int,去除了long。

    整型

    int也属于不可变类型,即int类型的变量一旦在内存中被创建就无法改变。int类型本身的内置方法并不多,仅有4个方法:bit_length()、conjugate、from_bytes、to_bytes。

    1、bit_length()
    该方法是获取某个数字二进制形式的位数。

    i = 5
    v = i.bit_length()
    print(bin(i))
    print(v)
    

    打印结果:

    0b101
    3
    

    可以看到,5被转换成二进制就是101,该数字的二进制形式有3位。

    2、conjugate
    该方法是用来操作复数的。在python中,复数的表示方法为:real(实部) + image j(虚部)。实部和虚部都可以是浮点类型(float),虚部的后缀可以是j或J。conjugate方法可以返回复数的共轭复数。

    i = (12 + 3.4j)
    v = i.conjugate()
    print(v)
    

    打印结果:(12-3.4j)
    注意,在定义复数的时候,尽量带上小括号,这样可以更加明确变量之间的关系。

    3、from_bytes、to_bytes
    from_bytes是将bytes类型的变量转化为十进制的数字。该函数是一个类函数(可以用类名直接调用的函数)。from_bytes一共有4个参数,其中一个参数是保留参数。
    int.from_bytes(bytes, byteorder, *, signed=False)

    • bytes 字节类型的变量
    • bytesorder 字节类型变量的排序方式,'big'表示高位在前,低位在后;'little'表示低位在前,高位在后。
    • signed 是否考虑符号位,默认为False,即不考虑符号位

    例如:

    s1 = b'xffxf1'
    print(int.from_bytes(s1, byteorder='big', signed=True))
    

    打印结果: 15
    分析该方法的作用过程:

    1. 首先声明了一个bytes类型的变量s:s1 = b'xffxf1',在引号前加上b表示该变量是bytes类型,x表示后面两位是十六进制数字。

    2. xff 写成二进制数字:1111 1111,xf1 则写成:1111 0001,由于高低位标识为'big',即ff为高位,f1为低位,(如果是'little',则ff是低位,f1是高位),所以整个数字的二进制形式为:11111111 11110001。

    3. 又因为signed=True,所以要考虑符号位。因为该数字的第一位是1,因此它是一个负数。十进制要用补码来表示,而负数的补码就是原码(除符号位外)取反加1。因此取反加1后的结果为:10000000 00001111。因此表示成十进制就是 -15

    另外一个例子:

    s1 = b'xffxf1'
    print(int.from_bytes(s1, byteorder='little', signed=False))
    

    打印结果:61951
    在这个例子中,byteorder='little',表示ff是低位,f1是高位,则整个二进制数写作:11110001 11111111;signed=False表示不考虑符号位。因此表示为正数,结果就是61951。

    to_bytes表示将某个数转换为十六进制表示,是from_bytes函数的逆过程。

    print(int.to_bytes(61951, length=2, byteorder='little', signed=False))
    

    打印结果:b'xffxf1'
    to_bytes函数的参数与from_bytes的参数意义基本一致,其中length=2指定转换后的bytes类型用2位来表示,即xff、xf1两位。

    浮点类型

    python中的浮点数类型为float,其中包含的方法有:as_integer_ratio、conjugate、fromhex、hex、is_integer
    conjugate的用法与int中的内置方法一样,因此不再赘述。

    1、as_integer_ratio
    该方法可以将某一个浮点数表示成两个整型(最小整数)之比的形式。
    例如:

    t = 10.5
    print(t.as_integer_ratio())
    

    打印结果:(21, 2)

    该方法其实是将浮点数转换成分数形式,当遇到负数时,该方法会保证分母为正。

    t = -0.25
    print(t.as_integer_ratio())
    

    打印结果:(-1, 4)
    该方法寻找的是最精确的整数之比,所以当输入的小数特别复杂时,寻找到的最小整数也就越大。

    t = -0.99
    print(t.as_integer_ratio())
    

    打印结果:(-4458563631096791, 4503599627370496)
    当寻找的最精确比值中的整数超出int类型最大值时,会产生内存溢出的错误。

    2、fromhex、hex
    fromhex方法是将一个十六进制用十进制进行表示。

    f1 = '0x1.fp1'
    print(float.fromhex(f1))
    

    打印结果:3.875
    0x1.fp1中的符号表示意义如下:

    • 0x 表示该数字是一个十六进制数字
    • 1.f 这个是数字部分
    • p1 科学计数法,p1的意思是2^1, 即2的1次方。

    该函数的转换过程是:

    1. 1.f转换成二进制表示为:1.1111;
    2. 1.fp1表示的是1.111 * 2^1, 也就是将小数点右移一位,该数字表示为二进制:11.111。
    3. 将11.111转换成十进制。乘以2^(n-1)次方, 1*2^1 + 1*2^0 + 1*2^(-1) + 1*2^(-2) + 1*2^(-3) = 2 + 1 + 0.5 + 0.25 + 0.125 = 3.875。

    而hex则是fromhex的逆过程,即将十进制数字转换成八进制表示。该过程同样也需要二进制作为中介。

    f2 = 7.875
    print(float.hex(f2))
    

    打印结果:0x1.f800000000000p+2
    该函数的过程如下:

    1. 将十进制数字拆分为整数部分和小数部分。7.875分为7 + 0.875
    2. 对于整数部分,让其除以2,不断取余,并逆序取值。
      • 7 / 2 = 3...1(余1)
      • 3 / 2 = 1...1
      • 由最后得到的1往上取,即7 = 111b
    3. 对于小数部分,使其不断乘以2,取其整数部分,并顺序取值。
      • 0.875 * 2 = 1.75(取1)
      • 0.75 * 2 = 1.5(取1)
      • 0.5 * 2 = 1
      • 由第一个得到的1向下取,即0.875 = 0.111b
    4. 所以7.875转换成二进制为:111.111,使用科学计数法表示为:1.11111p2
    5. 将1.11111补齐:1.1111 1000,四位一取,即1.f8

    所以7.875(10)转换成八进制:1.f8p2。

    3、is_integer
    该方法用来判断一个浮点数是否是整数,即能否精确转换成整数(小数部分是否全为0)。

    i = 3.00
    v1 = i.is_integer()
    print('v1 = '+ str(v1))
    
    i2 = 4.12
    v2 = i2.is_integer()
    print('v2 = '+ str(v2))
    

    打印结果:

    v1 = True
    v2 = False
    

    可以看到,当小数部分不全为0时,该方法返回的就是False。

  • 相关阅读:
    随机图片
    单页网站
    最安全的聊天工具——Cryptocat
    一个游戏——小黑屋
    SAO Utils – SAO风格启动菜单
    对话框实现
    抖动文字
    Leetcode: 22. Generate Parentheses
    Leetcode: 21. Merge Two Sorted Lists
    Leetcode: 20. Valid Parentheses
  • 原文地址:https://www.cnblogs.com/guyexiangyun/p/10230572.html
Copyright © 2011-2022 走看看