推导式(comprehension)(最早在控制流中介绍) 可以用一个表达式,从一个 collection 构造出另一个 collection。 这个思想源于数学里的集合构造式(set-builder notation), 后来进入函数式编程。 Haskell 有 list comprehension,Python 又从那里借用了它。

理解推导式需要稍微改变思考方式。 使用 loop 时,你描述的是“如何构造结果”:先创建空 list, 遍历输入,检查每个 item,再 append 想保留的 item。 使用 comprehension 时,你用一个表达式描述“结果是什么”, 然后让 Python 自己去构建它。 comprehension 更短。 它读起来更像结果的定义,而不是构造结果的步骤清单, 一行就能替换多行循环 bookkeeping。

列表推导式

一个 list comprehension 包含:

本章多个例子都使用同一个输入 list:

# a_list.py
a_list = [1, "4", 9, "a", 0, 4]

下面的 list comprehension 从这个 list 中选择整数,并对它们求平方:

# list_comprehension.py
from a_list import a_list

squared_ints = [
    e ** 2 for e in a_list if isinstance(e, int)]
print(squared_ints)
#: [1, 81, 0, 16]

列表推导式的各个组成部分

列表推导式的各个组成部分

列表推导式的各个组成部分

在这个 comprehension 中: