目錄
1. 閉包
我們可以在⼀個函數中再定義⼀個函數,在函數內部定義的函數稱之爲內部函數,內部函數只能在函數內使⽤,不會污染外部空間。定義內部函數的函數稱之爲外部函數,這樣的定義構成函數的嵌套
- 內部函數只能在外部函數⾥調⽤,外界⽆法直接調⽤內部函數
在⼀個外部函數中定義了⼀個內部函數,內部函數⾥引⽤了外部函數的變量,並且外部函數的返回值是內函數的引⽤。這樣內部函數和其執⾏所需的環境變量就構成了⼀個閉包。
⼀般情況下,如果⼀個函數結束,函數的內部所有東⻄都會釋放掉,局部變量都會消失。但是閉包是⼀種特殊情況,如果外函數在結束的時候發現有⾃⼰的局部變量將來會在內部函數中⽤到,就把這個局部變量綁定給了內部函數,然後⾃⼰再結束。
在閉包中⽆法直接修改外部變量x的值
在python3中可以通過nonlocal關鍵字聲明⼀下x,表示這個變量不是局部變量,需要向上⼀層變量空間找這個變量。
2 裝飾器(重點,難點)
軟件開發中有⼀條⾮常重要的規則就是:對修改封閉,對擴展開放。 對於⼀個現有的函數,如果想要增強此函數的功能,但是不允許修改此函數源代碼的時候,使⽤裝飾器來解決這個問題
- 本質:就是⼀個閉包,還是⼀個返回函數的⾼階函數
- 好處:就是在不⽤修改原函數代碼的前提下給函數增加新的功能
2.1 裝飾器寫法
2.2使⽤@語法糖將裝飾器應⽤到指定函數上,簡化使⽤
2.3 帶有不定⻓參數的裝飾器
同⼀個裝飾器可以應⽤於多個函數
2.4 多個裝飾器作⽤在⼀個函數上(不重要)
3.遞歸函數(不是重點)
3.1 嵌套調⽤
在函數A中可以調⽤函數B,在函數B中可以調⽤函數C,這種調⽤⽅式稱爲函數的嵌套調⽤。
3.2 遞歸調⽤
⼀個函數直接或間接的調⽤⾃⼰則稱爲遞歸調⽤。
3.3 遞歸調⽤過程
遞歸調⽤可分解爲兩個過程,正向遞歸調⽤和逆向遞歸返回。
3.4 遞歸適⽤條件
如果⼀個問題規模縮減後,求解⽅式和原來⼀樣,⼩規模問題解決後導致問題的最終解決,則可適⽤遞歸
- 形式是遞歸的 階乘和斐波那契數列
- 結構是遞歸的 列表遍歷
- 解法是遞歸的 漢諾塔
遞歸的寫法:
- ⼀個遞歸程序必須包含兩部分:
1) 遞歸終⽌條件
2) 遞歸調⽤⾃⼰
作業
1.有五個學⽣坐在⼀起,問第五個⼈多少歲?答⽐第四個⼤2歲,第四個⼈說它⽐第三個⼈⼤2歲, ,...第⼀個⼈說他10歲。請寫⼀個遞歸函數計算第5個學⽣多少歲(遞歸實現)
2.某班期末考試科⽬爲數學和計算機,有最多不超過30⼈參加考試。學⽣的信息包括學號、姓名。考試後要求:
(1)計算每個學⽣的總分和平均分;
(2)按總分成績由⾼到低排出成績的名次;
(3)打印出名次表,表格內包括學⽣姓名、學號、各科分數、總分和平均分;
(4)任意輸⼊⼀個學號,能夠查找出該學⽣在班級中的排名及其考試分數
編寫要求:
(1) 要對⽤戶輸⼊進⾏驗證,如果輸⼊的不是0-4顯示錯誤,然後繼續輸⼊
(2) 要能夠連續不斷的進⾏選擇
(3) 每⼀項功能都要封裝函數完成,函數單獨放到⼀個模塊中
(4) 菜單及其⽤戶選擇的處理放到主模塊中。
(5) 學⽣數據保存到⽂件