• 功能基础篇4——Python数学计算,数字、分数、数学库、随机数、统计


    数学

    numbers

    数字抽象基类,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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    fractions

    分数,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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    math

    数学函数(适用于实数范围),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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    cmath

    数学函数(适用于复数范围),Python标准库,math的复数版本

    decimal

    高精度浮点计算,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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    注:使用不精确的浮点数创建出的Decimal对象也是不精确的

    random

    伪随机数,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']
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    注:不应将random模块的伪随机生成器用于安全目的,可使用标准库secrets代替。

    statistics

    数据统计,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 众数
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    注:由于浮点数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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    NumPy

    数组和矩阵运算,三方库

    pip install numpy
    
    • 1

    SciPy

    科学计算库,三方库,依赖于NumPy

    pip install scipy
    
    • 1
  • 相关阅读:
    使用git、git-flow与gitlab工作
    【单片机】14-I2C通信之EEPROM
    Pandas数据分析
    数据分析与取证capture.pcapng
    朋友圈营销攻略:定时发送、互动与延迟评论
    【云原生 | 从零开始学Kubernetes】二十一、kubernetes持久化存储
    iPhone NFC 设置教程(门禁卡/公交卡/校园卡等等)
    我们距离“裸眼3D自由”,还有多远?
    git pull
    功能测试人员如何做到花一个月的时间进阶自动化软件测试工程师
  • 原文地址:https://blog.csdn.net/UZDW_/article/details/133050378