数字
如果过去已经编写过程序或脚本,那么对表4-1中的一些对象类型就应该很熟悉了。即使没有过,数字也是非常简单易懂的。Python的核心对象集包含了通常的典型元素:没有小数部分的整数,有小数部分的浮点数,还有更多奇特的类型——带有虚部的复数,有固定精度的小数,有分子和分母的有理数,和全功能集合。内置数字足以表示大多数数字化的数量——从年龄到银行余额——但更多类型可作为第三方库使用。
虽然Python提供了一些更高级的选项,但它的基本数字类型是——如你所想——基本的。Python中的数字支持普通的数学操作。比如,加号 (+) 执行加法,星号(*)用于乘法,两个星号(**)用于幂运算:
>>> 123 + 222 # 整数加法
345
>>> 1.5 * 4 # 浮点数乘法
6.0
>>> 2 ** 100 # 2的100次方
1267650600228229401496703205376
这里注意最后的结果:当需要时,Python 3.X的整数类型会自动为像这种大数字提供额外的精度(在 2.X中,一个单独的长整型会以类似的方式来处理这种对普通整型来说太大的数字)。比如,可以在Python中将2的1,000,000 次方作为一个整数,但可能不应该尝试打印这个结果——因为它超过了300,000位数,可能会等一会儿!
>>> len(str(2 ** 1000000)) # 一个真正大的数字会有多少位?
301030
注意:在Python 3.10中,上面的代码会报错:ValueError: Exceeds the limit (4300) for integer string conversion; use sys.set_int_max_str_digits() to increase the limit。解决办法有两个:一个是按提示增加限制数位:
import sys sys.set_int_max_str_digits(1000000) print(len(str(2 ** 1000000))) #301030
二是使用
math.log
函数来处理:import math num_digits = int(math.log(2 ** 1000000, 10)) + 1 print(num_digits) #301030
这个嵌套调用形式是从内到外工作的——首先使用内置str
函数将 2 ** 1000000
结果的数字转换为数字的字符串,然后使用len
得到结果字符串的长度。最终结果是数字的位数。str
和 len
在许多对象类型上可用;随着进一步学习会对它们有更多的了解。
在Python 2.7和3.1之前,一旦开始实验浮点数,就可能意外地碰到一些可能一开始看起来有点奇怪的事情:
>>> 3.1415 * 2 # repr: 可作为代码 (Pythons < 2.7 and 3.1)
6.2830000000000004
>>> print(3.1415 * 2) # str: 用户友好
6.283
第一个结果不是Bug;它是一个显示问题。它证明了在Python中有两种打印每个对象的方式——使用完全的精度(如这里第一个结果显示的),还有以用户友好的形式(如第二个)。正式的说,第一个形式被称为对象的可作为代码的 repr
函数,第二个是它的用户友好的 str
函数。在旧版本的Python中,浮点 repr
有时会比你期望的显示更多精度。当进阶到使用类时,这个差异也会很重要。目前,如果一些事情看起来奇怪,尝试使用 print
内置函数调用语句来显示它。
当然如果能升级到Python 2.7和最新的 3.X的话就再好不过了,在这些版本中浮点数会显示得更加智能,通常多余的数位会更少——因为本书是基于Python 2.7和3.3的,下面就是将一直在本书中对浮点数显示的形式:
>>> 3.1415 * 2 # repr: 可作为代码 (Pythons >= 2.7 and 3.1)
6.283
除了表达式,还有一些和Python一起发布的有用数字模块——模块只是导入使用的额外工具包:
>>> import math
>>> math.pi
3.141592653589793
>>> math.sqrt(85)
9.219544457292887
math
模块包含了更多的高级数字工具作为函数,而 ramdom
模块产生随机数和随机选择(这里,是从在方括号中编码的Python 列表——本章后面将介绍的其他对象的有序集合——选择的):
>>> import random
>>> random.random()
0.7082048489415967
>>> random.choice([1, 2, 3, 4])
1
Python还包括了更多奇特的数字对象——如复数、固定精度数和有理数,还有集合和布尔值——第三方开源扩展领域甚至还有更多(如矩阵和矢量,还有扩展精度数)。这些类型将推迟到本章和本书的后面部分来讨论。
到目前为止,Python一直被当做一个简单的计算器使用;继续探索字符串来更好的介绍它的内置类型。