裝飾器
1.開放封閉原則
在原始碼不改變的情況下,增加一些額外的功能
對擴充套件是開放的,對修改是封閉的
1.1 開放原則:增加額外新功能
1.2 封閉原則:不要改變原始碼
2 裝飾器
滿足開放封閉原則,在不改變原函式程式碼及呼叫方式的前提下,增加新功能
# 基本裝飾器
def wrapper(func):
def inner(*args): # 這裡的* 是聚合
ret = func(*args) # 這裡的* 是打散
return ret
return inner
@wrapper
def func1(*args):
...
帶引數裝飾器
## 當裝飾器裝飾兩個以上驗證方式又不相同的函式時,就用到了帶引數的裝飾器
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):
def inner1(*args):
print ('1')
func()
print ('2')
return inner1
def wrapper2(func):
def inner2(*args):
print (3)
func()
print (4)
return inner2
@wrapper2 ## 這裡的wrapper2 相當於把wrapper1也裝飾了,相當於裝飾
@wrapper1 ## inner1 = wrapper1(func1)
def func1(): ## inner2 = wrapper2(inner1)
print ('new king')
## 最後的結果 3,1,new king 2 4
遞迴
遞迴絕不是簡單的自己呼叫自己,他是一種化繁為簡的思想,請巨集觀的看問題,細節交給計算機
遞迴要滿足兩點要求
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)