装饰器&递归
装饰器
1.开放封闭原则
在源码不改变的情况下,增加一些额外的功能
对扩展是开放的,对修改是封闭的
1.1 开放原则:增加额外新功能
1.2 封闭原则:不要改变源码
2 装饰器
满足开放封闭原则,在不改变原函数代码及调用方式的前提下,增加新功能
# 基本装饰器
def wrapper(func): # 1
def inner(*args): # 这里的* 是聚合 ## 5
ret = func(*args) # 这里的* 是打散 ## 6
return ret # 7
return inner
@wrapper # 2 func1 = wrapper(func1) 所以运行到这一步 wrapper函数执行
def func1(*args): # 3
... # 6
func1() # 4
语法糖的作用
# 标准版的装饰器
@a
def b():
pass
# 语法糖的那行 就等价于 b = a(b) 把那一行换成这一行 是一样的 所以这是执行操作,和下面调用没关系
## 带参数的装饰器
@c(1)
def b():
pass
## 这个有两行操作 a = c(1) b = a(b)
带参数装饰器
## 当装饰器装饰两个以上验证方式又不相同的函数时,就用到了带参数的装饰器
def outer(choose):
def wrapper(func):
def inner(*args,**kwargs):
if choose =='func1':
print ('func1的判断条件')
ret = func()
return ret
if choose=='func2':
print ('func2的判断条件')
ret = func()
return ret
return inner
return wrapper
@outer('func1') ## 这里的 outer('func1') 先执行 返回 wrapper 函数,所以就只比标准函数多一步操作
def func1():
print('我是被装饰的函数1')
@outer('func2')
def func2():
print ('我是被装饰的函数2')
## 当然这样写很蠢;如果有操作的话可以直接对choose这个变量操作,不需要判断,因为相应的choose是不一样的
两个装饰器装饰一个函数
def wrapper1(func):
print(0)
def inner1():
print(111)
func()
print(222)
return inner1
def wrapper2(func):
print(9)
def inner2():
print(333)
func()
print(444)
return inner2
@wrapper1
@wrapper2
def func0():
print('********')
## 结果
9
0
111
333
********
444
222
## 这个语法糖 等价于 func0 = wrapper1(wrapper2(func0))
递归
递归绝不是简单的自己调用自己,他是一种化繁为简的思想,请宏观的看问题,细节交给计算机
递归要满足两点要求
1 递归条件:可以通过不断调用自身,缩小待解决问题的范围
2 基线条件:出口,当不满足递归条件时
# 阶乘问题
def jc(n):
if n==1:
return 1
else:
return n*jc(n-1)
## 斐波那契数列 第n项的值
def fbnq(n):
if n==1:
return 1
if n<=0:
return 0
return fbnq(n-1)+fbnq(n-2)