标签:even __ .__ generator Python genetor 生成器 yield
- 迭代--一个接一个地读取列表中值的过程
list1=[1,2,3] for i in list1: print(i,end=' ')
# 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--用多少生成多少,用完就扔掉,(只能用一次)--解决了资源消耗问题
#创建生成器 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后面表达式的值。
# 输出所有不大于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>
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=' ') #什么也没有输出
关于容易出现的报错:--从定义的函数开始,从新跑一边
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.用普通函数模拟生成器
# 普通函数模拟生成器效果 #将生成器变为普通列表 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]
标签:even,__,.__,generator,Python,genetor,生成器,yield 来源: https://www.cnblogs.com/Monster1728/p/15864087.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。