数字类型实战——其他内置的数字工具

未匹配的标注

除了其核心对象类型外,Python还同时提供了内置函数和标准库模块用于数字处理。比如,powabs内置函数分别计算乘方和绝对值。下面是内置math模块(它包含了大多数在C语言math库中的工具)的一些例子和在3.3版本中的一些实践中使用的内置函数;如之前描述的:在Python 2.7和3.1之前的版本中,一些浮点显示可能会多几位或少几位:

>>> import math
>>> math.pi, math.e # 常见常量
(3.141592653589793, 2.718281828459045)
>>> math.sin(2 * math.pi / 180) # 正弦
0.03489949670250097
>>> math.sqrt(144), math.sqrt(2) # 平方根
(12.0, 1.4142135623730951)
>>> pow(2, 4), 2 ** 4, 2.0 ** 4.0 # 求幂 (乘方)
(16, 16, 16.0)
>>> abs(-42.0), sum((1, 2, 3, 4)) # 绝对值,求和
(42.0, 10)
>>> min(3, 1, 2, 4), max(3, 1, 2, 4) # 最小值,最大值
(1, 4)

这里显示的sum函数作用于一个数字序列,minmax则接受序列或单个的参数。有许多丢弃浮点数小数位的方法。之前遇见过截断和向下取整;还可以四舍五入,同时在数字上和显示上:

>>> math.floor(2.567), math.floor(-2.567) # 向下取整 (下一个更小的整数)
(2, −3)
>>> math.trunc(2.567), math.trunc(−2.567) # 截断 (丢弃小数位)
(2, −2)
>>> int(2.567), int(−2.567) # 截断 (整数转换)
(2, −2)
>>> round(2.567), round(2.467), round(2.567, 2) # 四舍五入 (Python 3.X 版本)
(3, 2, 2.57)
>>> '%.1f' % 2.567, '{0:.2f}'.format(2.567) # 为显示而四舍五入 (第7章)
('2.6', '2.57')

如之前看到的:这些的最后一个生成了我们通常要打印的字符串,且支持许多格式化选项。也是之前描述过的:如果将这里的倒数第二个测试包裹在print调用中来要求更用户友好的显示,在版本2.7和3.1之前,也将输出 (3, 2, 2.57)。然而,即使在系列3中,字符格式化仍有些许不同;round四舍五入并丢弃小数位,但在内存中仍产生了浮点数,然而字符串格式化产生字符串,而非数字:

>>> (1 / 3.0), round(1 / 3.0, 2), ('%.2f' % (1 / 3.0))
(0.3333333333333333, 0.33, '0.33')

有趣的是,在Python中有三种方法来计算平方根:使用模块函数,表达式,或内置函数(如果对性能感兴趣,在第四部分的末尾的一个练习和答案中将重温这些,来看看哪种方法运行更快):

>>> import math
>>> math.sqrt(144) # 模块
12.0
>>> 144 ** .5 # 表达式
12.0
>>> pow(144, .5) # 内置函数
12.0
>>> math.sqrt(1234567890) # 大的数字
35136.41828644462
>>> 1234567890 ** .5
35136.41828644462
>>> pow(1234567890, .5)
35136.41828644462

注意标准库模块如math必须被导入,但内置函数如absround总是可用而不需导入。换句话说,模块是外部组件,但内置函数存在于默认的命名空间中,Python会自动在程序中搜索来找到使用的名称。这个命名空间简单地对应于Python 3系列中的builtins标准库模块(在2系列中是__builtin__)。在本书的函数和模块部分还有更多关于名称解析的知识;就现在来说,当听到”模块“,想”导入“即可。

标准库random模块也必须被导入。这个模块提供了一组工具来完成任务比如:在0和1之间挑选一个随机的浮点数,在两个数之间选择一个随机的整数:

>>> import random
>>> random.random()
0.5566014960423105
>>> random.random() # 随机浮点数、整数、选择、乱序
0.051308506597373515
>>> random.randint(1, 10)
5
>>> random.randint(1, 10)
9

这个模块还能从一个序列随机选择一项,随机地将一个项的列表打乱顺序:

>>> random.choice(['Life of Brian', 'Holy Grail', 'Meaning of Life'])
'Holy Grail'
>>> random.choice(['Life of Brian', 'Holy Grail', 'Meaning of Life'])
'Life of Brian'
>>> suits = ['hearts', 'clubs', 'diamonds', 'spades']
>>> random.shuffle(suits)
>>> suits
['spades', 'hearts', 'diamonds', 'clubs']
>>> random.shuffle(suits)
>>> suits
['clubs', 'diamonds', 'hearts', 'spades']

尽管需要额外的代码来让其更具体,但random模块对在游戏中洗牌,在幻灯片GUI中随机挑选图像,执行统计模拟等等都十分有用。本书稍后将再次使用它(比如,在第20章的排列案例研究中),但要获取更多细节,请参考Python的库手册。

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
讨论数量: 0
发起讨论 只看当前版本


暂无话题~