生成器 Generator 的定义
生成器(Generator)是一种特殊的函数,可以用于迭代地生成一系列值,而不需要一次性生成所有值并将它们存储在内存中。生成器在需要时逐个生成值,并在生成值后暂停执行,保留函数的状态,以便下次调用时能够从停止的地方继续执行。
生成器函数使用 yield 语句来定义,而不是常规函数中的 return 语句。当生成器函数被调用时,它返回一个生成器对象,而不是立即执行函数体。每次调用生成器对象的 next() 方法时,生成器函数将从上次执行停止的位置继续执行,直到遇到下一个 yield 语句。生成器通过生成一个值并将其返回给调用者来实现迭代。
什么是Python的生成器 Generator
上面的定义 过于官方, 理解有点困难。
通俗地讲,
- 生成器就是一种特别的迭代器(iterator)。
- 生成器的大部分使用方法是跟迭代器一样的
- 生成器代码更简洁, 而且具有临时修改当前元素的功能
一个简单的生成器例子
直接看代码:
def gen(num):
while num > 0:
yield num # return num to next() and pause the function
num -= 1
return # raise StopIteration
g = gen(5) # g is a generator object
print(next(g)) # 5
print(next(g)) # 4
print(next(g)) # 3
for i in g:
print(i) # 2 1
简单代码解释
1 到 5 行是 定义1个 生成器函数 gen()
第8行是基于生成器函数 定义了 了1个生成器对象 g
之后下面的代码就是可以把 g 当成iterator 来使用了, 遍历它的元素。
初步理解生成器函数
首先, 生成器 与 迭代器 1个明显的区别是, 迭代器是用类来定义的, 迭代器器的对象必须实现__next__ 函数
而且生成器是用 函数来定义的, 而里面的关键字就是 yield
一旦python 中某个函数 写入了 yield 这个关键字, 则代表python 不会把这个函数当作普通函数, 而且1个种特别的函数 - 生成器函数
生成器的函数的
yield 可以理解为return 返回1个值
而生成器最后的return 可不是普通 函数 return的意思, 实际是代表 raise StopIteration, 没有后面的元素的了的意思。
初步理解生成器对象
我们再看看上面例子的第8行
def gen(num):
while num > 0:
yield num # return num to next() and pause the function
num -= 1
return # raise StopIteration
g = gen(5)
g = gen(5) 如果按照一般函数的思维 g 肯定是 gen() 的返回值, 由于gen()里的return 后面是吉的, 所以 g = None 吗?
实际上, 由于gen() 里面包含关键字yield, 所以它是1个生成器函数, 所以执行这g = gen(5) 时, 实际上gen()里面的代码一句都还没开始执行。
而且上面说了, gen() 里面的return 并不是真正的return