数字抽象基类,Python标准库
from numbers import Number, Real, Rational, Integral
print(isinstance(1.0, Number)) # True
print(isinstance(1.0, Real)) # True
print(isinstance(1.0, Rational)) # False
print(isinstance(1.0, Integral)) # False
分数,Python标准库
from fractions import Fraction
from decimal import Decimal
from numbers import Rational
print(issubclass(Fraction, Rational)) # True Fraction直接继承Rational
print(Fraction(16, -10)) # -8/5
print(Fraction(123)) # 123/1
print(Fraction()) # 0/1
print(Fraction('3/7')) # 3/7
print(Fraction(' -3/7 ')) # -3/7
print(Fraction('1.414213 \t\n')) # 1414213/1000000
print(Fraction('-.125')) # -1/8
print(Fraction('7e-6')) # 7/1000000
print(Fraction(2.25)) # 9/4
print(Fraction(1.1)) # 2476979795053773/2251799813685248
print(Fraction("1.0")) # 1/1
print(Fraction("1.1")) # 11/10
print(Fraction(Decimal('1.1'))) # 11/10
数学函数(适用于实数范围),Python标准库,主要是基于C数学函数的封装
import math
# 向上取整
print(math.ceil(math.pi)) # 4
# 向下取整
print(math.floor(math.pi)) # 3
# 绝对值
print(math.fabs(-math.tau)) # 6.283185307179586
# 近似判断 abs(a-b) <= max(rel_tol * max(abs(a), abs(b)), abs_tol)
print(0.1 + 0.2 == 0.3,
math.isclose(0.3, 0.1 + 0.2, rel_tol=0, abs_tol=1e-6)) # False True
# 无穷
print(math.isinf(-math.inf)) # True
print(math.isinf(float('inf')), math.inf == math.inf, math.inf is math.inf) # True True True
# NaN
print(math.isnan(float('nan')), math.nan == math.nan, math.nan is math.nan) # True False True
# 欧几里得距离 sqrt(sum((px - qx) ** 2.0 for px, qx in zip(p, q)))
print(math.dist([1, 2, 3, 4], [4, 3, 2, 1])) # 4.47213595499958
数学函数(适用于复数范围),Python标准库,math的复数版本
高精度浮点计算,Python标准库
import decimal
print(decimal.Decimal('3.1415').quantize(decimal.Decimal('0.001')))
print(0.1 + 0.2 == 0.3)
print(decimal.Decimal('0.1') + decimal.Decimal('0.2') == decimal.Decimal('0.3'))
print(decimal.Decimal(0.1) + decimal.Decimal(0.2) == decimal.Decimal(0.3))
print(decimal.Decimal((1, [2, 3, 9], 3))) # 2.39E+5
print(decimal.Decimal("0.3")) # 0.3
print(decimal.Decimal(0.3)) # 0.299999999999999988897769753748434595763683319091796875
print(decimal.Decimal(1)) # 1
print(decimal.Decimal(1.75)) # 1.75 1.75是可以精确表示的
print(decimal.Decimal(decimal.Decimal(0.3))) # 0.299999999999999988897769753748434595763683319091796875
注:使用不精确的浮点数创建出的Decimal对象也是不精确的
伪随机数,Python标准库
随机数由随机数生成器生成。伪随机数通常是以固定算法作为随机数生成器,如线性同余法,通过设定初始参数(通常指随机数种子)可以稳定复现随机数序列。准随机数,与伪随机数相比,伪随机数通过了大多随机性统计校验,准随机数没有通过大多随机性统计校验。真随机数是指以物理现象作为随机数生成器,如掷骰子、核裂变等,无法稳定复现随机数序列。
import random
# 伪随机数生成器,替换默认伪随机数生成器
# 此处指定随机数种子,则每次运行下面各个结果不变
print(random.Random(random.seed(0))) #
print([random.random() for i in range(3)]) # [0.8444218515250481, 0.7579544029403025, 0.420571580830845]
# 随机字节生成
print(random.randbytes(10)) # b':^HB\xfa\xb4(\xf7\xe2\x82'
print(len(random.randbytes(10)))
# 随机整数
print(random.randint(1, 10)) # 7
print(random.randrange(1, 10, 2)) # 1
# 随机实数
print(random.random()) # 0.25891675029296335
print(random.uniform(1, 10)) # 5.601472492317477
# 序列抽样
l = [1, '2', [3]]
print(random.choice(l)) # 随机抽取一个元素
print(random.sample(l, 2)) # ['2', [3]] 随机抽取两个元素
print(random.shuffle(l)) # None 原地打乱序列
print(l) # [[3], 1, '2']
注:不应将random模块的伪随机生成器用于安全目的,可使用标准库secrets代替。
数据统计,Python标准库
import statistics
print(statistics.mean([1, 3, 2, 4, 5])) # 3 算数平均值
print(statistics.geometric_mean([1, 3, 2, 4, 5])) # 2.6051710846973517 几何平均数
print(statistics.median([1, 2, 4, 3, 5])) # 3 中位数
print(statistics.mode([1, 2, 1, 4, 5])) # 1 众数
注:由于浮点数NaN(not a number)
不大于、不小于、不等于(包括NaN
本身)任何数,或者说NaN
大于或小于任何数,NaN
与任何数或任何数与NaN
进行任何关系运算结果均为False
,会导致有NaN
值的序列排序出现问题,间接影响需要排序再计算的函数,调用该类函数之前需要先过滤掉NaN
值。
print(float('inf') > float('-inf')) # True
print(float('nan') > float('inf')) # False
print(float('nan') < float('-inf')) # False
print(float('nan') > 0) # False
print(float('nan') < 0) # False
print(float('nan') == 0) # False
print(float('nan') == float('nan')) # False
import statistics
from math import isnan
from itertools import filterfalse
data1 = [20.7, float('NaN'), 19.2, 18.3, float('NaN'), 14.4]
data2 = list(filterfalse(isnan, data1))
print(sorted(data1)) # [20.7, nan, 14.4, 18.3, 19.2, nan]
print(sorted(data2)) # [14.4, 18.3, 19.2, 20.7]
print(statistics.median(data1)) # 16.35
print(statistics.median(data2)) # 18.75
数组和矩阵运算,三方库
pip install numpy
科学计算库,三方库,依赖于NumPy
pip install scipy