首页 > 解决方案 > 何时使用列表推导与 for 循环

问题描述

当列表推导优于for循环时,是否有一般规则?例如:

转换为推导式时,单个 for 循环非常有用:

l = []
for word in sentence:
    l.append(word)

# [word for word in sentence]

双重的也可能是:

l = []
for word in sentence:
    for letter in word:
        l.append(letter)

# [letter for word in sentence for letter in word]

但是,我认为在那之后可读性变得很差。例如,使用ifs:

l = []
for word in sentence:
    if word.startswith('u'):
        for letter in word:
            if letter in ('a', 'b', 'c', 'o'):
                l.append(letter)

# [letter for word in sentence if word.startswith('u') for letter in word if letter in ('a', 'b', 'c', 'o')]

是否有关于for循环模式复杂性的建议,如果尝试将其放入列表理解中会更糟?

标签: pythonlist-comprehension

解决方案


答案取决于你的意见。然而,由于我确实记得一位在 Python 社区中广受好评的书的作者对此提出的具体建议,因此我可以分享以下来自 Luciano Ramalho 的“Fluent Python”一书的摘录:

for 循环可用于做许多不同的事情:扫描序列以计数或挑选项目、计算聚合(总和、平均值)或任何数量的其他处理任务。[...] 相比之下,listcomp 仅用于做一件事:构建一个新列表。

当然,可以滥用列表推导来编写真正难以理解的代码。我见过带有 listcomps 的 Python 代码,它只是用来重复一段代码的副作用。

如果您没有对生成的列表执行任何操作,则不应使用该语法。

另外,尽量保持简短。如果列表理解跨越两行以上,最好将其拆分或重写为普通的旧 for 循环。使用您的最佳判断:对于 Python 和对于英语,对于清晰的写作没有硬性规定。


推荐阅读