ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

生成器函数进阶

2019-03-24 22:44:56  阅读:247  来源: 互联网

标签:进阶 generator 生成器 send next yield print avg 函数


 def generator():
     print(123)
     content = yield 1
     print('=======',content)
     print(456)
     arg = yield 2
     ''''''
     yield
 g1 = generator()
 g2 = generator()
 g1.__next__()
 g2.__next__()
 print('***',generator().__next__())
 print('***',generator().__next__())

 g = generator()
 ret = g.__next__()
 print('***',ret)
 ret = g.send('hello')   #send的效果和next一样
 print('***',ret)

send 获取下一个值的效果和next基本一致
只是在获取下一个值的时候,给上一yield的位置传递一个数据
使用send的注意事项
     #第一次使用生成器的时候 是用next获取下一个值
     #最后一个yield不能接受外部的值

 获取移动平均值
 10 20 30 10
 10 15 20 17.5
 avg = sum/count
 def average():
     sum = 0
     count = 0
     avg = 0
     while True:
         num = yield avg
         sum += num     #10
         count += 1     #1
         avg = sum/count

 avg_g = average()
 avg_g.__next__()
 avg1 = avg_g.send(10)
 avg1 = avg_g.send(20)
 print(avg1)

预激生成器的装饰器
 def init(func):   #装饰器
     def inner(*args,**kwargs):
         g = func(*args,**kwargs)    #g = average()
         g.__next__()
         return g
     return inner

 @init
 def average():
     sum = 0
     count = 0
     avg = 0
     while True:
         num = yield avg
         sum += num     #10
         count += 1     #1
         avg = sum/count

 avg_g = average()   #===> inner
 ret = avg_g.send(10)
 print(ret)
 ret = avg_g.send(20)
 print(ret)

python 3
 def generator():
     a = 'abcde'
     b = '12345'
     for i in a:
         yield i
     for i in b:
         yield i
 def generator():
     a = 'abcde'
     b = '12345'
     yield from a
     yield from b

 g = generator()
 for i in g:
     print(i)

 send
     send的作用范围和next一模一样
     第一次不能用send
     函数中的最后一个yield不能接受新的值

 计算移动平均值的例子
 预激生成器的装饰器的例子
 yield from






标签:进阶,generator,生成器,send,next,yield,print,avg,函数
来源: https://www.cnblogs.com/Intermittent-psychosis/p/10591038.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有