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())
#用生成器操作文件