math模块为我们提供了很多用于数学计算的函数,而这正是Python语言的优势之一。今天就来介绍一下math库中一些常用的函数
同样地,我们首先引入math
import math
math模块
常用基本计算
trunc(x):返回整数部分
>>> math.trunc(1.1)
1
ceil(x):取 >= x的最小整数,若x为整数则返回x
>>> math.ceil(3.6)
4
>>> math.ceil(3.0)
3
>>> math.ceil(3)
3
fabs(x):绝对值
>>> math.fabs(-1)
1.0
>>> math.fabs(1)
1.0
fsum()元素求和
括号内可以是元组、列表等
>>> T = (1,2,3.5)
>>> L = [1,2,3.5]
>>>> math.fsum(T)
6.5
>>> math.fsum(L)
6.5
factorial(x):求阶乘
好久之前在某篇文里写过一个求阶乘函数,其实math库里自带阶乘
>>> math.factorial(5)
120
sqrt(x):平方根
>>> math.sqrt(3)
1.7320508075688772
以上是一些基本的常用函数,而接下来则是对math库的一些补充
数论和表示函数
我一度以为数论就是加减乘除,后来发现,是我太小学生了2333333333
copysign(x,y):把y的正负号加到x
>>> math.copysign(9,-1)
-9.0
>>> math.copysign(9,-2)
-9.0
>>> math.copysign(-9,1)
9.0
>>> math.copysign(9,0)
9.0
>>> math.copysign(9,-0)
9.0
>>> math.copysign(9,-0.0)
-9.0
这种函数会在什么时候用?
fmod(x,y):x//y
>>> math.fmod(5.2,4)
1.2000000000000002
>>> math.fmod(5.26,4)
1.2599999999999998
>>> math.fmod(5,4)
1.0
可见,在浮点数取余的时候有一些误差。在Python中,需要用到整数之间取余时用math.fmod会更好
gcd(x,y):最大公约数
>>> math.gcd(4,2)
2
modf(x):以元组返回x的小数与整数
>>> math.modf(4)
(0.0, 4.0)
>>> math.modf(5.2)
(0.20000000000000018, 5.0)
很神奇的是,这里依然是有一些误差;在前文的取余中同样有误差;用numpy矩阵计算的时候,同样有误差。
嗯,有点神奇
isclose:比较是否相近 ★
>>> math.isclose(4,4)
True
>>> math.isclose(4,4.1)
False
其实这个“相近”的范围是可以修改的。实际上,math.isclose的参数为:
(a, b, *, rel_tol=1e-09, abs_tol=0.0)在默认情况下,二者之间的容差为1 e-9
即:rel_tol = 1e-9,而这个值是可以修改的:
>>> math.isclose(4,4.1,rel_tol=0.1)
True
>>> math.isclose(4,5,rel_tol = 0.1)
False
同理,abs_tol也可以修改,实际上,这个函数的运算公式为
abs(a-b) <= max(rel_tol * max(abs(a), abs(b)), abs_tol)
(abs是求绝对值)当其成立时,返回True,否则为False。现在我们让abs_tol = 0.0(默认值),依然令rel_tol = 0.1,比较4和5
>>> math.isclose(4,5,rel_tol = 0.1,abs_tol = 0.0)
False
我们按照公式计算一下:
abs(4-5) <= max( 0.1*max(4,5) , 0.0 ),即1 <= 0.5,我们知道1是大于0.5的,所以False
现在我们把abs_tol改为1,再看返回值:
>>> math.isclose(4,5,rel_tol = 0.1,abs_tol = 1)
True
按照公式即为:1 <= 1,成立,所以True。
再令abs_tol = 0.99999也不行
>>> math.isclose(4,5,rel_tol = 0.1,abs_tol = 0.99999)
False
幂数和对数函数
常量e:math.e
吐槽一下:1,0,e,π等等等等,简直是充满了平日里各种题的各种角落,真·学到升天
>>> math.e
2.718281828459045
exp(x):e**x
>>> math.exp(1)
2.718281828459045
expm1(x):e**x - 1
expm1末尾是数字1,不是字母l
第一次看见它的时候非常蒙,我甚至以为是我版本太旧,没有它的缘故:)
>>> math.expm1(1)
1.718281828459045
嗯,果然没有expm2
>>> math.expm2(1)
AttributeError: module 'math' has no attribute 'expm2'
log(x[,base]):返回x的自然对数
若不特意声明底数的话,默认是以e为底
>>> math.log(math.e)
1.0
我们可以修改base的值,指定底数
>>> math.log(5,5)
1.0
log2(x):以2位底
据说这比log(x,2)略准确/doge
log10(x):以10为底
同样据说这比log(10,x)更准/doge
sqrt(x):平方根
虽然在前文提过了,这里再说一遍:
>>> math.sqrt(3)
1.7320508075688772
pow(x,y):x**y
>>> math.pow(2,10)
1024.0
Python其实本身也有pow函数,但是与math.pow略有区别:
>>> pow(2,10)
1024
说起来1024,在去年10月24号的时候我还特意想着当天获取这个勋章,然鹅那天我却没有想起来QAQ,相反,为了庆祝1024,我特意去实验室包了个宿:)
包宿都记得,却想不起来拿勋章…
三角函数
常量π:math.pi
>>> math.pi
3.141592653589793
sin:求正弦
>>> math.sin(math.pi/2)
1.0
>>> math.sin(math.pi)
1.2246467991473532e-16
嗯,极微小的误差:)
cos:求余弦
>>> math.cos(0)
1.0
>>> math.cos(math.pi/3)
0.5000000000000001
同样是极微小的误差:)
tan:求正切
>>> math.tan(0)
0.0
>>> math.tan(math.pi/6)
0.5773502691896257
>>> 1/math.sqrt(3)
0.5773502691896258
>>> math.tan(math.pi/2)
1.633123935319537e+16
在某种意义上,tan90又存在了
asin(x):反正切,返回值为弧度
>>> math.asin(1)
1.5707963267948966
>>> math.pi / 2
1.5707963267948966
aco(x):反余弦,返回值为弧度
>>> math.acos(0.5)
1.0471975511965979
>>> math.pi / 3
1.0471975511965976
有些误差,不过或许无伤大雅(到底是谁有误差呢)
很神奇的是,我用计算器算出来的π/3 = 1.047197551196597
不过1.0471975511966是没什么问题的。
atan(x):反正切,返回值为弧度
>>> math.atan(0)
0.0
我们把之前tan90得到的数值再带入:
>>> math.atan(1.633123935319537e+16)
1.5707963267948966
>>> math.pi / 2
1.5707963267948966
hypot(x,y):返回欧几里德范数,返回值为弧度
欧几里德范数又是啥啊
其实很好理解,就是sqrt(x2+y2)
同理,x1…xn也是依次平方求和再开根号,可是hypot只支持输入两个参数
>>> math.hypot(2,2)
2.8284271247461903
>>> math.sqrt(8)
2.8284271247461903
弧度角度转换函数
degrees:弧度转角度
>>> math.degrees(math.pi / 3)
59.99999999999999
radians:角度转弧度
>>> math.radians(60)
1.0471975511965976
>>> math.pi / 3
1.0471975511965976
双曲函数
如果我考试能用就好了:)
从这里开始,就不再用程序,直接说明以下函数的含义了
函数 | 含义 |
---|---|
sinh(x) | x的双曲正弦 |
cosh(x) | x的双曲余弦 |
tanh(x) | x的双曲正切 |
asinh(x) | x的反双曲正弦 |
acosh(x) | x的反双曲余弦 |
atanh(x) | x的反双曲正切 |
——————————
就说这些好了,马上就要到下一科了:)
得去练虚步挑掌了,老师总说我的动作不合格:(
——————————
我是康.,希望做一名能帮到各位的博主!在更新完Python系列后,根据时间安排可能会再开机器学习或者算法系列,欢迎感兴趣的小伙伴与我共同学习,一起进步!