三角函数
acos(x)
返回以弧度为单位的 x 的反余弦值。定义域[-1,1],值域[0,π]。
>>>from math import acos
>>>acos(0.0),acos(-0.0),acos(1),acos(-1)
(1.5707963267948966, 1.5707963267948966, 0.0, 3.141592653589793)
asin(x)
返回以弧度为单位的 x 的反正弦值。定义域[-1,1],值域[-π/2,π/2]。
>>>from math import asin
>>>asin(0.0),asin(-0.0),asin(1),asin(-1)
(0.0, -0.0, 1.5707963267948966, -1.5707963267948966)
atan(x)
返回以弧度为单位的 x 的反正切值。定义域[-inf,inf],值域[-π/2,π/2]。
>>>from math import atan,inf
>>>atan(0.0),atan(-0.0),atan(inf),atan(-inf)
(0.0, -0.0, 1.5707963267948966, -1.5707963267948966)
atan2(y, x)
以弧度为单位返回 atan(y / x) 。定义域[-inf,inf],值域[-π,π]。在平面直角坐标系中,是原点到点 (x, y) 的矢量与X轴正向所构成的角,逆时针为正,顺时针为负。由于atan2() 的两个参数的符号都是已知的,因此它可以计算角度的确切象限。例如, atan(1) 和 atan2(1, 1) 都是 π/4 ,但 atan2(-1, -1) 是 -3*π/4 。
>>>from math import atan2,atan,inf
>>>atan2(0, 1),atan2(0,-1),atan2(1,0),atan2(-1,0)
(0.0, 3.141592653589793, 1.5707963267948966, -1.5707963267948966)
>>>atan(1),atan2(1,1),atan2(-1,-1)
(0.7853981633974483, 0.7853981633974483, -2.356194490192345)
>>>atan2(-inf,0),atan2(inf,0)
(-1.5707963267948966, 1.5707963267948966)
>>>atan2(0,-inf),atan2(0,inf)
(3.141592653589793, 0.0)
cos(x)
返回 x 弧度的余弦值。定义域(-inf,inf),值域[-1,1]。
>>>from math import cos,pi,inf
>>>cos(0),cos(pi/2),cos(-pi/2),cos(pi),cos(-pi)
(1.0, 6.123233995736766e-17, 6.123233995736766e-17, -1.0, -1.0)
>>>cos(100*pi)
1.0
>>>cos(inf)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: math domain error
dist(p, q)
返回 p 与 q 两点之间的欧几里得距离,参数以一个坐标序列(或可迭代对象)的形式给出。两个点必须具有相同的维度(p和q的坐标长度相等)。
大致相当于:
sqrt(sum((px - qx) ** 2.0 for px, qx in zip(p, q)))
>>>from math import dist,sqrt,fsum
>>>p=(1,2,3,4,5)
>>>q=(2,4,6,8,10)
>>>sqrt(fsum((px-qx)**2.0 for px,qx in zip(p,q)))
7.416198487095663
>>>dist(p,q)
7.416198487095663
内置函数zip(*iterables, strict=False)
在多个迭代器上并行迭代,从每个迭代器返回一个数据项组成元组。可以将多个序列(列表,元组,字典,字符串以及range()区间构成的列表)打包成一个zip对象,就是将这些序列中对应的位置元素重新组合生成新元组的序列。
>>>for item in zip([1, 2, 3], ['sugar', 'spice', 'everything nice']):
... print(item)
...
(1, 'sugar')
(2, 'spice')
(3, 'everything nice')
更确切的说法:zip() 返回元组的迭代器,其中第 i 个元组包含的是每个参数迭代器的第 i 个元素。
>>>it1,it2=[1, 2, 3], ['sugar', 'spice', 'everything nice']
>>>for i in range(3):
... print((it1[i],it2[i]))
...
(1, 'sugar')
(2, 'spice')
(3, 'everything nice')
从行列的角度看zip() :它会把行变成列,把列变成行。类似于矩阵转置 。
>>>it=[[1, 2, 3], ['sugar', 'spice', 'everything nice']]
>>>it
[[1, 2, 3], ['sugar', 'spice', 'everything nice']]
>>>nit=[item for item in zip(*it)]
>>>nit
[(1, 'sugar'), (2, 'spice'), (3, 'everything nice')]
zip() 是延迟执行的:直至迭代时才会对元素进行处理,比如 for 循环或放入 list 中。也就是说,zip对象中并没有对应元素的元组。
>>>it1,it2=[1, 2, 3], ['sugar', 'spice', 'everything nice']
>>>zipObj=zip(it1,it2)
>>>it1[2]="C"
>>>for item in zipObj:
... print(item)
...
(1, 'sugar')
(2, 'spice')
('C', 'everything nice')
我们不得不考虑,如果传给 zip() 的可迭代对象可能长度不同;有时是有意为之,有时是因为生成这些对象的代码存在错误。Python 提供了三种不同的处理方案:
一、默认情况下,zip() 在最短的迭代完成后停止。较长可迭代对象中的剩余项将被忽略,结果会裁切至最短可迭代对象的长度:
>>>list(zip(range(3), ['fee', 'fi', 'fo', 'fum']))
[(0, 'fee'), (1, 'fi'), (2, 'fo')]
二、通常 zip() 用于可迭代对象等长的情况下。这时建议用 strict=True(3.10后版本才支持) 的选项。输出与普通的 zip() 相同:
>>>list(zip(('a', 'b', 'c'), (1, 2, 3), strict=True))
[('a', 1), ('b', 2), ('c', 3)]
与默认行为不同的是,它会检查可迭代对象的长度是否相同,如果不相同则触发 ValueError 。检测操作同样是延迟进行的。
>>>zipObj=zip(range(3), ['fee', 'fi', 'fo', 'fum'], strict=True)
>>>list(zipObj)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: zip() argument 2 is longer than argument 1
如果未指定 strict=True 参数,所有导致可迭代对象长度不同的错误都会被抑制,这可能会在程序的其他地方表现为难以发现的错误。
三、为了让所有的可迭代对象具有相同的长度,长度较短的可用常量进行填充。这可由 itertools.zip_longest() 来完成。
>>>from itertools import zip_longest
zip_longest
>>>list(zipObj)
[(0, 'fee'), (1, 'fi'), (2, 'fo'), (None, 'fum')]
极端例子是只有一个可迭代对象参数,zip() 会返回一个一元组的迭代器。
>>>zipObj=zip(['fee', 'fi', 'fo', 'fum'])
>>>list(zipObj)
[('fee',), ('fi',), ('fo',), ('fum',)]
如果不传入参数,则返回一个空的迭代器。
>>>zipObj=zip()
>>>list(zipObj)
[]
hypot(*coordinates)
返回欧几里得范数,sqrt(sum(x**2 for x in coordinates))。这是从原点到坐标给定点的向量长度。
对于一个二维点 (x, y),这等价于使用勾股定理(毕达哥拉斯定理)sqrt(x*x + y*y) 计算一个直角三角形的斜边。
>>>from math import hypot,sqrt,fsum
>>>coordinates=(1,2,3,4,5)
>>>sqrt(fsum(x**2 for x in coordinates))
7.416198487095663
>>>hypot(*coordinates)
7.416198487095663
>>>hypot(3,4),sqrt(3**2+4**2)
(5.0, 5.0)
sin(x)
返回 x 弧度的正弦值。定义域(-inf,inf),值域[-1,1]。
>>>from math import sin,pi,inf
>>>sin(0),sin(pi/2),sin(-pi/2),sin(pi),sin(-pi)
(0.0, 1.0, -1.0, 1.2246467991473532e-16, -1.2246467991473532e-16)
>>>sin(inf)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: math domain error
tan(x)
返回 x 弧度的正切值。定义域(-inf,inf),值域(-inf,inf)。
>>>from math import tan,pi,inf
>>>tan(0),tan(pi/2),tan(-pi/2),tan(pi),tan(-pi)
(0.0,1.633123935319537e+16,-1.633123935319537e+16,-1.2246467991473532e-16,1.2246467991473532e-16)
>>>tan(inf)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: math domain error
角度转换
degrees(x)
将弧度 x 转换为度数。定义域[-inf,inf],值域[-inf,inf]。
>>>from math import degrees,pi,inf
>>>degrees(0),degrees(pi/2),degrees(-pi/2),degrees(pi),degrees(-pi)
(0.0, 90.0, -90.0, 180.0, -180.0)
>>>degrees(-inf),degrees(inf)
(-inf, inf)
radians(x)
将角度 x 转换为弧度。定义域[-inf,inf],值域[-inf,inf]。
>>>from math import radians,inf
>>>radians(0),radians(90),radians(-90),radians(180),radians(-180)
(0.0,1.5707963267948966,-1.5707963267948966,3.141592653589793,-3.141592653589793)
>>>radians(-inf),radians(inf)
(-inf, inf)