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)]
答案 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')))