我试图在Python中理解生成器并实现了这个:
def yfun():
print("into y fun ... ")
for x in range(1,6):
print("tryin to yield : {}".format(x))
yield x
yieldVar = yfun()
for val in yieldVar:
print("value generated -> ", val)
输出如下:
into y fun ...
tryin to yield : 1
value generated -> 1
tryin to yield : 2
value generated -> 2
tryin to yield : 3
value generated -> 3
tryin to yield : 4
value generated -> 4
tryin to yield : 5
value generated -> 5
您能否解释为什么一次又一次地调用该函数?是不是应该有值的变量和迭代应该在生成器变量上完成?
答案 0 :(得分:4)
该功能不再次调用您可以看到"into y fun ..."
仅打印一次这一事实。
正在发生的是通过调用包含yield
的函数得到的生成器正被for循环推进(即消耗)。
yieldVar = yfun() # call yfun and get a generator
当生成器继续产生值时,循环运行并打印您已经产生的元素。
答案 1 :(得分:1)
调用生成器函数时,将返回生成器对象。不是像普通函数那样的单个值。这是一个可用于延迟评估的对象。每个生成器对象都有一个名为__next__()
的方法。这允许Python通过调用yieldVar
多次从生成器对象 - 而不是函数 - __next__()
重复产生一个值。