Python 标准库之 Math 数学函数_pythonmath库中的数学函数-程序员宅基地

技术标签: python  数学  # Python 标准库、第三方库  Python  

封面

Python 标准库之 Math 数学函数


导入模块‍♂️

import math

math 为标准库下的模块,直接导入即可


一、Math 常量

常量部分源码
math 常量源码

1) math.pi

返回 圆周率 π = 3.141592…,精确到 小数点后 15 位

pi = math.pi

2) math.e

返回数学常数 e = 2.718281…,精确到 小数点后 15 位

e = math.e

3) math.tau

返回数学常数 τ = 6.283185…,精确到 小数点后 15 位
Tau 是一个圆周常数,等于 2π,圆的周长与半径之比。

tau = math.tau

4) math.inf

表示 浮点正无穷大 ,要表示负无穷大,得使用 -math.inf ,相当于 float(‘inf’)、float("-inf") 的输出

  • 正无穷大:inf
  • 负无穷大:-inf
Positive_infinity = math.inf
Negative_infinity = -math.inf

5) math.nan

表示 NaN : Not a Number(非数字) 代表不是一个数字,浮点数类型,相当于 float(‘nan’) 的输出,通常只用于表示缺少某些数据


二、Math 表示函数

1) math.ceil(x) 常用

返回 x 的上限值

x 为浮点数时则 向上取整,为整数时直接返回,不做任何更改

num1 = 5.668
num2 = 5
print(math.ceil(num1))   # 结果为 6
print(math.ceil(num2))   # 结果为 5

2) math.floor(x) 常用

返回 x 的向下取整

x 为浮点数时则 向下取整,为整数时直接返回,不做任何更改

num1 = 5.668
num2 = 4
print(math.floor(num1))   # 结果为 5
print(math.floor(num2))   # 结果为 4

3) math.comb(n, k)

返回 不重复且无顺序地 从 n 项中选择 k 项的方式总数
当 k <= n 时取值为『n! / (k! * (n - k)!)』,当 k > n 时取值为零。也称为二项式系数,因为它等价于表达式 (1 + x) ** n 的多项式展开中第 k 项的系数。

图解
在这里插入图片描述

print(math.comb(4, 2))     # 结果为 6

如果任一参数不为整数则会引发 TypeError,如果任一参数为负数则会引发 ValueError。

4) math.copysign(x, y)

copysign 从字面上理解,中文释义的为 “复制符号”

返回一个 基于** x 的绝对值** 和 y 的符号浮点数就是先获取 x 绝对值,再看 y 是什么符号,将 y 的符号给 x 的绝对值,x 可以是 整数 或则 浮点数,但最后返回的值为浮点数类型
在支持 带符号 零(-0) 的平台上,copysign(1.0, -0.0) 返回 -1.0

print(math.copysign(6.6, -2))    # 结果为 -6.6
print(math.copysign(6.6, 2))     # 结果为 6.6
print(math.copysign(6.6, -2.6))  # 结果为 -6.6
print(math.copysign(6.6, 2.6))   # 结果为 6.6
print(math.copysign(5, -2.6))    # 结果为 -5.0
print(math.copysign(5, 2))       # 结果为 5.0

5) math.fabs(x) 绝对值

返回 x 的绝对值,x 可以是 整数 或者 浮点数,返回的值为浮点数类型

print(math.fabs(-6))    # 结果为 6.0

6) math.factorial(x) 阶乘

以 一个整数 返回 x 的阶乘,如果 x 不是整数 或为 负数 时则将引发 ValueError

print(math.factorial(4))         # 4的阶乘为 24
print(math.factorial(5))         # 5的阶乘为 120

7) math.fmod(x, y) 取模

取模,返回除法的余数,math.fmod(x, y) 与运算符 x % y 公式相同『 x - (x / y)*x 』,但区别在 (x / y) 上的取值方式不同,x % y 将 ( x / y) 的值向下取整,而 math.fmod(x, y) 将 (x / y) 的值向0取整

