13.python(库)数学函数 math

1.介绍

数学计算模块主要包括random、math、statistics三个模块,每个模块的负责区域
random: 用于生成各类随机数;
math: 提供了许多数学运算函数,返回值一般都是浮点数;
statistics: 用于数据统计计算;

2. random:随机

2.1 随机数

import random

if __name__ == '__main__':
    print("生成随机整数( 1 =< X <= 100 ):", random.randint(1, 100))
    # 返回 [0.0, 1.0) 范围内的下一个随机浮点数。
    print("生成随机浮点数( 0.0 <= X < 1.0 ):", random.random())
    print("生成随机浮点数( 1 =< X <= 10 ):", random.uniform(1, 10))
    print("从[0,2,4,6,8]随机生成:", random.randrange(0, 10, 2))
    
# -------------------------------- 输出 --------------------------------   
生成随机整数( 1 =< X <= 100 ): 40
生成随机浮点数( 0.0 <= X < 1.0 ): 0.6337783120322614
生成随机浮点数( 1 =< X <= 10 ): 1.0035531015062091
从[0,2,4,6,8]随机生成: 4

random.randrange([start], stop[, step]),从指定范围内,按指定基数递增的集合中 获取一个随机数;

2.2 列表相关

import random

if __name__ == '__main__':
    list_var = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    print("----------------------random.choice:随机取一个----------------------")
    # 随机取出一个元素
    print("从列表{}中,随机取出一个元素:{}".format(list_var, random.choice(list_var)))

    print("----------------------random.sample:随机取多个----------------------")
    # 随机取出多个元素
    print("从列表{}中,随机取出3个元素:{}".format(list_var, random.sample(list_var, 3)))

    # 打乱列表
    print("----------------------random.shuffle:打乱列表----------------------")
    print("打乱前:", list_var)
    random.shuffle(list_var)
    print("打乱后:", list_var)
    
# ----------------- 输出 --------------------------------   
----------------------random.choice:随机取一个----------------------
从列表[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]中,随机取出一个元素:5
----------------------random.sample:随机取多个----------------------
从列表[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]中,随机取出3个元素:[1, 4, 6]
----------------------random.shuffle:打乱列表----------------------
打乱前: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
打乱后: [1, 9, 5, 4, 8, 7, 2, 3, 10, 6]

更多使用访问,可查看官方文档:https://docs.python.org/zh-cn/3/library/random.html

3.math:数学计算

