def func_name(arg1,…)
func_suite
函數語句或者整個執行流程遇到def語句時候,會在內存中生成一個函數對象,並且此對象靠函數名來引用。那麼但是這個函數體裏的語句只有在函數調用的時候纔會被執行。而函數調用結束了,函數返回時,其內部所使用數據都被銷燬了。
python的閉合函數 閉包:lexical closure
外層函數給內層函數提供了環境,即外層中變量的修改,引起內層函數的改變。叫做閉包,或閉合函數。但是雖然表現爲函數的形式,本身並不是函數。函數是可以嵌套的,在函數內部定義一個子函數,這個子函數並沒有被調用,而是直接當做返回值返回,這種函數叫做python的閉合函數。
#回顧 列表解析的主要目的就是爲了在原有列表的基礎上生成新的列表。如果我們在使用列表時一次只需要使用一個元素時可以使用生成器。
如:使用生成器生成1到10中每個數的平方,如下圖:
由於生成器並不會直接創建出一個列表,因此對於生成器不能進行切片,索引,也不能執行任何常規的列表操作如append(),extend()等等,不過我們可以將生成器表達式轉換成列表。生成器是按需每次返回一個結果進行計算,叫做惰性求值。
之前,我們的生成器在某種意義上還是基於某個列表來生成得到的。事實上我們可以使用函數來完全實現類似生成器一樣的效果,自定義函數來實現。
yield 自動生成一個生成器對象。
上圖中函數genNum在被調用時候其不會直接執行,而是用yield返回一個生成器對象,對此生成器調用next()方法,生成器將不斷的執行語句。在函數直到遇到yield語句,函數不再執行,直到調用next()方法之後,繼續執行,反覆繼續,直到沒有yield停止,即生成器的迭代過程結束。
函數中使用yield,會返回一個生成器的對象。
裝飾器
1.裝飾器本身是一個函數,這個函數的主要目的是爲了裝飾其它函數:
2.功能:增強被裝飾函數的功能:
裝飾器一般接受一個函數對象作爲參數,已對其進行增強。
對帶參數的函數進行寫裝飾器增強其功能,如下圖:。
遞歸:
遞歸需要邊界條件,遞歸前進段和遞歸返回段;
10 * 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1
10 * (10-1) * ( (10-1)-1) * … * 1
#代碼即計算過程解釋如下圖:
考慮以python遞歸的方式實現斐波那契數列。
函數的設計規範:
1.耦合性:
(1)通過參數接受輸入,以及通過return產生輸出以保證函數的獨立性;
(2)儘量減少使用全局變量進行函數間通信;
(3)不要在函數中修改可變類型的參數;
(4)避免直接改變定義在另外一個模塊中的變量;
2.聚合性:
(1)每個函數都應該有一個單一的、統一的目標;
(2)每個函數功能都應該相對簡單。
函數執行環境
完結
下一篇 python類與面向對象