Python 3数据类型之数字


Python中数字类型包括内置(builtins模块)的整数int,浮点数float以及复数complex几种。Python 3还提供了有理数Fraction以及定点数Decimal的实现,分别位于fraction模块和decimal模块。本文通过一些简单的实验,来揭示Python 3中的数字类型的用法及其实现原理。文中实验代码均在较新的Python 3.8中运行通过。建议打开Python 3的交互式界面,顺序粘贴代码以查看运行结果。

type(1)
int
type(2.5)
float
type(3.2+2j)
complex

整数int

整数类型int,可以采用十进制、二进制、八进制和十六进制表示。二进制的前缀为0b或这0B;八进制的前缀为0o或者0O;十六进制的前缀为0x或者0X。

0b11101111
239
type(0o123)
int
0x123
291

不同进制之间的转换函数分别为bin、oct和hex函数。

hex(123456)
'0x1e240'
oct(0x1e240)
'0o361100'
bin(0O361100)
'0b11110001001000000'

在像C语言这样的编程语言中,能够表示的整数大小通常受限于系统的存储位宽。系统如果采用4个字节也就是32bit来存储一个整数,那么能够表示的最大的无符号整数就是0xFFFFFFFF;如果采用8字节也就是64bit来存储,则能表示的最大无符号整数为0xFFFFFFFFFFFFFFFF。超过这个范围就会发生溢出。但Python里的整数不一样,原则上它没有这个限制,这是因为它内部采用字节数组来存储整数,其存储位宽是可以动态分配和调整的。整数int对象的bit_length()方法可以获取该整数的位宽。从下面的例子可以看到,Python 3可以支持远远超过64bit的整数。

(200).bit_length()
8
0xAAAA0000AAAA0000AA.bit_length()
72
0xFFFFFFFFFFFFFFFFFFFFFFFF+1
79228162514264337593543950336
x = 1
for i in range(1,100):
    x = x * i
x.bit_length()
519

正是由于Python内部采用字节数组来存储整数,因此整数和字节串bytes之间可以很容易地转换。整数int类提供了to_bytes和from_bytes方法,可以和字节串bytes互相转换。字节串bytes跟字符串有点像,不过它是以前缀b开头,后面引号串,引号内如果是可打印字符则显示可打印字符,如果是不可打印印字符才则以\x开头的十六进制形式表示。

int().from_bytes(b'\xde\xad\xbe\xef', byteorder='big')
3735928559
_.to_bytes(length=4, byteorder='big')
b'\xde\xad\xbe\xef'
0x31323334.to_bytes(length=4, byteorder='little')
b'4321'

Python的整数int类这么设计的好处是易用,编程人员不用再担心溢出问题,平时能够用到的数都可以直接表示。但缺点是性能可能会稍低,因此某些特定领域的计算库,为了提升性能,都会使用自己的的整数类型而非Python内置整数类型。

浮点数float

浮点数有两种表示形式,小数和指数。指数形式指数前面为字母e或者E。

type(3.14)
float
type(3.0e8)
float

浮点数字面值(literal)对象只能用十进制来表示,不能用其它进制表示。但是浮点数对象(包括字面值对象)都可以调用hex()方法转换成十六进制,也可以调用fromhex()方法将一个表示十六进制浮点数的字符串转换为十进制的浮点数。

(1.25).hex()
'0x1.4000000000000p+0'
float().fromhex('0x1.0p-2')
0.25

浮点数的范围跟系统有关,可从sys模块的float_info获取。

import sys
print(sys.float_info)
sys.float_info(max=1.7976931348623157e+308, max_exp=1024, max_10_exp=308, min=2.2250738585072014e-308, min_exp=-1021, min_10_exp=-307, dig=15, mant_dig=53, epsilon=2.220446049250313e-16, radix=2, rounds=1)

在Python的math模块中,定义了一些数学上的常数,如℮,𝝅等。

import math
print(type(math.e), math.e)
print(type(math.pi), math.pi)
<class 'float'> 2.718281828459045
<class 'float'> 3.141592653589793

在math模块中还定义了两个特殊的float对象,nan和inf。这两个对象都是float类型的。inf表示无穷大;nan表示not a number。运算结果在数学上没有意义时就是nan,比如两个无穷大做除法结果是nan,或者两个nan做运算也是nan。

  • nan的数学运算是没有意义的,因此只要有一个算数为nan,结果就是nan
  • nan的数学比较也是没有意义的,因此只要有一个操作数为nan,比较结果都是False
  • inf的数学运算则遵循数学定义(见极限),其结果可能为一个浮点数0、浮点数inf(-inf)、或者是nan
  • inf的数学比较也遵循数学定义
  • nan和inf对象并不是全局单例对象(这与None对象不同,
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值