为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

当年话下 2022-08-25 15:04:04
对于何时首选列表理解而不是循环,是否有一般规则?例如: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]但是,我认为在那之后可读性会变得非常差。例如,使用 s:ifl = []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
查看完整描述

3 回答

?
繁星点点滴滴

TA贡献1803条经验 获得超3个赞

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

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

当然,滥用列表理解来编写真正难以理解的代码是可能的。我见过带有listcomps的Python代码,只是为了重复一个代码块的副作用。

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

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


查看完整回答
反对 回复 2022-08-25
?
慕妹3242003

TA贡献1824条经验 获得超6个赞

据此,可以获得性能。


import timeit


def squares(size):

    result = []

    for number in range(size):

        result.append(number*number)

    return result


def squares_comprehension(size):

    return [number*number for number in range(size)]


print(timeit.timeit("squares(50)", "from __main__ import squares", number = 1_000_000))

print(timeit.timeit("squares_comprehension(50)", "from __main__ import squares_comprehension", number = 1_000_000))


5.4292075

4.1652729000000015

希望这有帮助。


查看完整回答
反对 回复 2022-08-25
?
炎炎设计

TA贡献1808条经验 获得超4个赞

我想补充一点,你总是可以使用生成器和迭代器。没有主要的内存开销,但除非最里面的操作成本相对较高,否则性能可能会受到影响。


from itertools import chain

sentence = "flat is better than nested"


words = sentence.split()

f_words = (w for w in words if w.startswith('f'))

f_chars = chain(*f_words)

good_chars = [c for c in f_chars if c in 'abco']


查看完整回答
反对 回复 2022-08-25
  • 3 回答
  • 0 关注
  • 100 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信