数学 math
Python 的标准函数“math”提供了许多常用的数学函数,例如三角函数、四舍五入、指数、对数、平方根、总和...等,都能够透过 math 标准函数来进行运算。
本篇使用的 Python 版本为 3.7.12,所有范例可使用 Google Colab 实作,不用安装任何软件 ( 参考:使用 Google Colab )
math 常用方法
下方列出几种 math 模组常用的方法 ( 参考 Python 官方文件:math ):
| 方法 | 参数 | 说明 |
|---|---|---|
| pi、math.e | 圆周率与指数 ( 数学常数 ) | |
| ceil() | x | 无条件进位到整数 |
| floor() | x | 无条件舍去到整数 |
| copysign() | x, y | 根据 y 的正负符号,改变 x 绝对值后的正负值 |
| fabs() | x | 回传 x 的绝对值 ( 浮点数 ) |
| fmod() | x, y | 回传 x 除以 y 的余数 ( 浮点数 ) |
| fsum() | iter | 回传可迭代数值的加总 ( 浮点数 ) |
| gcd() | x, y | 回传 x 和 y 的最大公约数 |
| pow() | x, y | 回传 x 的 y 次方 |
| sqrt() | x | 回传 x 的平方根 |
| factorial() | x | 回传 x 的阶乘 ( x!,仅限正整数 ) |
| degrees()、math.radians() | x | 将角度转为弧度,或将弧度转为角度 |
| sin()、math.cos()、math.tan() | x | 回传 x 弧度的正弦值、余弦值、正切值 |
| asin()、math.acos()、math.atan() | x | 回传 x 弧度的反正弦值、反余弦值、反正切值 |
| exp() | x | 回传 e 常数的 x 次方 |
| log()、math.log1p()、math.log2()、math.log10() | x | 回传自然对数 |
| isclose() | x, y, *, rel_tol, abs_tol | 判断 x 和 y 是否够接近,回传 True 或 False |
| isfinite()、math.isinf() | x | 判断 x 是否为无限大的数字,回传 True 或 False |
| isnan() | x | 判断 x 是否为 NaN,回传 True 或 False |
import math
要使用 math 必须先 import math 模组,或使用 from 的方式,单独 import 特定的类型。
import math
from math import sin
pi、math.e
math.pi 使用后会回传圆周率的数学常数,math.e 使用后会回传指数的数学常数 ( 常数表示固定不变的数字 )。
import math
print(math.pi) # 3.141592653589793
print(math.e) # 2.718281828459045
ceil(x)
math.ceil(x) 使用后会将小数点后方的数字,无条件进位到整数,以下方的程序为例,圆周率 3.14159 无条件进位后就等于 4 ( 单纯四舍五入可使用内建函数 round,参考:round(x, y) )。
import math
pi = math.pi
print(math.ceil(pi)) # 4
floor(x)
math.floor(x) 使用后会将小数点后方的数字,无条件舍去到整数,以下方的程序为例,圆周率 3.14159 无条件舍去后就等于 3 ( 单纯四舍五入可使用内建函数 round,参考:round(x, y) )。
import math
pi = math.pi
print(math.floor(pi)) # 3
copysign(x, y)
math.copysign(x, y) 使用后,会根据 y 的正负符号,改变“x 绝对值”之后的正负值。
import math
print(math.copysign(10, -5)) # -10
print(math.copysign(-10, 9)) # 10
print(math.copysign(-10, -3)) # -10
fabs(x)
math.fabs(x) 使用后会回传 x 的绝对值,计算结果以浮点数 float 格式呈现。
import math
print(math.fabs(-10)) # 10.0
fmod(x, y)
math.fabs(x) 使用后会回传 x 除以 y 的余数,计算结果以浮点数 float 格式呈现,如果要回传整数,可使用 Python 数学计算 x % y 的语法。
import math
print(math.fmod(7,3)) # 1.0
fsum(iter)
math.fsum(iter) 使用后会回传串列或 tuple 里的数值加总,计算结果以浮点数 float 格式呈现。
import math
print(math.fsum([1,2,3,4,5])) # 15.0
print(math.fsum((1,2,3,4,5))) # 15.0
gcd(x, y)
math.gcd(x, y) 使用后会回传 x 和 y 的最大公约数 ( 同时可以整除 x 和 y 的最大整数 )。
import math
print(math.gcd(18,12)) # 6
pow(x, y)
math.pow(x, y) 会回传 x 的 y 次方,计算结果以浮点数 float 格式呈现 ( 如果需要整数,可参考内建函数 pow(x, y, z) )。
import math
print(math.pow(2, 5)) # 32.0
sqrt(x)
math.sqrt(x) 会回传 x 的平方根,计算结果以浮点数 float 格式呈现。
import math
print(math.sqrt(16)) # 4.0
factorial(x)
math.factorial(x) 会回传 x 的阶乘 ( x! ),x 只能使用正整数。
import math
print(math.factorial(5)) # 120 ( 5x4x3x2x1=120 )
degrees(x)、math.radians(x)
math.degrees(x) 将 x 弧度转换为角度,math.radians(x) 将 x 角度转换为弧度。
import math
print(math.radians(30)) # 0.5235987755982988
print(math.degrees(0.5236)) # 30.0000701530499
sin(x)、math.cos(x)、math.tan(x)
math.sin(x) 回传 x 弧度的正弦值,math.cos(x) 回传 x 弧度的余弦值,math.tan(x) 回传 x 弧度的正切值 ( 1 弧度等于 180 度/π )。
import math
r = math.radians(30) # 將 30 度轉換為弧度
print(math.sin(r)) # 0.49999999999999994
print(math.cos(r)) # 0.8660254037844387
print(math.tan(r)) # 0.5773502691896257
asin(x)、math.acos(x)、math.atan(x)
math.asin(x) 回传 x 弧度的反正弦值,math.acos(x) 回传 x 弧度的余弦值,math.atan(x) 回传 x 弧度的正切值 ( 1 弧度等于 180 度/π )。
import math
r = math.radians(30) # 將 30 度轉換為弧度
print(math.asin(r)) # 0.5510695830994463
print(math.acos(r)) # 1.0197267436954502
print(math.atan(r)) # 0.48234790710102493
exp(x)
math.exp(x) 会回传 e 常数的 x 次方。
import math
print(math.exp(2)) # 7.38905609893065
log(x)、math.log1p(x)、math.log2(x)、math.log10(x)
math.log 相关的模组,可以回传对应的自然对数。
| 自然对数模组 | 说明 |
|---|---|
| math.log(x) | 回传 x 的自然对数 ( 底为 e ) |
| math.log(x, base) | 回传 log(x)/log(base) |
| math.log1p(x) | 回传 1+x 的自然对数 ( 底为 e ) |
| math.log2(x) | 回传 x 以 2 为底的自然对数 |
| math.log10(x) | 回传 x 以 10 为底的自然对数 |
import math
print(math.log(10)) # 2.302585092994046
print(math.log(10,3)) # 2.095903274289385
print(math.log1p(10)) # 2.3978952727983707
print(math.log2(10)) # 3.321928094887362
print(math.log10(10)) # 1.0
isclose(x, y, rel_tol, abs_tol)
math.isclose 可以根据判断 x 和 y 是否够接近,“够接近”的定义在于 x 和 y 的差异是否大于某个数值,如果够接近就回传 True,否则回传 False。
下面的例子,在没有设定 rel_tol 和 abs_tol 参数的状况下,除非 x 和 y 相等,否则都是“不够接近”。
import math
print(math.isclose(3.14, 3.14)) # True
print(math.isclose(3.14000, 3.14001)) # False
rel_tol 参数定义“相对的接近范围”,公式为“x 和 y 的最大值乘以 rel_tol”,下方的例子,10 和 5 的接近范围最大是 10x0.5=5,因此如果 10-4 比 5 大,就会回传 False ( 不接近 ),同理,10 和 20 的接近范围最大会是 20x0.5=10,如果 20-9 比 10 大,就会回传 False。
import math
print(math.isclose(10, 5, rel_tol=0.5)) # True
print(math.isclose(10, 4, rel_tol=0.5)) # False
print(math.isclose(20, 10, rel_tol=0.5)) # True
print(math.isclose(20, 9, rel_tol=0.5)) # False
abs_tol 参数定义“绝对的接近范围”,公式为“x-y 的絕對值”,下方的例子,10.4-10=0.4,0.4 小于 abs_tol 定义的 0.5,表示接近,回传 True。
import math
print(math.isclose(10, 10.4, abs_tol=0.5)) # True 0.4<0.5
print(math.isclose(10, 10.6, abs_tol=0.5)) # False 0.6>0.5
isfinite(x)、math.isinf(x)
math.isfinite(x) 和 math.isinf(x) 能判断 x 是否为无限大的数字,回传 True 或 False。
import math
a = float('inf')
print(math.isfinite(a)) # False a 是無限大,回傳 False
print(math.isinf(a)) # True a 是無限大,回傳 true
isnan(x)
math.isnan(x) 能判断 x 是否为 NaN ( 非数字 ),回传 True 或 False。
import math
a = float('nan')
print(math.isnan(a)) # True
print(math.isnan(123)) # False
微信扫码关注
抖音扫码关注