python - 何时使用列表推导与 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]
但是,我认为在那之后可读性变得很差。例如,使用if
s:
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
循环模式复杂性的建议,如果尝试将其放入列表理解中会更糟?
解决方案
答案取决于你的意见。然而,由于我确实记得一位在 Python 社区中广受好评的书的作者对此提出的具体建议,因此我可以分享以下来自 Luciano Ramalho 的“Fluent Python”一书的摘录:
for 循环可用于做许多不同的事情:扫描序列以计数或挑选项目、计算聚合(总和、平均值)或任何数量的其他处理任务。[...] 相比之下,listcomp 仅用于做一件事:构建一个新列表。
当然,可以滥用列表推导来编写真正难以理解的代码。我见过带有 listcomps 的 Python 代码,它只是用来重复一段代码的副作用。
如果您没有对生成的列表执行任何操作,则不应使用该语法。
另外,尽量保持简短。如果列表理解跨越两行以上,最好将其拆分或重写为普通的旧 for 循环。使用您的最佳判断:对于 Python 和对于英语,对于清晰的写作没有硬性规定。
推荐阅读
- android - 为什么我的应用程序应该只有 70mb 左右,却超过 300mb?
- automation - 如何在ansible中发送多个标准输入
- json - 如何在flutter中从动态url中获取json数据
- solr - Solr REST API - 强制 POST 替换托管资源
- graphql - GraphQL Generics Unexpected Value Type Error
- javascript - 我怎样才能不断重复第一个承诺,直到第二个承诺解决?
- mongodb - Mongodb - 在不同文档的不同字段中按相同值分组
- r - SQL:将每小时样本分块为 7 天平均值
- node.js - 在 Node.js 中使用 glob 直接获取 *(星号)的匹配值
- angular - How can I get a component instance from within an event handler in Angular?