Python中的生成器问题

时间:2017-07-14 12:22:09

标签: python python-3.x generator

我试图在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

您能否解释为什么一次又一次地调用该函数?是不是应该有值的变量和迭代应该在生成器变量上完成?

2 个答案:

答案 0 :(得分:4)

该功能再次调用您可以看到"into y fun ..."仅打印一次这一事实。

正在发生的是通过调用包含yield的函数得到的生成器正被for循环推进(即消耗)。

yieldVar = yfun()  # call yfun and get a generator

当生成器继续产生值时,循环运行并打印您已经产生的元素。

答案 1 :(得分:1)

调用生成器函数时,将返回生成器对象。不是像普通函数那样的单个值。这是一个可用于延迟评估的对象。每个生成器对象都有一个名为__next__()的方法。这允许Python通过调用yieldVar多次从生成器对象 - 而不是函数 - __next__()重复产生一个值。