函数名 函数内容
math.ceil(x) 向上取整,返回 x 的上限,即大于或者等于 x 的最小整数
math.floor(x) 返回 x 的向下取整,小于或等于 x 的最大整数,返回整数
math.trunc(x) 返回去除小数部分的 x ,只留下整数部分,对于正的 x 相当于floor,对于负的 x 相当于ceil
math.comb(n, k) 返回不重复且无顺序地从 n 项中选择 k 项的方式总数,等同于C(n,k),n! / (k! * (n - k)!),n, k均为正整数
math.perm(n, k) 返回不重复且有顺序地从 n 项中选择 k 项的方式总数,等同于A(n,k),n! / (n-k)!
math.copysign(x, y) 返回一个基于 x 的绝对值和 y 的符号的浮点数,math.copysign(3, -0.1) = -3.0
math.fabs(x) 返回 x 的绝对值的浮点数,abs函数返回浮点或者整数
math.factorial(x) 以一个整数返回 x 的阶乘
math.fmod(x, y) 对浮点数求模,即求x除以y后的余数,结果为浮点型,与%区别见下
math.fsum(x) 返回迭代中的精确浮点值。通过跟踪多个中间部分和来避免精度损失,sum([.1, .1, .1, .1, .1, .1, .1, .1, .1, .1]) 0.9999999999999999,math.sum([.1, .1, .1, .1, .1, .1, .1, .1, .1, .1]) 1
math.modf(x) 返回 x 的小数和整数部分,以元组的形式储存
math.sqrt(x) 返回 x 的平方根
math.isqrt(n) 返回非负整数 n 的整数平方根
math.prod(iterable, *, start=1) 计算输入的 iterable 中所有元素的积, 积的默认 start 值为 1math.prod([5,10,11],start=2) 1100
math.pow(x, y) 返回 x 的 y 次幂
math.exp(x) 返回 e 次 x 幂
math.expm1(x) 返回 e 的 x 次幂,减1
math.log(x[, base]) 使用一个参数,返回 x 的自然对数(底为 e ) ,使用两个参数,返回给定的 base 的对数 x ,计算为 log(x)/log(base)
math.log1p(x) 返回 1+x (以e为底) 的自然对数,结果为浮点型
math.log2(x) 返回 x 以2为底的对数,这通常比 log(x, 2) 更准确,结果为浮点型
math.log10(x) 返回 x 底为10的对数。这通常比 log(x, 10) 更准确,结果为浮点型
math.gcd(a, b) 返回整数 a 和 b 的最大公约数
math.lcm(a, b) 返回整数 a 和 b 的最小公倍数
math.isfinite(x) 如果 x 既不是无穷大也不是NaN,则返回 True ,否则返回 False
math.isinf(x) 如果 x 是正或负无穷大,则返回 True ,否则返回 False
math.isnan(x) 如果 x 是 NaN(不是数字),则返回 True ,否则返回 False
math.sin(x) 返回 x 弧度的正弦值 sin30°(1度=π/180)
math.tan(x) 返回 x 弧度的正切值tan30°(1度=π/180)
math.cos(x) 返回 x 弧度的余弦值cos30°(1度=π/180)
math.acos(x) 以弧度为单位返回 x 的反余弦值, 结果范围在 0 到 pi 之间。(1度=π/180)
math.asin(x) 以弧度为单位返回 x 的反正弦值, 结果范围在 -pi/2 到 pi/2 之间(1度=π/180)
math.atan(x) 以弧度为单位返回 x 的反正切值,结果范围在 -pi/2 到 pi/2 之间
math.atan2(y, x) 以弧度为单位返回 atan(y / x),结果范围在 -pi/2 到 pi/2 之间
math.dist(p, q) 返回 p 与 q 两点之间的欧几里得距离,以一个坐标序列(或可迭代对象)的形式给出。 两个点必须具有相同的维度
math.degrees(x) 将角度 x 从弧度转换为度数
math.radians(x) 将角度 x 从度数转换为弧度
math.acosh(x) 返回 x 的反双曲余弦值
math.asinh(x) 返回 x 的反双曲正弦值
math.atanh(x) 返回 x 的反双曲正切值
math.cosh(x) 返回 x 的双曲余弦值
math.sinh(x) 返回 x 的双曲正弦值
math.tanh(x) 返回 x 的双曲正切值
math.gamma(x) 返回 x 处的 伽马函数 值。
math.lgamma(x) 返回Gamma函数在 x 绝对值的自然对数。
函数名 函数内容
math.pi 数学常数 π = 3.141592...,精确到可用精度。
math.e 数学常数 e = 2.718281...,精确到可用精度
math.tau 数学常数 τ = 6.283185...,精确到可用精度。Tau 是一个圆周常数,等于 2π,圆的周长与半径之比
math.inf 浮点正无穷大
math.nan 一个浮点的 "非数字"(NaN)值,相当于 float('nan') 的输出

math.fmod函数与“%”求模运算符(如:x % y)的区别

如下:
前者始终返回浮点数;后者在x、y均为整型时,返回整型,其他情况下,即x、y任有一浮点型时,结果均返回浮点型。
前者返回结果的符号(正负)始终与x相同;后者所得结果的符号(正负)始终与y相同。
前者返回结果的绝对值始终等于“|x| % |y|”;对于后者,若x与y符号(正负)相同,结果的绝对值为“|x| % |y|”,若x与y的符号(正负)不同,结果的绝对值为“|y| - (|x| % |y|)”

