生成器函数进阶day14

def generator():

  print(123)

  yield 1

  print(456)

  yield 2

  print(789)

g = generator()

ret = g.__next__()

print('***',ret) # 123 ,*** 1

ret = g.__next__()

print('***',ret) # 456 ,*** 2

ret = g.__next__()   #会报错,因为之后没有yield了

 

 

生成器另一种方法:

send获取下一个值的效果和next基本一致,只是在获取下一个值的时候,给上一个yield的位置传递一个数据

使用send的注意事项:

   第一次使用生成器的时候,使用next获取下一个值

  最后一个yield不能接收外部的值 

def generator():

  print(123)

  content = yield 1

  print('=======',content)

  print(456)

  yield 2

g = generator()

ret = g.__next__()

print('***',ret)  

ret = g.send('hello')   # send的效果和next一样

print('***',ret) 

============================================================================

获取移动平均值

def average():
  sum = 0
  count =0
  avg = 0

  while True:

    num = yield avg

    sum += sum

    count += 1

    avg = sum / count

    

avg_g = average()

avg_g.__next__()  #第一次使用生成器的时候,使用next获取下一个值

avg1 = avg_g.send(10)

print(avg1)  

avg = sum / count

============================================================================

生成器的装饰器

def init(func):

  def inner(*args,**kwargs):

  g = func(*args,**kwargs)

  g.__next__()

  return g

return inner 

 

@init

def average():
  sum = 0
  count =0
  avg = 0

  while True:

    num = yield avg

    sum += sum

    count += 1

    avg = sum / count

    

avg_g = average()

ret = avg_g.send(10)

print(ret)  

 

posted @ 2019-06-03 16:58  kate8Y  阅读(56)  评论(0编辑  收藏  举报