Python Generator(生成器)--yield 用法
- 迭代--一个接一个地读取列表中值的过程
1 2 3 | list1 = [ 1 , 2 , 3 ] for i in list1: print (i,end = ' ' ) |
# 1 2 3
1 2 3 | list2 = [x * x for x in range ( 5 )] for i in list2: print (i,end = ' ' ) |
# 0 1 4 9 16
上述代码当迭代次数为500万时,每一个值都需要放在内存里,非常消耗资源,为了节省内存资源,产生了Python Generator。
2. Python Generator--用多少生成多少,用完就扔掉,(只能用一次)--解决了资源消耗问题
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | #创建生成器 data_generator = (x * x for x in range ( 5 )) data_generator #<generator object <genexpr> at 0x00000168EE7BCF90> # 生成器用法 for i in data_generator: print (i ,end = ' ' ) # 0 1 4 9 16 #第二次迭代 for i in data_generator: print (i ,end = ' ' ) # #注,什么也没有 #区别列表 data_generator = [x * x for x in range ( 5 )] data_generator #[0, 1, 4, 9, 16] |
3. yield用法--- 生成器原理
yield与return类似
return expression --直接退出方法(函数),并返回expression 的值
yield也是返回值,但返回的是一个generator,generator当前值就是yield后面跟的表达式的值
每一个generator对象都有一个隐含方法.__next__() --可以单独调用,该方法的返回值就是yield后面表达式的值。
1 2 3 4 5 6 7 8 | # 输出所有不大于max的偶数 def generator_even( max ): for i in range ( 0 , max + 1 ): if i % 2 = = 0 : yield i #generator_even(10) #<generator object generator_even at 0x00000168EFB2A510> |
1 2 3 4 5 6 7 8 9 | generator_even = generator_even( 10 ) for i in generator_even: print (i,end = ' ' ) #0 2 4 6 8 10 #seconds times for i in generator_even: print (i,end = ' ' ) #什么也没有输出 |
关于容易出现的报错:--从定义的函数开始,从新跑一边
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | def generator_even( max ): for i in range ( 0 , max + 1 ): if i % 2 = = 0 : yield i even_generator = generator_even( 10 ) even_generator.__next__() # 0 even_generator.__next__() #2 even_generator.__next__() #4 even_generator.__next__() 6 even_generator.__next__() # 8 even_generator.__next__() 10 even_generator.__next__() # StopIteration: #当调用次数超过迭代次数就会出现上述异常, 应该使用 try ... except 捕获该异常 |
4.用普通函数模拟生成器
1 2 3 4 5 6 7 8 9 10 11 12 | # 普通函数模拟生成器效果 #将生成器变为普通列表 def generator_even1( max ): evens = [] for i in range ( 0 , max + 1 ): if i % 2 = = 0 : evens.append(i) # yield i return evens generator_even1( 20 ) #[0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20] |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY