生成器进阶案例
求平均值
#移动平均值--每输入一个数求一次平均值
def average():
sum = 0
count = 0
avg = 0
while 1:
num = yield avg
sum += num
count += 1
avg = sum / count
g = average()
ret = g.__next__()
FLAG = True
while FLAG:
num = input("请输入数字或q|Q:")
if num.isdigit():
num = int(num)
elif num.lower() == 'q':
FLAG = False
continue
else:
print("输入有误,请重新输入...")
continue
ret = g.send(num)
print(ret)
# 装饰器封装版
from functools import wraps
def wraper(fun):
@wraps(fun)
def expendFunc(*args,**kwargs):
g = fun()
g.__next__()
return g
return expendFunc
@wraper
def average():
sum = 0
count = 0
avg = 0
while 1:
num = yield avg
sum += num
count += 1
avg = sum / count
avg_g = average()
ret = avg_g.send(10)
print(ret)
ret = avg_g.send(20)
print(ret)
# 推导式
# ---------------列表解析-列表推导式
# lst1 = [i for i in range(10)]
# print(lst1)
# 一行输出9*9口诀表
# print('\n'.join([' '.join(["{}*{}={:0>2}".format(y,x,x*y) for y in range(1,x+1)]) for x in [x for x in range(1,10)]]))
# 30以内所有能被30整除的数
# print([i for i in range(30) if i % 3 == 0])
# ---------------生成器表达式--生成一个生成器对象,节省内存,取值时需要一个生成一个
g = (i for i in range(10))
# print(g)
# ---------------字典推导式
# 将字典的键值反转
# sdic = {'a':1,'b':2,'c':3}
# ndic = {sdic[k]:k for k in sdic}
# print(ndic)
# ---------------集合推导式--自带去重功能
# squared = {x**2 for x in [1,-1,2]}
# print(squared)
# ---------------生成器难点
# 1.生成器中的值只能取一次
# 2.生成器只有在取值时才开始运算
# def demo():
# for i in range(4):
# yield i
# g = demo() # 生成g生成器
# g1 = (i for i in g) # 生成g1生成器
# g2 = (i for i in g1) # 生成g2生成器
# print(g1,g2)
# print(list(g1)) # g1的值被取完了
# print(list(g2)) # g2生成器从g1取值已经取不到了
# [0, 1, 2, 3]
# []
# def add(n,i):
# return n+i
# def test():
# for i in range(4):
# yield i
# g = test()
# for n in [1,10,5]:
# g = (add(n,i) for i in g)
# # print(list(g))
# # n = 1
# # g = (add(n,i) for i in test())
# # n = 10
# # g = (add(n,i) for i in (add(n,i) for i in test()))
# # n = 5
# # g = (add(n,i) for i in (add(n,i) for i in (add(n,i) for i in test())))
# #
# # list(g) # 此时开始执行:n的值为5
# print(list(g)) # ==> [15, 16, 17, 18]