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)]
如果您尝试迭代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']
实际上,这会给出内存错误。
list(generator)
调用next
方法,直到引发StopIteration
错误。
next
的iter(myf2, 'z')
方法每次调用时返回由myf2
创建的生成器。它永远不会达到'z',永远不会结束。
你可以用print(type(iter(myf2, 'z')))
来检查
你会收到一个MemoryError