遞歸函數、生成器、裝飾器

遞歸函數、生成器、裝飾器

遞歸:  在函數執行中調用自身

  • 必須有邊界條件,遞歸前進段和遞歸返回段

  • python中遞歸有層次限制

遞歸函數實現階乘

def fact(n): 
    if n <= 1:
        return 1
    else:
        return n * fact(n-1)

調用:fact(3)=3fact(2)=32fact(1)=32*1

fact(3)
6

實現斐波拉契數列

def fib1(n):
    if n <= 1:
        return 1
    else:
        return(fib1(n-1)+fib1(n-2))
for i in range(10):
    print(fib1(i))
1
1
2
3
5
8
13
21
34
55

生成器

  • 普通函數遇到return返回函數結束,再次執行又從第一條語句開始

  • 生成器遇到yield返回函數被掛起,再次執行則從上一次返回yield語句的地方繼續執行

定義一個生成器函數

def gen():
    print('step 1')
    yield 1
    print('step 2')
    yield 2
    print('step 3')
    yield 3
a=gen()next(a)
step 1
1
next(a)
step 2
2

裝飾器:在不改變已存在對象的基礎上爲其添加額外功能

  • 典型應用:插入日誌、測試性能、事物處理

給foo函數計算運行時間

import time
 def foo():
    print('in foo()')
 # 定義一個計時器,傳入一個函數,並返回另一個附加了計時功能的方法def timeit(func):
     
    # 定義一個內嵌的包裝函數,給傳入的函數加上計時功能的包裝
    def wrapper():
        start = time.clock()
        func()
        end =time.clock()
        print('used:', end - start)
     
    # 將包裝後的函數返回
    return wrapper
 foo = timeit(foo)foo()
in foo()
used: 0.0018359999999972842

python裝飾器提供的語法糖效果,下面的@timeit跟上面的foo = timeit(foo)是完全等價的

import timedef timeit(func):
     
    # 定義一個內嵌的包裝函數,給傳入的函數加上計時功能的包裝
    def wrapper():
        start = time.clock()
        func()
        end =time.clock()
        print('used:', end - start)
     
    # 將包裝後的函數返回
    return wrapper@timeitdef foo():
    print('in foo()')
    foo()
in foo()
used: 0.0013369999999994775


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章