何时使用列表理解与 for 循环

sam*_*249 1 python list-comprehension

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

转换为推导式时,单个 for 循环很棒:

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

# [word for word in sentence]
Run Code Online (Sandbox Code Playgroud)

双人也可能是:

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

# [letter for word in sentence for letter in word]
Run Code Online (Sandbox Code Playgroud)

但是,我认为在那之后可读性变得很差。例如,使用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')]
Run Code Online (Sandbox Code Playgroud)

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

Vas*_*kis 5

答案取决于你的意见。但是,由于我确实记得一位在 Python 社区备受推崇的书的作者提出的具体建议,因此我可以分享 Luciano Ramalho 所著的《Fluent Python》一书中的以下摘录:

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

当然,滥用列表推导式编写真正难以理解的代码是可能的。我已经看到带有 listcomps 的 Python 代码只是用来重复一段代码以产生副作用。

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

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

  • 我同意这一点,唯一需要补充的是,我还没有看到提到的是:对于您需要嵌套列表理解的情况,您可以将每个步骤定义为函数以提高可读性 (3认同)