为什么yield + iter()不产生输出?

问题描述 投票:2回答:2
def myf2():
    for x in "abzdef":
        yield x


#print(list(myf2()))

print(list(iter(myf2,'z')))

我期待['a','b']但是在https://repl.it/languages/python3我得到一个等待光标返回之前没有输出。 Python 3.6.3 | Anaconda自定义(64位)| (默认,2017年10月15日,03:27:45)[MSC v.1900 64 bit(AMD64)]

python-3.x
2个回答
1
投票

如果您尝试迭代iter的返回,您可以看到问题:

for x in iter(myf2, 'z'):
    print(x)

这将打印出无限的生成器对象,而不是字母。这是问题所在。 list将花费无限的时间来评估无限列表(或者,至少与内存错误崩溃所花费的时间)。

为什么会这样?因为调用myf2所做的iter会返回一个生成器。当您迭代返回的生成器时,您将获得这些字母。

如果你想做你想做的事,你可以使用itertool的takewhile

from itertools import takewhile

def myf2():
    for x in "abzdef":
        yield x


gen = myf2()
print(list(takewhile(lambda x: x != 'z', gen)))

# ['a', 'b']

0
投票

实际上,这会给出内存错误。

list(generator)调用next方法,直到引发StopIteration错误。

nextiter(myf2, 'z')方法每次调用时返回由myf2创建的生成器。它永远不会达到'z',永远不会结束。

你可以用print(type(iter(myf2, 'z')))来检查

你会收到一个MemoryError

© www.soinside.com 2019 - 2024. All rights reserved.