7月17日每日一答
1 什么是閉包函數,閉包函數滿足什么樣的條件?請寫一個常見的閉包函數。
所謂的函數閉包本質是函數的嵌套和高階函數。我們來看看要實現函數閉包要滿足什么條件(缺一不可):
1)必須嵌套函數 2)內嵌函數必須引用一個定義在閉合范圍內(外部函數里)的變量——內部函數引用外部變量 3)外部函數必須返回內嵌函數——必須返回那個內部函數閉包的作用:可以保持程序上一次運行后的狀態然后繼續執行。
我們來看一閉包函數的一個實例
def foo():num=1def add(n):nonlocal numnum += nreturn numreturn add f=foo() print(f(1)) #2 print(f(2)) #4我們可以用函數閉包來實現一個函數的裝飾器:
我們知道函數裝飾器要滿足如下條件:1、不能改變原來函數的代碼。2、為函數添加新的功能。3、不能改變函數的調用方式。 使用函數閉包完全可以做到這一點。
下面我們的為一個函數,增加統計時間的功能:
import time def foo():time.sleep(3)print('aaa') def decorate(fun):def bibao():start=time.time()fun()end=time.time()print('花費的時間是%d'%(end-start))return bibao foo=decorate(foo) foo() #aaa 花費的時間是32 什么是遞歸函數?在遞歸函數的使用中要注意什么地方?
?
其實就是自己調用自己叫函數遞歸:
默認遞歸是1000次,因為在遞歸的時候,需要暫用內存空間,執行一次
的時候上面一層的函數依舊在運行,所以必須要有限制。本質上說函數運行
會占用??臻g,當運行一次就在棧空間加一層,當遞歸次數過多,棧就會溢出
遞歸注意:
1.必須有一個明確結束條件,要不就成死循環
2.每次進入更深一層遞歸時,問題規模相比上次遞歸都應有所減少
3.遞歸執行效率不高,遞歸層次過多會導致棧溢出
3請用遞歸函數實現10的階乘:10*9*8*7....*1
?
轉載于:https://www.cnblogs.com/zhengyiqun1992/p/11199067.html
總結
- 上一篇: 用asp.net编写冒泡排序法
- 下一篇: BZOJ1706奶牛接力跑