我理解generator
一次生成一次值,这可以节省大量内存,而不是像list
那样将所有值存储在内存中。
我想在python
中知道yield
如何知道在迭代期间应该返回哪个值而不将所有数据一次存储在内存中?
根据我的理解,如果我想使用1 to 100
打印yield
,则yield
需要首先知道或存储1 to 100
,然后移动第一点一个返回值?
如果没有,那么yield
如何一次返回一次值,但不将所有值存储在内存中?
答案 0 :(得分:1)
简单地说,yield
会延迟执行,但会记住它停止的位置。但是,更具体地说,当调用yield
时,生成器函数状态中的变量将保存在"冻结"州。当再次调用yield
时,内置的next
函数会将数据发送回来进行传输。如果没有更多数据要生成(因此引发StopIteration
),则生成的数据存储在其"冻结"国家被抛弃了。
答案 1 :(得分:1)
每次生成器yield
时,生成器的堆栈帧都保存在生成器对象内部,因此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