python学习笔记--0601--进阶

# # 装饰器
# def outer(origin):
#     def inner(*args, **kwargs):
#         # 在函数执行前添加的,如print("before")
#         print("before")
#         res = origin(*args, **kwargs)
#         print("after")
#         return res
#
#     # 返回函数名
#     return inner
#
#
# @outer  # 在此相当于执行了 func1 = outer(func1)
# def func1(*args):
#     print(*args)
#
#
# func1(1, 2)
# func1(12)
# func1(1)

# 面向对象设计原则
# - 单一职责原则 (**S**RP)- 一个类只做该做的事情(类的设计要高内聚)
# - 开闭原则 (**O**CP)- 软件实体应该对扩展开发对修改关闭
# - 依赖倒转原则(DIP)- 面向抽象编程(在弱类型语言中已经被弱化)
# - 里氏替换原则(**L**SP) - 任何时候可以用子类对象替换掉父类对象
# - 接口隔离原则(**I**SP)- 接口要小而专不要大而全(Python中没有接口的概念)
# - 合成聚合复用原则(CARP) - 优先使用强关联关系而不是继承关系复用代码
# - 最少知识原则(迪米特法则,Lo**D**)- 不要给没有必然联系的对象发消息

# 设计模式
#
# - 创建型模式:单例、工厂、建造者、原型
# - 结构型模式:适配器、门面(外观)、代理
# - 行为型模式:迭代器、观察者、状态、策略

# # 生成器
# def fib(num):
#     """生成器"""
#     a, b = 0, 1
#     for _ in range(num):
#         a, b = b, a + b
#         yield a
#     print("done")
#     raise StopIteration()
#
#
# a = fib(5)
# print(a.__next__())
# print(a.__next__())
# print(a.__next__())
# print(a.__next__())
# print(a.__next__())

# 生成器进化为协程

# 生成器对象可以使用`send()`方法发送数据,发送的数据会成为生成器函数中通过`yield`表达式获得的值。
# 这样,生成器就可以作为协程使用,协程简单的说就是可以相互协作的子程序。
def calc_avg():
    """流式计算平均值"""
    total, counter = 0, 0
    avg_value = None
    while True:
        value = yield avg_value
        total, counter = total + value, counter + 1
        avg_value = total / counter


gen = calc_avg()
gen.__next__()
# next(gen)
print(gen.send(10))
print(gen.send(20))
print(gen.send(30))

  

posted @ 2021-06-02 11:56  菜鸡要加油  阅读(13)  评论(0编辑  收藏  举报