<< 返回目录
1 Python自学 - 类进阶(生成器)
生成器是一种特殊的迭代器,它允许在迭代过程中暂停和恢复函数的执行。生成器的特点:
-
使用
yield
返回值,而不是return
-
函数执行到
yield
时会进入暂停状态并保存状态。 -
再次执行函数时,会从上次暂停的地方继续执行。
-
使用生成器的好处
- 节省内存:生成器仅在需要时生成元素,不存储整个序列,节省内存。
- 提高性能:生成器可以生成无限序列,因为它们只在需要时生成元素。
1.1 生成器的用法
- 示例1:一个简单的生成器
def simple_generator():yield 1yield 2yield 3# 使用示例
gen = simple_generator()
print(next(gen)) # 输出: 1
print(next(gen)) # 输出: 2
print(next(gen)) # 输出: 3
# 引发 StopIteration 异常
# print(next(gen))
执行next()
函数时调用生成器。
- 示例2:生成器表达式
gen = (x * 2 for x in range(5))# 使用示例
for item in gen:print(item, end=",")
输出
0,2,4,6,8,
注意:生成器的解析使用括号()
!
- 示例3:无限序列生成器
def infinite_sequence():num = 0while True:yield numnum += 1# 使用示例
gen = infinite_sequence()
print(next(gen)) # 输出: 0
print(next(gen)) # 输出: 1
print(next(gen)) # 输出: 2
#...
#可以无限执行下去
示例中在infinite_sequence
函数中使用了死循环,这也从一个侧面说明,普通人避之不及的死循环并不是一无是处!
1.2 生成器的高级用法
生成器可以用于协同程序,实现多任务处理
def coroutine1():while True:# 接收数据data = yieldprint(f"Coroutine 1 received: {data}")# 处理数据result = data * 2# 发送结果yield resultdef coroutine2():while True:# 接收数据data = yieldprint(f"Coroutine 2 received: {data}")# 处理数据result = data + 10# 发送结果yield resultdef scheduler():c1 = coroutine1()c2 = coroutine2()# 启动协程next(c1)next(c2)data = 1while True:# 发送数据给 coroutine1result1 = c1.send(data)print(f"Coroutine 1 returned: {result1}")# 发送数据给 coroutine2result2 = c2.send(result1)print(f"Coroutine 2 returned: {result2}")data += 1if __name__ == "__main__":scheduler()
示例会无限循环处理c1, c2两个任务。send()
函数会向生成器发送数据。
作者声明:本文用于记录和分享作者的学习心得,可能有部分文字或示例来源自豆包AI,由于本人水平有限,难免存在表达错误,欢迎留言交流和指教!
Copyright © 2022~2025 All rights reserved.
<< 返回目录