图解
在这里插入图片描述

print(3 % 2)             # 结果为 1
print(math.fmod(3, 2))   # 结果为 1.0
print(-3 % 2)            # 结果为 1
print(math.fmod(-3, 2))  # 结果为 -1.0

math.fmod 返回的是浮点数类型

8) math.frexp(x)

以 (m, e) 对的形式返回 x 的 尾数指数,其算式为 『 x == m * 2**e 』 ,本质是 以 2为基数 的科学计数法, m 是一个浮点数, e 是一个整数
如果 x 为零,则返回 (0.0, 0) ,否则返回 0.5 <= abs(m) < 1

print(math.frexp(300))      # 结果为 (0.5859375, 9)
print(math.frexp(-300))     # 结果为 (-0.5859375, 9)
print(0.5859375 * 2 ** 9)   # 0.5859375为尾数,2为基数,9为指数

9) math.fsum(iterable)

iterable 为一个可迭代对象,如:列表、元组、集合,将数组内的值进行求和计算,此方法功能与 内置函数sum() 相同,但比 sum() 能获取计算精确浮点值,返回的求和值为 浮点数类型。

print(sum([0.1] * 10))        # 结果为 0.9999999999999999
print(math.fsum([0.1] * 10))  # 结果为 1.0
print(math.fsum([6, 60]))     # 结果为 66.0

10) math.gcd(a, b) 最大公约数

返回 a 和 b 的 最大公约数,a 和 b 只能是整数,gcd(0, 0) 返回 0。

print(math.gcd(18, 66))     # 结果为 6
print(math.gcd(6, 7))       # 结果为 1
print(math.gcd(0, 6))       # 结果为 6
print(math.gcd(0, 0))       # 结果为 0

11) math.isclose(a, b, rel_tol=1e-09, abs_tol=0.0)

若 a 和 b 的值 比较接近则返回 True,否则返回 False,根据给定的 绝对 和 相对 容差确定两个值是接近。

  • rel_tol 是相对容差 ,它是 a 和 b 之间允许的最大差值,相对于 a 或 b 的较大绝对值。例如,要设置5%的容差,请传递 rel_tol=0.05, rel_tol 必须大于零默认容差为 1e-09(科学计数法,即为 1 乘 10的 -9 次方)。
  • abs_tol 是最小绝对容差,对于接近零的比较很有用。 abs_tol 必须至少为零。

判断是否接近的公式为: abs(a-b) <= max(rel_tol * max(abs(a), abs(b)), abs_tol)

abs() 函数返回数字的绝对值。
max() 方法返回给定参数的最大值,参数可以为序列。

图解
在这里插入图片描述

print(math.isclose(50, 52.6, rel_tol=0.05))    # 结果为 True
print(math.isclose(50, 52.7, rel_tol=0.05))    # 结果为 False

具体来说, NaN 不被认为接近任何其他值,包括 NaN,inf 和 -inf 只被认为接近自己

print(math.isclose(math.nan, math.nan))     # 结果为 False
print(math.isclose(math.inf, math.inf))     # 结果为 True
print(math.isclose(math.inf, -math.inf))    # 结果为 False

12) math.isinf(x)

判断 x 是否为 正或负无穷大,是则返回 True ,否则返回 False

  • 正无穷大:inf
  • 负无穷大:-inf
print(math.isinf(float("inf")))  # 结果为 True
print(math.isinf(math.inf))      # 结果为 True
print(math.isinf(-math.inf))     # 结果为 True
print(math.isinf(66))            # 结果为 False

13) math.isnan(x)

判断 x 是否为 NaN,是则返回 True ,否则返回 False
NaN : Not a Number(非数字) 代表不是一个数字,浮点数类型

print(math.isnan(float("nan")))		# 结果为 True
print(math.isnan(math.nan))			# 结果为 True
print(math.isnan(6))				# 结果为 False

14) math.isfinite(x)

判断 x 是否为有限的,如果 x 既 不是无穷大不是NaN,则返回 True ,否则返回 False

