普通循环和列表理解有什么区别?

What is the difference between normal loops and list comprehension?

x = 'aaaabbbccd'
new = list(itertools.groupby(x))
[print(i) for i in new]
for i in new:
    print(i)

第 2 行的结果类似于:

('a', <itertools._grouper object at 0x0000014163062EB0>)
('b', <itertools._grouper object at 0x0000014163062FD0>)
('c', <itertools._grouper object at 0x0000014163062F70>)
('d', <itertools._grouper object at 0x0000014162991BB0>)
[None, None, None, None]

普通 for 循环的结果是:

('a', <itertools._grouper object at 0x0000014163062EB0>)
('b', <itertools._grouper object at 0x0000014163062FD0>)
('c', <itertools._grouper object at 0x0000014163062F70>)
('d', <itertools._grouper object at 0x0000014162991BB0>)

为什么在列表理解的情况下我会得到额外的 [None, None, None, None]

当您在解释器中编写计算时,结果会打印回来。你的列表理解结果是'[None, None, None, None]',因为打印结果值为None,因此被打印出来。

>>> 1+1
2
>>> 2
2
>>> [1,2,3]
[1, 2, 3]
>>> [None for i in new]
[None, None, None, None]
>>>

列表理解用于理解(制作)列表。它仅在制作列表时有用。但是,这里你不是在做列表,所以不推荐使用列表理解。您只打印值而不将其存储为列表。在这里,使用 for 循环。

你得到 None 的原因是 - 列表理解基本上变成了 print() 函数的列表,如 [print(...),print(...)....]

所以当你调用它们时,它会变成 - print(print(...)),如果你尝试这段代码,将 return 一个 None 连同输出。

所以,除非你用它来构建列表,否则不要使用列表理解。

参考文献 - This and That

其原因是列表理解代码创建了一个列表,但您没有将值放入列表中,因此代码放置了 None 但在正常循环代码中没有创建列表

一般来说,列表推导在计算和编码 space 以及时间方面都比 for 循环更有效。通常,它们是用一行代码编写的。 read this article

正如文章中所演示的,我在这里引用!:

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(f""" Timed using for loop: {timeit.timeit("squares(50)", "from __main__ import squares", number = 1_000_000)}""")
print(f""" Timed using for List Comprehension: {timeit.timeit("squares_comprehension(50)", "from __main__ import squares_comprehension", number = 1_000_000)}""")

输出:

Timed using for loop: 6.206269975002215
Timed using for List Comprehension: 4.1636438860005
  • 列表推导通常不仅更具可读性,而且比使用“for 循环”更快。它们可以简化你的代码,但是如果你在里面放了太多的逻辑,它们反而会变得更难阅读和理解。

  • 尽管列表推导式在 Python 中很流行,但它们有一个特定的用例:当您想对一个列表执行某些操作并 return 另一个列表时。 它们有局限性 - 你不能打破列表理解或在里面放注释。在许多情况下,“for 循环”将是你唯一的选择。 read this article

此外,并非总是如此! 如果对计算量大的函数执行迭代,列表和 for 循环 运行时间可能差不多。 an awesome read