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')
普通整数类型和十进制对象的整除和求余结果,都分别符合除数乘以商与余数加总之后结果等于被除数。