列表推导式是在单个表达式中通过转换和/或过滤一个可迭代对象来构建列表的一种简洁、易读的方法——是使用for循环追加到列表的Python的惯用替代方案。
基本语法
python
# the loop way:
squares = []
for n in range():
squares.append(n ** )
squares = [n ** n ()]
将其理解为"对于range(5)中的每个n,求n的平方"。它比手工编写的循环更简洁,通常也更快。
# keep only even numbers
evens = [n for n in range(10) if n % 2 == 0] # [0, 2, 4, 6, 8]
# transform AND filter together
result = [n * 2 for n in range(10) if n % 2 == 0] # [0, 4, 8, 12, 16]
# if/else goes BEFORE the for (it's part of the expression, not a filter)
labels = ["even" if n % 2 == 0 else "odd" for n in range(4)]
# ["even", "odd", "even", "odd"]
{x ** 2 for x in range(5)} # set comprehension → {0, 1, 4, 9, 16}
{k: v for k, v in pairs} # dict comprehension
(x ** 2 for x in range(5)) # generator expression — LAZY, memory-efficient
相同的语法可以构建集合和字典;加上圆括号则变成生成器表达式,它以惰性方式生成值(内存中没有完整的列表——非常适合处理大数据)。
# ❌ deeply nested / complex logic → a regular loop is more readable
matrix = [[row[i] for row in data] for i in range(cols)] # OK, but don't over-nest
保持推导式简洁;如果需要多个嵌套循环或复杂的条件判断,普通的循环会更清晰。
列表推导式是典型的"Pythonic"风格——简洁、易读,通常比等效的循环更快,在数据转换和过滤中被广泛使用。
掌握它们(包括对应的集合/字典/生成器变体,以及用于处理大数据的惰性生成器表达式)对于编写符合Python习惯的代码至关重要。
了解何时使用它们(简单的转换/过滤)而不是常规循环(复杂逻辑)是编写整洁、易读代码的标志。