📌 前言
我们日常写 Python 处理字符串、数字、文件、数据库,但可能很少遇到 complex —— 也就是 复数 类型。
但你知道吗?Python 原生就支持复数,并且设计得相当优雅。虽然复数在 Web 开发中并不常用,但在图像处理、信号分析、数学建模、甚至 AI 领域,复数是绕不开的基本概念。
今天这篇文章,就带你系统认识 Python 中的复数(complex)类型:
- 如何使用
- 常见操作
- 应用场景
- 一些易踩的坑
💡 什么是复数?
复数是数学中的概念,形式为:
a + bj
其中:
a是实部(real part)b是虚部(imaginary part)j是虚数单位(表示 √-1)
Python 中 j 是虚数的标记(不是 i),这是借鉴了电气工程领域的表示方式。
🔧 如何在 Python 中定义复数?
Python 中定义复数的方式有两种:
z1 = 3 + 4j
z2 = complex(3, 4)
两者是等价的,z1 和 z2 都是 3 + 4j。
可以通过 .real 和 .imag 属性访问实部和虚部:
python
复制编辑
print(z1.real) # 输出 3.0
print(z1.imag) # 输出 4.0
🧮 常见复数运算
a = 2 + 3j
b = 1 - 1j
print(a + b) # (3+2j)
print(a - b) # (1+4j)
print(a * b) # (5+1j)
print(a / b) # (0.5+2.5j)
🧮 Python 中复数的乘除运算详解
在 Python 中,我们可以直接使用复数进行加减乘除等运算。例如:
a = 2 + 3j
b = 1 - 1j
print(a * b) # (5+1j)
print(a / b) # (0.5+2.5j)
你可能会好奇:为什么结果是这样的?
我们来手动推导一下。
✅ 复数乘法计算
复数乘法遵循公式:
(a+bj)(c+dj)=(ac−bd)+(ad+bc)j(a + bj)(c + dj) = (ac - bd) + (ad + bc)j(a+bj)(c+dj)=(ac−bd)+(ad+bc)j
对于 a = 2 + 3j,b = 1 - 1j:
- 实部:2×1−3×(−1)=2+3=52 \times 1 - 3 \times (-1) = 2 + 3 = 52×1−3×(−1)=2+3=5
- 虚部:2×(−1)+3×1=−2+3=12 \times (-1) + 3 \times 1 = -2 + 3 = 12×(−1)+3×1=−2+3=1
结果为:
a * b = (5 + 1j)
✅ 复数除法计算
复数除法的公式:
a+bjc+dj=(a+bj)(c−dj)(c+dj)(c−dj)\frac{a + bj}{c + dj} = \frac{(a + bj)(c - dj)}{(c + dj)(c - dj)}c+dja+bj=(c+dj)(c−dj)(a+bj)(c−dj)
相当于“有理化”分母。
我们来代入计算:
-
分子:(2+3j)(1+1j)(2 + 3j)(1 + 1j)(2+3j)(1+1j)
=2×1−3×1+(2×1+3×1)j=−1+5j= 2 \times 1 - 3 \times 1 + (2 \times 1 + 3 \times 1)j = -1 + 5j=2×1−3×1+(2×1+3×1)j=−1+5j
-
分母:(1−1j)(1+1j)=1+1=2(1 - 1j)(1 + 1j) = 1 + 1 = 2(1−1j)(1+1j)=1+1=2
所以结果是:
a/b=−1+5j2=−0.5+2.5ja / b = \frac{-1 + 5j}{2} = -0.5 + 2.5ja/b=2−1+5j=−0.5+2.5j
⚠️ 注意:你看到的 (0.5 + 2.5j) 是错误的,正确结果是:
a / b = (-0.5 + 2.5j)
🧠 总结
a = 2 + 3j
b = 1 - 1j
print(a * b) # ✅ (5 + 1j)
print(a / b) # ✅ (-0.5 + 2.5j)
Python 对复数的原生支持非常强大,适合用于工程计算、信号处理、图像变换等场景。
也可以求模和共轭:
print(abs(a)) # 模长 √(2² + 3²) = √13
print(a.conjugate()) # (2 - 3j)
🔁 和数值类型的混合运算
print((2 + 3j) + 5) # (7+3j)
print((2 + 3j) * 2.5) # (5+7.5j)
注意事项:不能直接和字符串拼接,需要显式转换:
z = 1 + 2j
print("复数是:" + str(z)) # 正确
📚 实际应用场景
虽然 Web 应用中复数不常见,但在以下场景中十分常用:
1. 图像处理(频域分析)
import numpy as np
from PIL import Image
img = np.array(Image.open("cat.jpg").convert("L"))
f = np.fft.fft2(img) # 得到频域复数矩阵
magnitude = np.abs(f) # 取模,用于可视化
2. 信号处理
在音频、雷达、无线通信中,原始信号常以复数形式存在。
# 生成复正弦信号
import numpy as np
t = np.linspace(0, 1, 1000)
signal = np.exp(2j * np.pi * 50 * t) # 频率 50Hz
3. 绘制曼德勃罗集(Mandelbrot Set)
def mandelbrot(c, max_iter):
z = 0
for n in range(max_iter):
z = z * z + c
if abs(z) > 2:
return n
return max_iter
⚠️ 注意事项:复数和 JSON / Web 格式不兼容
在 Web 应用中,如果你用 json.dumps(),你会发现:
import json
z = 1 + 2j
json.dumps(z) # TypeError: Object of type complex is not JSON serializable
需要转换成字符串或 tuple 才能处理:
json.dumps({'z': [z.real, z.imag]})
✅ 总结
| 项目 | 说明 |
|---|---|
| 类型名称 | complex |
| 构造方式 | a + bj 或 complex(a, b) |
| 属性 | .real, .imag, .conjugate() |
| 应用 | 图像频谱、信号分析、科学建模、机器学习 |
虽然我们平时写前后端交互很少接触复数,但如果你要进入更底层的 AI 推理、图像处理、或信号处理领域,复数是你迟早要掌握的一块知识。
🔗 推荐阅读
- Python 官方文档:
docs.python.org/3/library/s… - 复数数学直观教程(推荐 YouTube 或 B 站)
- 《Python 科学计算生态》:NumPy、SciPy、Matplotlib 实战
如果你觉得这篇文章对你有帮助,欢迎点赞、收藏、关注我 😄
你对复数还有什么问题?欢迎评论区一起交流!