python 中的 yield 存储值在哪里
where does the yield store value in python
我理解 generator
一次生成一个值,这样可以节省大量内存,而不像 list
那样将所有值都存储在内存中。
我想知道在 python
中,yield
如何知道在迭代期间应 return 编辑哪个值,而不是将所有数据一次存储在内存中?
以我的理解,如果我想使用yield
打印1 to 100
,yield
需要先知道或存储1 to 100
然后移动点一个一个到 return 值 ?
如果不是,那么如何一次 yield
return 值,而不是将所有值存储在内存中?
简单地说,yield
延迟执行但会记住它停止的地方。但是,更具体地说,当yield
被调用时,生成器函数状态中的变量被保存为"frozen"状态。当再次调用 yield
时,内置的 next
函数将要传输的数据在线发送回。如果没有更多数据要产生(因此引发 StopIteration
),存储在其 "frozen" 状态的生成器数据将被丢弃。
每次生成器 yield
s,生成器的堆栈帧都保存在生成器对象内部,因此 it can be restored when execution resumes(当请求下一个值时)。
可以看到the structure definition on CPython here.
如果你想看更多,生成器有点内省,所以你可以看看,比如说,本地人的进展,它当前所在的行号等等:
def myrange(n):
for i in range(n):
yield i
mr = myrange(10)
# Before any values consumed:
print(mr.gi_frame.f_locals) # Outputs {'n': 10}
print(mr.gi_frame.f_lineno) # Outputs 1
next(mr) # Advance one
print(mr.gi_frame.f_locals) # Outputs {'n': 10, 'i': 0}
print(mr.gi_frame.f_lineno) # Outputs 3
list(mr) # Consumes generator
print(mr.gi_frame) # Outputs None; the frame is discarded when the generator finishes
我理解 generator
一次生成一个值,这样可以节省大量内存,而不像 list
那样将所有值都存储在内存中。
我想知道在 python
中,yield
如何知道在迭代期间应 return 编辑哪个值,而不是将所有数据一次存储在内存中?
以我的理解,如果我想使用yield
打印1 to 100
,yield
需要先知道或存储1 to 100
然后移动点一个一个到 return 值 ?
如果不是,那么如何一次 yield
return 值,而不是将所有值存储在内存中?
简单地说,yield
延迟执行但会记住它停止的地方。但是,更具体地说,当yield
被调用时,生成器函数状态中的变量被保存为"frozen"状态。当再次调用 yield
时,内置的 next
函数将要传输的数据在线发送回。如果没有更多数据要产生(因此引发 StopIteration
),存储在其 "frozen" 状态的生成器数据将被丢弃。
每次生成器 yield
s,生成器的堆栈帧都保存在生成器对象内部,因此 it can be restored when execution resumes(当请求下一个值时)。
可以看到the structure definition on CPython here.
如果你想看更多,生成器有点内省,所以你可以看看,比如说,本地人的进展,它当前所在的行号等等:
def myrange(n):
for i in range(n):
yield i
mr = myrange(10)
# Before any values consumed:
print(mr.gi_frame.f_locals) # Outputs {'n': 10}
print(mr.gi_frame.f_lineno) # Outputs 1
next(mr) # Advance one
print(mr.gi_frame.f_locals) # Outputs {'n': 10, 'i': 0}
print(mr.gi_frame.f_lineno) # Outputs 3
list(mr) # Consumes generator
print(mr.gi_frame) # Outputs None; the frame is discarded when the generator finishes