print(math.isfinite(0.0))           # 结果为 True
print(math.isfinite(10 ** 100))     # 结果为 True
print(math.isfinite(float("inf")))  # 结果为 False
print(math.isfinite(math.inf))      # 结果为 False
print(math.isfinite(math.nan))      # 结果为 False

15) math.isqrt(n) 平方根

返回 非负整数 n 的 整数平方根,对 n 的实际平方根向下取整

print(math.isqrt(9))            # 结果为 3
print(math.isqrt(6))            # 结果为 2
print(math.isqrt(3))            # 结果为 1
print(1 + math.isqrt(3 - 1))    # 先上取整写法

如果 n 为负数,会抛出ValueError异常

16) math.ldexp(x, i)

返回 x * (2 ** i)浮点数值 , 这基本上是函数 frexp() 的反函数

x = 66                          
m, i = math.frexp(x)            # m为尾数,i为指数
print(math.ldexp(m, i) == x)	# 结果为 True

17) math.modf(x)

返回 x 的 小数、整数 部分的数组,相当于对小数点前后进行了拆分,返回的值都 带有 x的符号,且都是浮点数类型

x = math.modf(5.6)
print(x)                        # 小数部分存在精确不足的问题
print(round(x[0], 1), x[-1])    # 可以使用round() 解决
(0.5999999999999996, 5.0)
0.6 5.0

18) math.perm(n, k=None)

返回不重复且有顺序地从 n 项中选择 k 项的方式总数,此方法类似于 comb(),但内部算式不同
当 k <= n 时取值为 『n! / (n - k)! 』;当 k > n 时取值为零。

图解
在这里插入图片描述

print(math.comb(4, 2))  # 结果为 6
print(math.perm(4, 2))  # 结果为 12

如果 k 未指定或为 None,则 k 默认值为 n 并且函数将返回 n!(n 的阶乘)

print(math.perm(4, 4))  
print(math.perm(4))
24
24

如果任一参数不为整数则会引发 TypeError。 如果任一参数为负数则会引发 ValueError。

19) math.prod(iterable, start=1)

计算输入的 iterable 中所有元素的

  • iterable:为一个可迭代对象,如:列表、元组、集合
  • start:相当于 求得 iterable 中所有元素的积 再乘于 start,默认值为 1

类似于 内置函数 sum(iterable, start=0),将 iterable 中所有元素求和,再加上 start

print(math.prod([1, 2, 3, 4, 5, 6]))               # 结果为 720
print(math.prod([1, 2, 3, 4, 5, 6], start=0.5))    # 结果为 360.0

当可迭代对象为空时,返回起始值

print(math.prod([]))    # 结果为 1

20) math.remainder(x, y)

返回 x 相对于 y 的余数,对于有限 x 和有限非零 y ,计算公式为: x - n * y ,其中 n 为 x / y 的精确值最接近的整数 (应该是四舍五入)

print(math.remainder(3, 2))
print(math.remainder(6, 4))
print(math.remainder(6, 5))
-1.0
-2.0
1.0

remainder(x, math.inf) 对于任何有限 x 都是直接返回 x

print(math.remainder(6, math.inf))     # 结果为 6.0

remainder(x, 0) 和 remainder(math.inf, x) 引发 ValueError

21) math.trunc(x)

截取 x 的整数部分并返回

print(math.trunc(6.66666666666666666))  # 结果为6
print(math.trunc(623e-2))               # 科学计数法,实则6.23
print(math.trunc(6.0))                  # 结果为6
print(math.trunc(6))                    # 结果为6

三、Math 幂与对数

math.exp(x)

返回 e 次 x 幂,其中 e = 2.718281… 是自然对数的基数。这通常比 math.e ** x 或 pow(math.e, x) 更精确。

math.expm1(x)

返回 e 的 x 次幂,减1。这里 e 是自然对数的基数。对于小浮点数 x , exp(x) - 1 中的减法可能导致 significant loss of precision; expm1() 函数提供了一种将此数量计算为全精度的方法:

