递归函数、生成器、装饰器
生活随笔
收集整理的這篇文章主要介紹了
递归函数、生成器、装饰器
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
遞歸函數、生成器、裝飾器
遞歸: ?在函數執行中調用自身
必須有邊界條件,遞歸前進段和遞歸返回段
python中遞歸有層次限制
遞歸函數實現階乘
def?fact(n):?if?n?<=?1:return?1else:return?n?*?fact(n-1)調用:fact(3)=3fact(2)=32fact(1)=32*1
fact(3)6實現斐波拉契數列
def?fib1(n):if?n?<=?1:return?1else: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?1print('step?2')yield?2print('step?3')yield?3a=gen()next(a)step?11next(a)step?22裝飾器:在不改變已存在對象的基礎上為其添加額外功能
典型應用:插入日志、測試性能、事物處理
給foo函數計算運行時間
import?timedef?foo():print('in?foo()')#?定義一個計時器,傳入一個函數,并返回另一個附加了計時功能的方法def?timeit(func):#?定義一個內嵌的包裝函數,給傳入的函數加上計時功能的包裝def?wrapper():start?=?time.clock()func()end?=time.clock()print('used:',?end?-?start)#?將包裝后的函數返回return?wrapperfoo?=?timeit(foo)foo()in?foo() used:?0.0018359999999972842python裝飾器提供的語法糖效果,下面的@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轉載于:https://blog.51cto.com/mofeihu/1877144
總結
以上是生活随笔為你收集整理的递归函数、生成器、装饰器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C# 字符串 数据类型 判断 与特定规则
- 下一篇: 如何跟项目经理和开发人员反馈安全测试报告