🌪️ 彻底搞懂 Python 的复数(`complex`)类型:从入门到实践

1,063 阅读4分钟

📌 前言

我们日常写 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)

两者是等价的,z1z2 都是 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 + 3jb = 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 + bjcomplex(a, b)
属性.real, .imag, .conjugate()
应用图像频谱、信号分析、科学建模、机器学习

虽然我们平时写前后端交互很少接触复数,但如果你要进入更底层的 AI 推理、图像处理、或信号处理领域,复数是你迟早要掌握的一块知识。


🔗 推荐阅读

  • Python 官方文档:
    docs.python.org/3/library/s…
  • 复数数学直观教程(推荐 YouTube 或 B 站)
  • 《Python 科学计算生态》:NumPy、SciPy、Matplotlib 实战

如果你觉得这篇文章对你有帮助,欢迎点赞、收藏、关注我 😄
你对复数还有什么问题?欢迎评论区一起交流!