math.log(x[, base])

使用一个参数,返回 x 的自然对数(底为 e )。

使用两个参数,返回给定的 base 的对数 x ,计算为 log(x)/log(base) 。

math.log1p(x)

返回 1+x (base e) 的自然对数。以对于接近零的 x 精确的方式计算结果。

math.log2(x)

返回 x 以2为底的对数。这通常比 log(x, 2) 更准确。

math.log10(x)

返回 x 底为10的对数。这通常比 log(x, 10) 更准确。

math.pow(x, y)

将返回 x 的 y 次幂。特殊情况尽可能遵循C99标准的附录’F’。特别是, pow(1.0, x) 和 pow(x, 0.0) 总是返回 1.0 ,即使 x 是零或NaN。 如果 x 和 y 都是有限的, x 是负数, y 不是整数那么 pow(x, y) 是未定义的,并且引发 ValueError 。

与内置的 ** 运算符不同, math.pow() 将其参数转换为 float 类型。使用 ** 或内置的 pow() 函数来计算精确的整数幂。

math.sqrt(x)

返回 x 的平方根。


四、Math 三角函数

math.acos(x)

以弧度为单位返回 x 的反余弦值。

math.asin(x)

以弧度为单位返回 x 的反正弦值。

math.atan(x)

以弧度为单位返回 x 的反正切值。

math.atan2(y, x)

以弧度为单位返回 atan(y / x) 。结果是在 -pi 和 pi 之间。从原点到点 (x, y) 的平面矢量使该角度与正X轴成正比。 atan2() 的点的两个输入的符号都是已知的,因此它可以计算角度的正确象限。 例如, atan(1) 和 atan2(1, 1) 都是 pi/4 ,但 atan2(-1, -1) 是 -3*pi/4 。

math.cos(x)

返回 x 弧度的余弦值。

math.dist(p, q)

返回 p 与 q 两点之间的欧几里得距离,以一个坐标序列(或可迭代对象)的形式给出。 两个点必须具有相同的维度。


相关博客

Python 计算平方根

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/XianZhe_/article/details/114381614

智能推荐

conda配置jupyter密码并远程访问_conda安装jupyter notebook设置密码-程序员宅基地

文章浏览阅读664次。改了这些配置,发现还是连不上。于是:2. 生成jupyter配置文件此时会提示生成一个文件在 进入python环境后输入会提示输入密码(自己随意设置一个就好,记下来,一会会用到),确认密码,之后会返回一个序列在这里密码记为‘shal:5d429542e711…’打开刚刚生成的文件 (注意它在隐藏目录.jupyter/里)在末尾加上4. 启动jupyter输入命令建议在根目录(如/home/name/)下输入例如会显示注意红色框出了返回的一个地址,这个地址6000代表刚刚设置的_conda安装jupyter notebook设置密码

ubantu 下载慢的解决方法_unbtunxiazaiman-程序员宅基地

文章浏览阅读158次。参考此链接:https://zhuanlan.zhihu.com/p/61228593_unbtunxiazaiman

Window环境下卸载Python3.6_wsl remove python-程序员宅基地

文章浏览阅读7.5w次,点赞15次,收藏6次。python3.6在安装后,在安装目录下并没有对应的unstall程序,为了删除python3.6,可以重新执行安装文件,这时候安装程序中会多出一个unstall的选项,选择unstall即可顺利卸载python。_wsl remove python

修改el-radio的选中样式_el-radio选中样式-程序员宅基地

文章浏览阅读1.7k次。修改el-radio的选中样式_el-radio选中样式

一份操作系统词典_如果与用户的链接相对较近,则可以将其指定为-程序员宅基地

文章浏览阅读705次。菜鸟教程来源:Java建设者(id:javajianshe)作者:cxuan1. 操作系统(Operating System,OS):是管理计算机硬件与软件资源的系统软件,同时也是计算机系统的内核与基石。操作系统需要处理管理与配置内存、决定系统资源供需的优先次序、控制输入与输出设备、操作网络与管理文件系统等基本事务。操作系统也提供一个让用户与系统交互的操作界面。2. shel..._如果与用户的链接相对较近,则可以将其指定为

