【问题标题】:Unexpected behaviour of python comprehansion generator [duplicate]python 理解生成器的意外行为[重复]
【发布时间】:2021-08-28 07:15:12
【问题描述】:

最近我在 python 的理解生成器中遇到了一些奇怪的行为

我的代码:

with open('test.txt') as file:
    lines = (line for line in file.read().splitlines())

for line in lines:
    print(line)
for line in lines:
    print(line)

但是,我只得到一个,而不是对同一文件内容进行两次迭代:

row1
row2
row3
...

我期望的地方:

row1
row2
row3
...

row1
row2
row3
...

我在其他论坛上找不到此问题的解决方案,所以如果您知道答案,我将不胜感激:-)

编辑:这个问题是由于我对生成器的工作原理缺乏了解而发布的。我确信,一旦我完成了一个生成器的循环,我就可以根据需要再做一个又一个。对于这个问题,我深表歉意。

【问题讨论】:

  • 这是因为您使用了一次生成器,而第二个循环没有任何用处。以这种方式使用生成器根本没有任何好处,因为无论如何你都会读取内存中的整个文件内容。
  • 还有thisthisthis
  • 所有正确的答案都是对原始问题的回答,但现在我很好奇是否有办法以任何方式在同一个生成器上循环两次,或者这是不可能的

标签: python list-comprehension generator


【解决方案1】:

你应该使用列表推导而不是生成器,用方括号替换括号,比如

with open('test.txt') as file:
    lines = [line for line in file.read().splitlines()] # parenthesis replaced with square brackets

for line in lines:
    print(line)
for line in lines:
    print(line)

【讨论】:

  • 嗯,是的,但这会创建一个列表而不是生成器,我不想使用额外的空间,也不想花费额外的时间来制作我不需要的东西。除非没有解决方法,否则我想我将不得不这样做。 :-