Python 推导式是声明式的(以及这为何重要)

发布: (2026年1月6日 GMT+8 08:48)
2 min read
原文: Dev.to

Source: Dev.to

两种方式对列表中的每个数字求平方

# Version A
squares = []
for num in numbers:
    squares.append(num ** 2)
# Version B
squares = [num ** 2 for num in numbers]

命令式 vs. 声明式

Version A 告诉 Python 如何 构建列表:

  1. 创建一个空列表。
  2. 遍历 numbers
  3. 计算平方。
  4. 将结果追加到列表。
  5. 重复上述步骤。

Version B 告诉 Python 想要什么

“给我一个每个数字的平方组成的列表。”

在阅读不是自己写的代码时,声明式写法能让意图立刻显现,而命令式写法则需要你追踪循环逻辑。

可靠性

声明式代码更不容易出错。在命令式版本中,你可能会:

  • 忘记初始化 squares = []
  • .append() 拼写成 .appnd()
  • 追加了错误的值。
  • 提前终止循环。

列表推导式消除了这些失误,因为模式已经写进了语法。

自问: “我能在一次快速阅读中理解这个推导式吗?”

推导式适用的场景

简单转换

[x ** 2 for x in numbers if x > 0]

过于复杂时(应避免)

[(x, y) for x in range(10) for y in range(10)
 if x != y and (x + y) % 2 == 0 and x ** 2 + y ** 2]

“这 一个 f(x) 值的列表。”

而不是:

“这 通过 这些步骤 变成 一个列表。”

内化这种区别有助于你自然地使用推导式——并且知道何时循环更合适。

改编自即将出版的书籍 Zero to AI Engineer: Python Foundations

我会在 Substack 上分享此类摘录 →

Back to Blog

相关文章

阅读更多 »

Python 日志:从 print() 到生产

使用 print 的问题:python printf'Processing user {user_id}' printf'Error: {e}' 缺少的内容:- 没有时间戳 - 没有日志级别 - 没有文件输出 - Can't fil...