delphi 通过ip链接oracle,delphi怎么连接oracle(服务器在本地IP:127.0.0.1)-程序员宅基地

文章浏览阅读249次。delphi怎么连接oracle(服务器在本地IP:127.0.0.1) Delphi / Windows SDK/APIhttp://www.delphi2007.net/DelphiDB/html/delphi_20061218083334247.html如题。找了些远程服务器的文档来看,可怎么也不对呀SID:myoracle你用ADO还是用ODAC连接oracle数据库呀用ADO:第一步:...

随便推点

AI:忧郁的机器人_阿斯特云ai机器人引擎-程序员宅基地

文章浏览阅读855次。1、塔奇克马2、机器人瓦力3.马文http://www.guokr.com/post/683881/_阿斯特云ai机器人引擎

21个项目玩儿转Tensorflow的BUG记录_the backend was *originally* set to 'qt5agg' by th-程序员宅基地

文章浏览阅读1.1k次,点赞4次,收藏8次。21个项目玩儿转Tensorflow的BUG记录使用环境win10+Python3.6+Tensorflow1.4。BUG历程第三章,运行data_convert.py出现错误:Traceback (most recent call last): File "E:/03personal/DeepLearning/03IMG/data_prepare/data_convert.py", ..._the backend was *originally* set to 'qt5agg' by the following code:

浅谈ACL(访问控制列表)_acl模型的缺点-程序员宅基地

文章浏览阅读1.5k次。ACL(访问控制列表)是应用在路由器接口的指令列表。这些指令列表用来告诉路由器,那些数据包可以接收,那些数据包需要拒绝。基本原理为:ACL使用包过滤技术,在路由器上读取OSI七层模型的第三层及第四层包头中的信息,如源地址、目的地址、源端口、目的端口等,根据预先定义好的规则,对包进行过滤,从而达到访问控制的目的。ACL通过在路由器接口处控制数据包是转发还是丢弃来过滤通信流量。路由器根据ACL中..._acl模型的缺点

selenium.common.exceptions.ElementNotInteractableException: Message: element not interactable_"by.css_selector, \"[.el-message__content]"-程序员宅基地

文章浏览阅读7.2k次。selenium.common.exceptions.ElementNotInteractableException: Message: element not interactable改:click_all = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'.m-fastfilter button:first-child')))为:click_all = wait.until(EC.element_to_be_clicka_"by.css_selector, \"[.el-message__content]"

Scratch 二次开发定制 - Python代码生成-程序员宅基地

文章浏览阅读4.4k次,点赞4次,收藏20次。最近半年Scratch官网发生了一些众所周知的情况,但是这个软件本身还是很优秀的。少儿图形化编程的主流还是Scratch。但是我们还是决定改个名字,叫Kidsline,意为 “孩子的代码”。对软件的二次开发仍然只是 “微调”,尽可能原汁原味,同时带一点点不经意的惊喜。关于二次开发的技术细节,可以参考我之前的文章。就我们收集的信息来看,原版软件字体太小是个核心痛点,此次升级对字体也做了更统一的优化,同时增加了Python代码的生成,孩子在学习时可以参考。整个软件就是站在各个巨人的肩膀上完成的,Kidsl

[golang]-mac安装beego1.11_go install beego1.11-程序员宅基地

文章浏览阅读229次。mac 安装beego1.11go1.13.9 事先已经安装好beego1.11安装beego env -w GO111MODULE=ongo env -w GOPROXY=https://goproxy.cn,directgo get -u github.com/astaxie/beegogo get -u github.com/beego/bee过程如下 go/bin下面有bee了# 加入环境变量cp ~/.zshrc ~/.zshrc.bakecho 'expor_go install beego1.11

推荐文章

热门文章

相关标签