2024-03-29 02:00:54 发布
网友
我知道generator一次生成一次值,这可以节省大量内存,而不像{}那样将所有值存储在内存中。在
generator
我想知道在python中,yield如何知道在迭代过程中应该返回哪个值,而不需要同时将所有数据存储在内存中?在
python
yield
在我的理解中,如果我想用yield打印1 to 100,那么{}必须首先知道或存储{},然后逐个移动点以返回值?在
1 to 100
如果不是,那么yield一次返回一次值,但不将所有值存储在内存中?在
简单地说,yield延迟了执行,但记住了它停止的地方。但是,更具体地说,当调用yield时,生成器函数状态下的变量将保存为“冻结”状态。当再次调用yield时,内置的next函数会将要传输的数据发送回行中。如果没有要生成的数据(因此引发了StopIteration),则存储在其“冻结”状态的生成器数据将被丢弃。在
next
StopIteration
每次生成器yields时,生成器的堆栈帧都保存在生成器对象中,因此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
简单地说,
yield
延迟了执行,但记住了它停止的地方。但是,更具体地说,当调用yield
时,生成器函数状态下的变量将保存为“冻结”状态。当再次调用yield
时,内置的next
函数会将要传输的数据发送回行中。如果没有要生成的数据(因此引发了StopIteration
),则存储在其“冻结”状态的生成器数据将被丢弃。在每次生成器
yield
s时,生成器的堆栈帧都保存在生成器对象中,因此it can be restored when execution resumes(当请求下一个值时)。在您可以看到the structure definition on CPython here。在
如果您想了解更多,生成器有点内省,因此您可以查看,例如,局部变量的进展,它当前的行号,等等:
相关问题 更多 >
编程相关推荐