我必须写吗
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 生成器生命周期的细节,但是没有找到相关资源。
你不需要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)
我从未见过有人这样做。