8.3 数字和数学模块

8.3.1 math模块

math模块提供了对用C编写的数学运算库的访问。

math模块中的函数大致分为如下几类:

数值表示函数:

comb:组合; fabs:求绝对值; factorial:求阶乘; floor:向下取整; gcd:求两数的最大公约数; isclose:判断两个数是否接近到小于一个精度值; isinf:判断是否是无穷大; isnan:判断是否是NaN(not a number); perm:排列;

乘方和对数函数:

exp:求自然对数的x次幂; log:求以x为底的对数或自然对数; pow:乘方; sqrt:平方根;

三角函数:

asin/sin:反正弦/正弦函数; acos/cos:反余弦/余弦函数; atan/tan:反正切/正切函数;

角度转换:

degrees:从弧度转换为角度; radians:从角度转换为弧度;

双曲函数,特殊功能函数等。

常量:

pi:圆周率; e:自然底数; inf:无穷大; nan:NaN。

8.3.2 random模块

Python 的 random 模块提供了生成随机数的各种功能,适用于模拟、游戏、抽样等场景。它基于伪随机数生成器,通过种子(seed)控制随机序列的可重复性。

8.3.2.1 基础随机函数

  • random.random():返回 [0.0, 1.0) 之间的随机浮点数
  • random.seed(a=None):设置随机数种子,相同种子生成相同序列
>>> import random
>>> random.seed(42)
>>> print(random.random())
0.6394267984578837

8.3.2.2 整数相关函数

  • random.randint(a, b):返回 [a, b] 范围内的随机整数(包含首尾
  • random.randrange(start, stop[, step]):从指定范围按步长随机选择整数
>>> print(random.randint(1, 10))
1

>>> print(random.randrange(0, 10, 2))
4

8.3.2.3 浮点数相关函数

  • random.uniform(a, b):返回 [a, b] 或 [b, a] 之间的随机浮点数
  • random.gauss(mu, sigma):生成符合高斯分布(均值 mu,标准差 sigma)的浮点数
>>> print(random.uniform(1.5, 3.5))
1.9897837076069524

>>> print(random.gauss(0, 1))
0.2974745204017183

8.3.2.4 序列相关函数

  • random.choice(seq):从非空序列中随机选择一个元素
  • random.shuffle(seq):原地打乱序列(无返回值)
  • random.sample(population, k):从序列中随机选择 k 个不重复元素
>>> fruits = ["苹果", "香蕉", "橙子"]
>>> print(random.choice(fruits))
橙子

>>> nums = [1, 2, 3, 4, 5]
>>> random.shuffle(nums)
>>> print(nums)
[4, 2, 3, 1, 5]

>>> print(random.sample(range(100), 5))
[4, 3, 11, 27, 29]

注意:random 模块生成的是伪随机数,需通过 seed() 控制可重复性(如测试场景),并且不适合需要较高安全性的场景。

8.3.3 decimal 模块

decimal 模块为快速正确舍入的十进制浮点运算提供支持。

>>> from decimal import *

8.3.3.1 getcontext方法

getcontext方法用于查看当前上下文,并在必要时为精度、舍入或其它内容设置新值:

>>> from decimal import *
>>> getcontext()
Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999, capitals=1, clamp=0, flags=[], traps=[InvalidOperation, DivisionByZero, Overflow])        
>>> getcontext().prec = 6

8.3.3.2 Decimal类

可以传递给Decimal整型或者字符串参数,但不能是浮点数据,因为浮点数据本身就不准确。对于浮点数,需要转换为字符串再进行实例化。

>>> Decimal(10)
Decimal('10')
>>> 0.1 * 3
0.30000000000000004
>>> Decimal(0.1) * 3
Decimal('0.3000000000000000166533453694')
>>> Decimal(str(0.1)) * 3
Decimal('0.3')

8.3.3.3 四舍五入,保留一定小数位数

使用quantize方法实现四舍五入。

>>> Decimal('5.6789').quantize(Decimal('0.01'))
Decimal('5.68')

8.3.3.4 算术运算差异

算术对十进制对象和算术对整数和浮点数有一些小的差别。

当余数运算符 % 应用于Decimal对象时,结果的符号是被除数的符号,而不是除数的符号:

>>> -13 % 3
2
>>> Decimal(-13) % Decimal(3)
Decimal('-1')

整数除法运算符 // 的行为类似,返回真商的整数部分(截断为零)而不是它的向下取整:

>>> -13 // 3
-5
>>> Decimal(-13) // Decimal(3)
Decimal('-4')

普通整数类型和十进制对象的整除和求余结果,都分别符合除数乘以商与余数加总之后结果等于被除数。