math.fmod( 15,  4),  15 %  4 = 3.0 3
math.fmod(-15,  4), -15 %  4 = -3.0 1
math.fmod( 15, -4),  15 % -4 = 3.0 -1
math.fmod(-15, -4), -15 % -4 = -3.0 -3

需要注意的是:当采用“%”求模运算符,且出现上述“|y| - (|x| % |y|)”这种情况时(即x与y的符号不同),若同时还符合下面两个条件:
|x|远小于|y|;
x与y中至少有一个是浮点数(只有浮点数才会导致精度损失)。
此时,导致(|x| % |y|)的值相对非常小(即等于|x|),而因为|y|相对又非常的大,加上计算机对浮点数计算精度的损失,会出现“|y| - (|x| % |y|)”的最终结果被截取成为“|y|”的奇怪现象,如下所示。

“%”求模运算符的异常情况:     -0.0000000001 % 10000000 = 10000000.0 (相当于结果直接等于第2个数了)
采用fmod求模,正常:math.fmod(-0.0000000001, 10000000) =  -1e-10 (结果等于第1个数)
“%”求模运算符的异常情况: 10   % -10000000000000000000000.0 = -1e+22 (相当于结果直接等于第2个数了)
“%”求模运算符的异常情况:-10.0 %  10000000000000000000000   = 1e+22 (相当于结果直接等于第2个数了)
“%”求模运算符,正常:    10    % -10000000000000000000000   = -9999999999999999999990
“%”求模运算符,正常: , -10    %  10000000000000000000000   = 9999999999999999999990

4. statistics: 数学统计

import statistics

if __name__ == '__main__':
    print("---------------------------求平均数------------------------------------")
    print("求[1,2,3,4,5.5]平均数:", statistics.mean([1, 2, 3, 4, 5.5]))
    # fmean 运行速度比mean快
    print("求[1,2,3,4,5.5]平均数:", statistics.fmean([1, 2, 3, 4, 5.5]))
    print("---------------------------求中位数------------------------------------")
    # 取中位数
    print("求[1, 2, 3]中位数:", statistics.median([1, 2, 3]))
    # 总数为偶数时,中位数将通过对两个中间值求平均
    print("求[1, 2, 3, 4]中位数:", statistics.median([1, 2, 3, 4]))
    # 总数为偶数时,将返回两个中间值中较小的那个
    print("求[1, 2, 3, 4]中位数:", statistics.median_low([1, 2, 3, 4]))
    # 总数为偶数时,将返回两个中间值中较大的那个
    print("求[1, 2, 3, 4]中位数:", statistics.median_high([1, 2, 3, 4]))
    print("---------------------------求频繁数------------------------------------")
    # 只取一个
    print("求[1,2,3,4,4]经常出现数:", statistics.mode([1, 2,  3, 4, 4]))
    print("求'abbbccc'经常出现数:", statistics.mode('abbbccc'))
    # 取多个
    print("求[1,2,3,3,4,4]经常出现数:", statistics.multimode([1, 2, 3, 3, 4, 4]))
    print("求'abbbccc'经常出现数:", statistics.multimode('abbbccc'))
    
#################################### 输出 ####################################
---------------------------求平均数------------------------------------
求[1,2,3,4,5.5]平均数: 3.1
求[1,2,3,4,5.5]平均数: 3.1
---------------------------求中位数------------------------------------
求[1, 2, 3]中位数: 2
求[1, 2, 3, 4]中位数: 2.5
求[1, 2, 3, 4]中位数: 2
求[1, 2, 3, 4]中位数: 3
---------------------------求频繁数------------------------------------
求[1,2,3,4,4]经常出现数: 4
求'abbbccc'经常出现数: b
求[1,2,3,3,4,4]经常出现数: [3, 4]
求'abbbccc'经常出现数: ['b', 'c']
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,444评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,421评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,363评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,460评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,502评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,511评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,280评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,736评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,014评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,190评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,848评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,531评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,159评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,411评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,067评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,078评论 2 352

推荐阅读更多精彩内容