完全迭代后生成器会自动关闭吗?

eom*_*eom 1 python generator

我必须写吗

def count10():
    for i in range(10):
        yield i
gen = count10()
for j in gen:
    print(j)
gen.close()
Run Code Online (Sandbox Code Playgroud)

节省内存,或者只是

def count10():
    for i in range(10):
        yield i
for j in count10():
    print(j)
Run Code Online (Sandbox Code Playgroud)

其实我很想了解 Python 生成器生命周期的细节,但是没有找到相关资源。

use*_*ica 5

你不需要close那个发电机。

close-ing 生成器不是为了节省内存。(close-ing 的事情几乎从来都不是关于节省内存。)close生成器方法背后的想法是,当生成器仍在 a tryor中间时,您可能会停止迭代它with:

def gen():
    with something_important():
        yield from range(10)

for i in gen():
    if i == 5:
        break
Run Code Online (Sandbox Code Playgroud)

close- 挂起的生成器GeneratorExit向生成器抛出异常,目的是触发finally块和上下文管理器__exit__方法。在这里,close会导致生成器运行 的__exit__方法something_important()。如果你没有像这样在中间放弃一个生成器(或者如果你的生成器没有任何finally或with块,包括在它委托给的生成器中yield from),那么close是不必要的(并且什么都不做)。

内存管理系统通常会close为您运行,但要真正确保跨 Python 实现的及时关闭,您必须替换如下代码

for thing in gen():
    ...
Run Code Online (Sandbox Code Playgroud)

和

with contextlib.closing(gen()) as generator:
    for thing in generator:
        ...
Run Code Online (Sandbox Code Playgroud)

我从未见过有人这样做。