def generator():

  print('123')

  conten = yield 1

  print('456',content)

  yield 2

  print('789')

g = generator()

ret = g.__next__()

print(ret)

ret = g.send('hello')

print(ret)

#send 获取下一个值的效果和next基本一致

#只是在获取下一个值的时候,给上一值的位置传进一个数据

#使用send的注意事项:

  第一次使用生成器必须用next获取下一个值

  最后一个yield不能接收外部的值(send需要走一个值)(可以放一个空yield)

 

###################################

#动态计算平均值

def average():

  sum = 0

  count = 0

  avg = 0

  while True:

    num = yield avg

    sum += num

    count += 1

    avg = sum/count

 

avg_g =average()

avg_g.__next__()

avg1 = avg_g.send(10)

avg1 = avg_g.send(20)

print(avg1)

#注意send对函数执行顺序的影响

###################################

def generator():

  a = 'abcde'

  b = '12345'

  yield from a         #用于依次返回a中的值

  yield from b

 

f = generator()

for i in g:

  print(i)

 

####################################

#生成器的装饰器

def wraps(func):
def inner(*args):
set1 = func(*args)
set1.__next__()
return set1
return inner


@wraps
def average():

sum1 = 0

count = 0

avg = 0

while True:

num = yield avg

sum1 += num

count += 1

avg = sum1/count


avg_g = average()

avg1 = avg_g.send(10)

avg1 = avg_g.send(20)

print(avg1)

####################################
def check_file(filename,aim):
with open(filename, encoding='utf-8') as f:
for i in f:
if aim in i:
yield i


g = check_file('123','h')
for i in g:
print(i.strip())

#用生成器操作文件