在python中,收益率在哪里存储值

在python中,收益率在哪里存储值,python,generator,yield,Python,Generator,Yield,我知道generator一次生成一个值,这样可以节省大量内存,而不像list那样将所有值存储在内存中 我想知道在python中,yield如何知道在迭代过程中应该返回哪个值而不将所有数据一次性存储在内存中 据我所知,如果我想使用yield打印1到100,有必要yield首先知道或存储1到100,然后逐个移动点以返回值 如果没有,那么yield如何一次返回一次值,但不将所有值存储在内存中?简单地说,yield延迟执行,但记住它停止的位置。然而,更具体地说,当调用yield时,处于生成器函数状态的变

我知道
generator
一次生成一个值,这样可以节省大量内存,而不像
list
那样将所有值存储在内存中

我想知道在
python
中,
yield
如何知道在迭代过程中应该返回哪个值而不将所有数据一次性存储在内存中

据我所知,如果我想使用
yield
打印
1到100
,有必要
yield
首先知道或存储
1到100
,然后逐个移动点以返回值


如果没有,那么
yield
如何一次返回一次值,但不将所有值存储在内存中?

简单地说,
yield
延迟执行,但记住它停止的位置。然而,更具体地说,当调用
yield
时,处于生成器函数状态的变量保存在“冻结”状态。当再次调用
yield
时,内置的
next
函数发回要传输的数据。如果没有更多的数据要生成(因此会引发
StopIteration
),则将丢弃存储在其“冻结”状态的生成器数据。

每次生成器
生成时,生成器的堆栈帧都会保存在生成器对象内,因此(当请求下一个值时)

你可以看到

如果你想看到更多,生成器是有点内省的,所以你可以看看,比如说,本地进程,当前的行号,等等:

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
时暂停函数,直到值被某个对象消耗。您可以通过在生成器中添加一些
print
语句来观察它。@SilvioMayolo这与某种数据结构有关?虽然生成器的实现没有保证,但协同程序将是一种相对简单的方法,并且肯定会起到教学的作用。