Python生成器是一种特殊的函数,它可以在需要时生成一系列值,而不是一次性生成所有值。生成器使用yield关键字来暂停函数的执行,并返回一个值。当函数再次被调用时,它将从yield语句停止的地方继续执行。所以生成器非常适合处理大量数据或无限序列。
- 生成器的两种用途:
- 一是调用它创建一个生成器对象,也就是生成器迭代器,然后用迭代器驱动生成器函数分部运行,产生你想要的数据;
- 二是当协程函数用,控制程序流。
- 生成器的作用:
如果想具体化数据的形式,通常会将数据存储在一个列表中。但这样做,列表的内容将占用有形内存。列表越大,占用的内存资源就越多。
但是,如果数据集有某种逻辑,就不必存储在一个列表中,只需编写一个生成器,它将在需要时生成这些值,基本不占用内存。
- 生成器存储:
是一种规则或者说方法,普通集合存储的是数据,数据量大的话,内存消耗大,但是规则几乎不占内存。
yield与return的区别:
return函数直接返回所有结果,程序终止不再运行,并销毁局部变量;yield的函数则返回一个可迭代的 generator(生成器)对象,你可以使用for循环或者调用next()方法遍历生成器对象来提取结果。
- yield from和 return yield from:
yield from是 Python 3.3 引入的一个语法,用于简化生成器中的嵌套。它可以将一个可迭代对象中的所有值逐个返回,从而避免了使用嵌套的for循环,使代码更加简洁易读。以下是一个示例代码,展示如何使用
yield from:
def generator1(): for i in range(3): yield i def generator2(): yield from generator1() for i in generator2(): print(i)代码中,
generator1和generator2都是生成器函数。generator2中使用了yield from generator1()来返回generator1生成的所有值,从而避免了使用嵌套的for循环。除了简化嵌套之外,
yield from还可以用于在协程中调用其他协程,从而实现协程的嵌套和协程之间的通信。例如,可以使用yield from将一个协程的输出作为另一个协程的输入。另外,
return yield from语句可以在生成器函数中提前结束生成器,并将最终的值作为返回值。例如:
def generator3(): yield from [1, 2, 3] return "done" g = generator3() print(next(g)) # 输出 1 print(next(g)) # 输出 2 print(g.send(4)) # 输出 3,将 4 发送给生成器 try: print(next(g)) # 抛出 StopIteration 异常,因为生成器已经结束 except StopIteration as e: print(e.value) # 输出 "done"代码中,
generator3中使用了yield from返回一个列表中的所有值,并在最后使用了return语句返回一个字符串。在使用next方法和send方法逐步获取生成器的值时,可以看到生成器在遇到return语句后提前结束,并将最终的值作为StopIteration异常的value属性返回。