裝飾器&遞迴

_albert發表於2019-06-26

裝飾器

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)

相關文章