生成器函数和生成器对象有什么区别

What is the difference between Generator-Function and Generator-Object

在此代码中,我们必须使用 a = MyGen() 才能使用 next(a)
如果我们只使用 print (next(MyGen())) 输出将始终是第一个产量。

def MyGen():
    n=1 
    print('first')
    yield n 

    n+=1
    print('second')
    yield n

    n+=1
    print('last')
    yield n

a = MyGen()
print(next(a))
print(next(a))

print(next(MyGen()))
print(next(MyGen()))

输出:

first
1
second
2
first
1
first
1

生成器函数和生成器对象有什么区别?
以及导致此问题的生成器对象(如 a)中存储的内容?

谢谢。

类似于class vs实例: MyGen() 有点像 class,每次调用它都会创建一个新对象,从方法的开头开始。这就是每次调用 next(MyGen()) 时都会得到 first 的原因——因为它们中的每一个都是一个单独的、未命名的生成器对象。 当您将 MyGen() 分配给某个变量时,例如 a 您保留了对一个特定对象的引用,并且您可以继续对该对象调用 next(a) 以继续从上一个 yield 执行到下一个.