最后在Python 3生成器中尝试

rua*_*hao 4 python generator python-3.x try-except

我遇到了一段Python 3代码:

def gen():
    try:
        while True:
            yield 1
    finally:
        print("stop")

print(next(gen()))
Run Code Online (Sandbox Code Playgroud)

运行它之后,我首先想到的输出应该是:

def gen():
    try:
        while True:
            yield 1
    finally:
        print("stop")

print(next(gen()))
Run Code Online (Sandbox Code Playgroud)

但实际上结果是:

1
Run Code Online (Sandbox Code Playgroud)

怎么会这样 引擎盖下发生了什么?

如果我运行for i in gen(): print(i),将会出现一个无限循环,这正是我所期望的。fornext这里和有什么不一样?

che*_*ner 6

当生成器关闭时循环终止,如果你不保存对它的引用,它会自动发生。一旦发生这种情况,该try语句保证finally在生成器对象被垃圾收集之前执行该块。相比:

>>> next(gen())
stop
1
Run Code Online (Sandbox Code Playgroud)

>>> x = gen()
>>> next(x)
1
Run Code Online (Sandbox Code Playgroud)


Vin*_* W. 5

对生成器对象的垃圾回收执行finally子句。

请考虑以下两种情况:

def gen():
    try:
        while True:
            yield 1
    finally:
        print("stop")

g1 = gen(); print('first time')
print(next(g1))
g2 = gen(); print('second time')  # no stop will be printed because we haven't hit the finally clause yet
Run Code Online (Sandbox Code Playgroud)
def gen():
    try:
        while True:
            yield 1
    finally:
        print("stop")

g = gen(); print('first time')
print(next(g))
g = gen(); print('second time')   # stop will be printed when the first object g was assigned to is garbage collected
Run Code Online (Sandbox Code Playgroud)