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

时间:2019-03-26 15:00:18

标签: python-3.x

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位(AMD64)]

2 个答案:

答案 0 :(得分:1)

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

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

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

为什么会这样?因为调用myf2会调用iter,所以会返回 generator 。迭代返回的生成器时,您会收到字母。

如果您想做自己想做的事情,可以使用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']

答案 1 :(得分:0)

实际上,这会导致内存错误。

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

每次调用next的{​​{1}}方法时,都会返回iter(myf2, 'z')创建的生成器。它永远不会达到“ z”,并且永远不会结束。

您可以使用myf2

进行检查

您将收到print(type(iter(myf2, 'z')))