生成器理解笔记
生成器函数
# yield 和 return 不能一起使用
# 尽量不在yield后面又代码,或者在最后只加一个yield
# send函数可以在效果上和next函数一致
# 但是send在返回yield值时,还会给上一个yiedl的地方传入一个值 比如 ret = yield 123
# send不能再最后一个yield地方使用
def generator():
print(1)
yield 'a'
print(2)
yield 'b'
# 生成器函数,也是一个迭代器,可以执行__next__()和__iter()__
# 完美监听文件输出的一个小例子
def tail(filename):
f = open(filename, encoding='utf-8')
while True:
line = f.readline()
if line.strip():
# print("@@@", line)
yield line.strip() # 这里用yield,是为了方便对输出的语句进行统一的整改
g = tail("a_file")
for i in g:
print("something you want to add or change", i)
生成器实例,移动平均值
# 我们在拿到生成器后,第一步取值一定是next,所以可以做一个装饰器来激活这个生成器
def init(func):
def inner(*args, **kwargs):
ret = func(*args, **kwargs)
ret.__next__()
return ret
return inner
def avg():
count = 0
sum = 0
avg = 0
while True:
num = yield avg
sum += num
count += 1
avg = sum / count
g = avg()
avg1 = g.send(10)
print(avg1)
avg2 = g.send(12)
print(avg2)
# 一个生成器的小技巧,当函数内部的某些可迭代数据结构要分别输出的时候,可以参考以下例子
def a_generator():
a = "lala"
b = [1, 2, 3]
yield from a
yield from b