强基初中数学&学Python——第206课 数字和数学模块之二: math数学函数(四)

  三角函数

 

  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)