Python进阶编程:编写更高效、优雅的Python代码
上QQ阅读APP看书,第一时间看更新

1.4.3 复数运算

在实际工作中,我们有时需要用复数来执行一些运算,或者使用复数空间来解决网络认证方案遇到的难题,并且复数空间是唯一的解决办法。

复数可以由函数complex(real,imag)或者带有后缀j的浮点数来指定,相关代码(complex_exp.py)示例如下:


a = complex(2, 4)
b = 3 - 5j
print(f'complex(2, 4) is: {a}')
print(f'{b}')

执行py文件,输出结果如下:


complex(2, 4) is: (2+4j)
(3-5j)

对应的实部、虚部和共轭复数可以很容易地获取,示例(complex_exp.py)如下:


print(f'real of {a} is: {a.real}')
print(f'imag of {a} is: {a.imag}')
print(f'conjugate of {a} is: {a.conjugate()}')

执行py文件,输出结果如下:


real of (2+4j) is: 2.0
imag of (2+4j) is: 4.0
conjugate of (2+4j) is: (2-4j)

另外,可以进行所有常见的数学运算,示例(complex_exp.py)如下:


print(f'{a} + {b} = {a + b}')
print(f'{a} * {b} = {a * b}')
print(f'{a} / {b} = {a / b}')
print(f'abs({a}) = {abs(a)}')

执行py文件,输出结果如下:


(2+4j) + (3-5j) = (5-1j)
(2+4j) * (3-5j) = (26+2j)
(2+4j) / (3-5j) = (-0.4117647058823529+0.6470588235294118j)
abs((2+4j)) = 4.47213595499958

如果要计算复数的正弦值、余弦值或平方根,我们可使用cmath模块(complex_exp.py):


import cmath
print(f'cmath.sin({a}) = {cmath.sin(a)}')
print(f'cmath.cos({a}) = {cmath.cos(a)}')
print(f'cmath.exp({a}) = {cmath.exp(a)}')

执行py文件,输出结果如下:


cmath.sin((2+4j)) = (24.83130584894638-11.356612711218174j)
cmath.cos((2+4j)) = (-11.36423470640106-24.814651485634187j)
cmath.exp((2+4j)) = (-4.829809383269385-5.5920560936409816j)

Python中大部分与数学相关的模块都能处理复数。如使用numpy,可以很容易地构造一个复数数组并在这个数组上执行各种操作,相关代码(complex_exp.py)示例如下:


import numpy as np
np_a = np.array([2+3j, 4+5j, 6-7j, 8+9j])
print(f'np_a object is: {np_a}')
print(f'{np_a} + 2 = {np_a + 2}')
print(f'np.sin({np_a}) = {np.sin(np_a)}')

执行py文件,输出结果如下:


np_a object is: [2.+3.j 4.+5.j 6.-7.j 8.+9.j]
[2.+3.j 4.+5.j 6.-7.j 8.+9.j] + 2 = [ 4.+3.j  6.+5.j  8.-7.j 10.+9.j]
np.sin([2.+3.j 4.+5.j 6.-7.j 8.+9.j]) = [   9.15449915  -4.16890696j  -56.16227422 -48.50245524j-153.20827755-526.47684926j 4008.42651446-589.49948373j]

Python的标准数学函数在实际情况下并不能产生复数值,因此代码中不会出现复数返回值,相关代码(complex_exp.py)示例如下:


import math
print(math.sqrt(-1))

执行py文件,输出结果如下:


Traceback (most recent call last):
  File "/Users/lyz/Desktop/python-workspace/advanced_programming/chapter3/complex_exp.py", line 32, in <module>
    print(math.sqrt(-1))
ValueError: math domain error

如果想生成一个复数返回值,必须使用cmath模块,或者在某个支持复数的库中声明复数类型的使用,相关代码(complex_exp.py)示例如下:


print(f'cmath.sqrt(-1) = {cmath.sqrt(-1)}')

执行py文件,输出结果如下:


cmath.sqrt(-1) = 1j