python函數 閉包 生成器 裝飾器 遞歸函數 函數設計規範及執行環境

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類與面向對象

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章