遞歸函數、生成器、裝飾器
遞歸: 在函數執行中調用自身
必須有邊界條件,遞歸前進段和遞歸返回段
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