第二十一天学Python:标准库(5)math模块常用函数

math模块为我们提供了很多用于数学计算的函数,而这正是Python语言的优势之一。今天就来介绍一下math库中一些常用的函数
同样地,我们首先引入math

import 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,而这个值是可以修改的:

扫描二维码关注公众号,回复: 11237459 查看本文章
>>> 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系列后,根据时间安排可能会再开机器学习或者算法系列,欢迎感兴趣的小伙伴与我共同学习,一起进步!

猜你喜欢

转载自blog.csdn.net/k_ksy/article/details/105962790