文章目录
- math
- cmath
- statistics
- random
- fractions
- decimal
math
提供了一些基础的计算功能,下列表达式默认from math import *,输入输出均为一个数字。
常见函数 | |
三角函数 |
|
| |
双曲函数 |
|
幂函数 |
|
对数函数 |
|
| |
取整 | 向上 |
| |
角度转换 | 转角度 |
拆分 |
|
其他函数 | 阶乘 |
特殊函数 | |
| 误差函数, |
| 补误差函数,即 |
|
|
|
|
误差函数和函数的图像如下
判断函数 |
|
|
|
| x为有限值 | x为正负无穷 | x为nan |
常量 | nan | ||||
值 | 3.14… | 2.71… | 6.28… | 正无穷 | 非数字 |
代码 |
|
|
|
|
|
输入 | 输入为任意多个数值的函数 |
整数 | 最大公约数 |
数值 | 精确求和 |
连乘 |
其他函数
-
comb(n,k)=,即二项系数
-
perm(n,k)= -
copysign(a,b)= -
dist(p,q)= -
ldexp(x, i)= - 求余数:
fmod(x,y),remainder(x, y) -
nextafter(x, y),返回x趋向于y的最接近的浮点数值。
isclose(a, b, *, rel_tol=1e-09, abs_tol=0.0)
- 若 a 和 b 的值比较接近则返回
True,否则False。 - rel_tol 是相对容差,表示a, b之间允许的最大差值。例如,要设置5%的容差,rel_tol=0.05。rel_tol 必须大于0。
- abs_tol 是最小绝对容差,其值不小于0。
- 等价于
abs(a-b) <= max(rel_tol * max(abs(a), abs(b)), abs_tol)
cmath
即complex math,复数运算包,和math有很多同名函数,无非是math没法计算复数而已。在python中,创建复数的方法是
x = 1+1j常见函数 | |
三角和幂函数 |
|
双曲和反双曲 |
|
对数函数 |
|
坐标转化 | 转为极坐标 |
虚数函数 | 相位 |
判断函数 |
|
常量 | nan | nanj | |||||
值 | 3.14… | 2.71… | 6.28… | 正无穷 | 虚正无穷 | 非数字 | 虚非数字 |
代码 |
|
|
|
|
|
|
|
在cmath中,也提供了类似math中的isclose
cmath.isclose(a, b, *, rel_tol=1e-09, abs_tol=0.0)
- 若 a 和 b 的值比较接近则返回
True,否则False。 - rel_tol 是相对容差,为a, b之间允许的最大差值。例如,要设置5%的容差,rel_tol=0.05。rel_tol 必须大于0。
- abs_tol 是最小绝对容差,其值不小于0。
- 等价于
abs(a-b) <= max(rel_tol * max(abs(a), abs(b)), abs_tol)
statistics
Python自带的统计学工具,功能很弱,但初学者认识一下也是好的。
下面的函数输入均为list。
中心特征 | |
平均数 | 算术平均数 |
中位数 |
|
众数 |
|
标准差 | 总体 |
方差 | 总体 |
此外,quantiles()将数据以相等的概率分为多个间隔;covariance()计算样本协方差;correlation()计算皮尔逊相关系数;linear_regression()计算简单线性回归的斜率和截距。
random
基本原理
用于生成伪随机数,之所以有个伪字,是因为计算机没法生成真正的随机,而只是把一个初始值变得面目全非,从而很像随机数。
这个初始值,是通过seed实现的,如果不设置,则默认为当前的系统时间。
在ramdom中,使用最多的应该就是random.random()了,其功能为返回一个区间的实数。接下来可以通过
random.random()来验证以下random.seed()的功能。
>>> def rand(n):
... random.seed(n)
... print(random.random())
... print(random.random())
...
>>> rand(3)
0.23796462709189137
0.5442292252959519
>>> rand(3)
0.23796462709189137
0.5442292252959519使用seed的一个好处是方便算法复现,比如用某个随机数做算法,然后换了个随机数之后发现算法不对了,就会非常尴尬,这个时候seed就派上了用场。
相比之下,getstate和setstate更加强大,可以获取或设置当前的状态。
>>> a = random.getstate()
>>> random.random()
0.36995516654807925
>>> random.random()
0.6039200385961945
>>> random.setstate(a)
>>> random.random()
0.36995516654807925
>>> random.random()
0.6039200385961945整数和字节
接下来的所有代码默认from random import *。
| 生成n个字节 |
| 生成一个[0,b]之间的整数 |
| 在 |
| 相当于 |
| 相当于 |
分布函数
random中的分布函数均为浮点型。
分布函数 | ||
| [a,b]间均匀分布 | |
| 三角分布 | |
|
| |
| 指数分布 | |
|
| |
| 正态分布 | |
| 正态分布,慢于gauss | |
| 对数正态分布 | |
| 冯·米塞斯分布 | |
| 帕累托分布 | |
| 韦伯分布 |
注:
通过matplotlib可绘制一下分布的形状,以正态分布为例:
import matplotlib.pyplot as plt
xs = [gauss(0,1) for _ in range(10000)]
plt.hist(xs,1000)
plt.show()
可以说十分正态了。
用于序列的随机函数
-
choice(lst):从lst中随机选择一个数 -
shuffle(lst):把lst打乱 -
sample(lst, k, counts=None):从lst中选出k个数,counts代表lst中对应元素的个数,为整数。
choices(lst,weights=None, cum_weights=None, k=1):从lst中选择一个子列表
- k为元素个数
- weights为相对权重数组,长度与lst相同,每个元素都大于0,代表对应元素出现的概率权重,
- cum_weights为累加权重数组,长度与lst相同
fractions
分数模块中主要实现了分数类Fraction,其构造函数被重载成数个,分别可以通过浮点数、两个整数或者字符串等方法,并且对运算符进行了重载。
from fractions import Fraction as Frac
>>> a = Frac("3/5")
>>> a
Fraction(3, 5)
>>> print(a.as_integer_ratio()) #将分数输出为元组
(3, 5)
>>> b = Frac(5,3) #Fraction(5, 3)
>>> c = Frac(2.5) #Fraction(5, 2)
>>> print(a+c)
31/10
>>> print(b/c)
2/3类成员为
real | imag | numerator | denominator |
实部 | 虚部 | 分子 | 分母 |
此外还有一个函数a.limit_denominator(dMax),用于返回一个分母不大于dMax的最接近于a的分数。
>>> a = Frac(6.4)
>>> a #由于舍入误差,所以得到的值并不正确
Fraction(3602879701896397, 562949953421312)
>>> a.limit_denominator(10000)
Fraction(32, 5)decimal
在python中比较常见的问题是
>>> 0.333333333333333333333*3
1.0
>>> 0.999999999999999999999999
1.0如果这可以算作程序的“自作聪明”的话,那么下面这个就是完全没有必要的误差了。
>>> 0.1*3-0.3
5.551115123125783e-17decimal就为了解决这个问题,下面的代码默认from decimal imoprt *。
通过Decimal来新建一个Decimal格式的数字,然后就可以像float一样使用Python中的函数了。
>>> x = Decimal(1)
>>> x
Decimal('1')
>>> x/3
Decimal('0.3333333333333333333333333333')
>>> x/3*3
Decimal('0.9999999999999999999999999999')Decimal对象
Decimal中内置了很多函数,可以通过如下形式调用
>>> D = decimal.Decimal
>>> x = D(15)
>>> x.sqrt()
Decimal('3.872983346207416885179265400')此外,可以输入一些字符串来得到特殊值,例如无穷大
>>> x = D('Infinity')
>>> x
Decimal('Infinity')成员变量 |
|
|
虚部 | 实部 |
函数 | |
返回自身 |
|
用于判断 |
|
| |
| |
数学函数 |
|
舍入函数 |
|
转字符串 |
|
返回分数 |
|
移位函数 |
|
相邻数字 |
|
双元运算,默认格式为 | |
常规运算 |
|
逻辑运算 |
|
比较运算 |
|
| |
| |
| |
相邻值 |
|
最值 |
|
常量和成员变量
舍入模式 | 舍入方向 |
ROUND_CEILING | 正无穷 |
ROUND_FLOOR | 负无穷 |
ROUND_DOWN | 0 |
ROUND_UP | 0的反方向 |
ROUND_HALF_DOWN | 最接近的数,同样接近则舍入方向为零。 |
ROUND_HALF_EVEN | 最接近的数,同样接近时趋向偶数。 |
ROUND_HALF_UP | 最接近的数,同样接近则舍入到零的反方向 |
ROUND_05UP | 末位趋0或5 |
常量 | MAX_PREC | MAX_EMAX | MIN_EMIN | MIN_ETINY |
32位 | 425000000 | MAX_PREC | -MAX_PREC | -849999999 |
64位 | 1e18-1 | MAX_PREC | -MAX_PREC | -(MAX_PREC-2) |
上下文对象
在decimal中,通过上下文对象来管理精度、舍入规则等,可通过getcontext和setcontext来读取和更改。
>>> getcontext()
Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999, capitals=1, clamp=0, flags=[Inexact, FloatOperation, Rounded], traps=[InvalidOperation, DivisionByZero, Overflow])decimal内置了三种上下文
>>> BasicContext
Context(prec=9, rounding=ROUND_HALF_UP, Emin=-999999, Emax=999999, capitals=1, clamp=0, flags=[], traps=[Clamped, InvalidOperation, DivisionByZero, Overflow, Underflow])
>>> ExtendedContext
Context(prec=9, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999, capitals=1, clamp=0, flags=[], traps=[])
>>> DefaultContext
Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999, capitals=1, clamp=0, flags=[], traps=[InvalidOperation, DivisionByZero, Overflow])如果希望自定义,可以通过Context的构造函数
Context(prec=None, rounding=None, Emin=None, Emax=None, capitals=None, clamp=None, flags=None, traps=None)
其中
-
prec为[1, MAX_PREC]范围内的整数,用于设置精度。 -
rounding设置舍入方式。 -
Emin和Emax给定指数所允许的外部上限。Emin在 [MIN_EMIN, 0]范围内,Emax在[0, MAX_EMAX]范围内。 -
capitals默认为1,此时指数符号为大写的E,为0是用小写e。 -
traps用于设置当前上下文的警告信息。 -
clamp默认为0,如果设为 1,则指数e的表示范围在将被限制在 Emin - prec + 1 <= e <= Emax - prec + 1。 如果 clamp 为 0 则将适用较弱的条件: Decimal 实例调整后的指数最大值为 Emax。
除了getcontentext之外,还可以通过localcontext来获取当前上下文,其方法为
>>> with d.localcontext() as ctx:
... print(ctx.prec)
...
28报错与警告(signal)
在decimal中有14种警告信息(官方文档写的是10个,但源码中有14个):
除DecimalException为基类外,另外13个警告信息为
| 指数超限 |
| 无效操作 |
| 除零错误 |
| 除法发生了舍入 |
| 溢出 |
| 未定义的除法 |
| 舍入前指数低于 | ||
| 向下溢出 |
| 与float运算 |
| 发生了舍入 |
| 字符串转化不完美 |
| 不精确舍入 |
| 上下文有歧义 |
















