若要编写数学方面的程序,或在程序中使用到数学运算,可以使用Python提供的数学函数模块,数学函数库包括数论与表示函数、幂函数与对数函数、三角函数、角度转换、双曲函数、其它特殊函数。
数学常量
数学函数被封装到math模块,在程序中使用数学函数需要导入math模块,math模块内还定义了数学运算经常使用的常量。
math模块定义的常量如下表所示:
注释(1)
math.inf表示一个正无穷大的浮点数。其它数值与math.inf进行简单的加减运算,结果还是math.inf,若用0去乘math.inf会得到NaN值,表示不是一个数字。若用其它数值除以math.inf,结果是0。若用其它数值与math.inf进行大小比较,其它数值会永远小于math.inf。
案例代码:
>>> import math
>>> 1+math.inf
inf
>>> 1000 / math.inf
0.0
>>> 0 * math.inf
nan
>>> 1000000 < math.inf
True
>>>
注释(2)
math.nan表示非数字的浮点数,相当于NaN值,英文全称是全称是Not a Number,意思是不是一个数字,用来表示没有定义或不可表示的数值。
例如:当两个无穷大数进行运算时,就会产生NaN结果。
案例代码:
>>> import math
>>> math.inf/(-math.inf)
Nan
数论与表示函数
数论可以理解为算术运算,主要是研究整数的性质及其运算。math模块提供了基本的整数运算函数及表示函数。
基本的整数运算函数如下表所示:
表中的x为整数或浮点数
注释(1)
函数声明:
comb(n, k)
函数返回从n项中选取k个不重复项的组合数。当 k <= n 时取值为 n! / (k! * (n - k)!);当 k > n 时取值为零。
组合数是从n个不同元素中取出 k个不同元素,不管其顺序合成一组,称为从 n 个元素中不重复地选取k个元素的一个组合。所有这样的组合的种数称为组合数。
案例代码:
>>> import math
>>>从10个不同元素取出3个不同元素的组合数
>>> math.comb(10,3)
120
>>>
注释(2)
函数声明:
factorial(x)
返回x的阶乘,x为整数。若x不是整数或为负数时则将引发 ValueError异常。
案例代码:
>>> import math
>>> # 计算6的阶乘
>>> math.factorial(6)
720
>>> # 计算10的阶乘
>>> math.factorial(10)
3628800
>>>
注释(3)
函数声明:
frexp(x)
函数返回一个二元组(m,e), m 是一个浮点数,e 是一个整数。x的值正好是x == m * 2**e。若x 为零,则返回 (0.0, 0)。
案例代码:
>>> import math
>>> math.frexp(30)
(0.9375, 5)
>>> math.frexp(8)
(0.5, 4)
>>>
注释(4)
函数声明:
fsum(iterable)
返回可迭代对象中所有元素的和,通该函数通过跟踪多个中间部分和来避免精度损失。
案例代码:
>>> import math
>>> sum([0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1])
0.9999999999999999
>>> math.fsum([0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1])
1.0
从程序执行结果看出,fsum()函数的精度比内置函数sum()的精度要高。
注释(5)
函数声明:
isclose(a, b, *, rel_tol=1e-09, abs_tol=0.0)
该函数比较两个数的接近程度,若 a 和 b 的值比较接近则返回 True,否则返回 False。
接近程序按下式计算:
abs(a-b) <= max(rel_tol * max(abs(a), abs(b)), abs_tol) 。
参数rel_tol是a和b的相对容差,它是 a 和 b 之间允许的最大差值,默认值是1e-09(科学计数法,表示1乘10的负9次方),确保两个值在大约9位十进制数字内相同,rel_tol 必须大于零。例如:要设置a和b最大差值为5%,可以设置rel_tol的值为0.05。
参数abs_tol是a和b的最小绝对容差,abs_tol的值必须至少为0,默认值为0.
案例代码:
>>> import math
>>> math.isclose(19.109806,19.1098067)
False
>>> math.isclose(19.109806,19.1098067,rel_tol=0.00001)
True
>>>
注释(6)
函数声明:
perm(n, k=None)
返回从n中选择k项的排列数。排列数是从n个不同元素中取出k(k≤n)个元素,按照一定的顺序排成一列,叫做从n个元素中取出k个元素的一个排列(permutation),所有这样的排列的种数称为排列数。
当 k <= n 时取值为 n! / (n - k)!;当 k > n 时取值为零。
如果 k 未指定或为 None,则 k 默认值为 n 并且函数将返回 n!。
案例代码:
>>> import math
>>> #计算从10个不同元素取出3个不同元素的排列数
>>> math.perm(10,3)
720
>>> #计算从10个不同元素取出10个不同元素的排列数
>>> math.perm(10)
3628800
>>>
注释(7)
函数声明:
remainder(x, y)
返回IEEE 754 风格的x 相对于 y 的余数,该余数为x-n*y,其中n是与商 x / y 的精确值最接近的整数。
若 x / y的商恰好位于两个连续整数之间,则最接近商的偶数用于 n 。
案例代码:
>>> import math
>>> math.remainder(17,3)
-1.0
>>> math.remainder(20,2)
0.0
>>> math.remainder(19,9)
1.0
>>>
remainder(17,3)返回的结果是-1.0,函数内部的计算公式为:
x-n*y
其中n为17/3的商,17/3的商约是5.6,介于整数5和6之间,根据函数的运算规则取n为6。
17-6*3=-1
幂函数与对数函数
幂函数与对数函数用于进行幂运算和对数运算。
幂运算与对数运算的函数如下表所示:
表中的x为整数或浮点数
注释(1)
函数声明:
log1p(x)
返回1+x的自然对数(底为e),即log(1+x)。如果参数的值小于 -1, 则返回 NaN。
案例代码:
>>> import math
>>> math.log1p(1e-5)
9.99995000033333e-06
>>> math.log1p(1.0)
0.6931471805599453
>>> math.log1p(0)
0.0
三角函数
三角函数提供了对三角函数运算的支持。
Python提供的三角函数如下表所示:
注释(1)
函数声明:
atan2(y, x)
返回y与x商的反正切值,单位是弧度。返回结果在-pi 和 pi 之间,即原点至点(x,y)的方位角,即与 x 轴的夹角。
参数y表示Y轴坐标的浮点值,参数x表示X轴坐标的浮点值,它可以计算角度的正确象限。 例如:atan(1) 和 atan2(1, 1) 都是 pi/4 ,但 atan2(-1, -1) 是 -3*pi/4 。
案例代码:
>>> import math
>>> math.atan2(1,1)
0.7853981633974483
>>> math.atan2(-1,-1)
-2.356194490192345
>>>
注释(2)
函数声明:
dist(p, q)
返回数学坐标系中 p与q 两点之间的欧几里得距离,两个点必须具有相同的维度。
参数p和q表示数学坐标系中的两个点,每个点为一个可迭代对象,可迭代对象的元素为点的坐标。
例如:在二维数学坐标系中,有两个点p(1,0)和q(2,1),p和q两点间的距离可以用下面的Python代码求出:
>>> import math
>>> p = (1,0)
>>> q = (2,1)
>>> math.dist(p,q)
1.4142135623730951
>>>
注释(3)
函数声明:
hypot(*coordinates)
返回欧几里得范数,也称为L^2范数。可以简单理解为向量的模长就是范数,它表示从原点出发到向量确定的点的欧几里得距离。
假设向量V为:

则向量V的L^2范数为:

参数coordinates是可迭代对象,对象内的元素是向量的分量,也就是数学坐标系中点的坐标。例如在二维数学坐标系中,向量有两个分量,分别是x和y,在三维数学坐标系中,向量有三个分量,分别是x、y和z。
案例代码:
>>> import math
>>> math.hypot(2,1,0)
2.23606797749979
>>>
案例代码返回了在三维数学坐标系中向量(2,1,0)的模长。