Python之生成器进阶及推导式

生成器进阶案例
求平均值
     #移动平均值--每输入一个数求一次平均值
     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]

猜你喜欢

转载自blog.csdn.net/qq_40199698/article/details/87904771