# # 装饰器 # 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))