Python 函式是第一類物件

2021-09-22 12:55:06 字數 2320 閱讀 2069

在很多資料中,經常會看到這樣一句話:「python 中的函式是第一類物件」。這裡所說的第一類物件,其實是指函式作為乙個物件,與其他物件具有相同的地位。

關於這一點,guido 曾提過「first-class everything」,他對 python 的乙個發展目標就是所有的物件都是第一類物件。也就是說,所有物件都可以賦值給變數,放進容器中,作為引數傳遞,用作返回值等等。

1、函式是物件

python 中的一切皆物件,對於函式也不例外。

以乙個簡單的函式為例,來說明這一點:

我們都知道,物件有三大要素 - id、type、value,那麼函式有嗎?

很顯然,它都有!當然,除了這些通用屬性之外,函式還可用於一些高階操作。

2、函式可以賦值給變數

由於函式是物件,所以和任何其他物件(例如:字串)一樣,它也可以賦值給變數:

但這並不會呼叫函式,只不過是在函式物件上繫結了新的名稱而已。

如果要呼叫函式,除了直接使用 greet 之外,還可以通過呼叫這些變數來執行相同的底層函式:

3、函式可以儲存在容器中

常見的容器有很多(例如:列表、字典),它們可以儲存任何物件,也包括函式。

例如,向列表中新增一些函式:

其中,greet 是我們自定義的函式,len 是內建函式,而 str.lower 是字串中的方法。

要呼叫這些函式很容易,可以直接通過索引來訪問:

也可以將其分配給變數,然後通過變數來呼叫:

4、函式可以作為引數

在函式式程式設計中,有乙個很重要的概念 - 高階函式,就是讓函式的引數能夠接收別的函式。如果使用過 map()、filter() 之類的函式,應該知道這一點。

來看下面這個函式:

可以通過傳遞不同的函式和資訊來影響問候語,嘗試傳遞 greet 函式:

函式的這個特性非常強大,它允許我們抽象並傳遞程式中的行為。

5、函式可以巢狀

與條件語句和迴圈語句類似,python 也允許在乙個函式中定義其他函式,這些函式通常被稱為巢狀函式(或內部函式)。

來看乙個示例:

當每次呼叫 welcome 時,它都會定義乙個新的巢狀函式 greet,然後呼叫它:

6、函式可以作為返回值

函式不僅可以巢狀,還可以作為返回值,甚至是捕獲並攜帶外部函式的一些狀態。

對上述示例略作修改:

如果仔細觀察巢狀函式 greet,你會發現它不再有任何引數了,但仍可以訪問外部函式中定義的引數 msg:

看起來,greet 似乎記住了引數的值。這樣的函式稱為詞法閉包(或簡稱:閉包),即使程式流不在該範圍內,閉包也會記住其所包含的詞法範圍中的值。

7、物件可以表現得像函式

雖然物件不是函式,但是也可以被呼叫。在某些情況下,可以將它們當作函式來處理。

如果物件是可呼叫的,意味著可以對它使用圓括號 () 並傳遞引數:

在內部,將物件例項作為函式來「呼叫」會嘗試執行 __call__ 方法:

並非所有的物件都可以呼叫,可以用內建函式 callable 來判斷:

在python中函式是第一類物件

python中,所有的元素都是物件,其中第一類物件的通用特性 可作為值傳遞,賦值給另乙個物件 可以作為元素新增到集合物件中 可以作為引數傳遞給其他函式 可以作為函式的返回值 1,賦值給變數 def f1 str return len str temp f1 print temp hello 2,新增...

Python 函式的第一類物件 使用

函式的第一類物件及使用 第一類物件 特殊點 可以當做值被賦值給變數 def func print 1 print func a func a 2.可以當做元素存放在容器中 def func print 1 lst func,func,func for i in lst i 3.函式名可以當做函式的引...

第一類物件 函式名 變數名

第一類物件 函式名 變數名 函式物件可以像變數一樣進行賦值 還可以作為列表的元素進行使用 可以作為返回值返回 可以作為引數進行傳遞 閉包 函式的巢狀 內層函式對外層函式中的變數的使用 好處 1.保護變數不被侵害 2.讓乙個變數常駐記憶體 如何通過 檢視乙個閉包 closure 有東西就是閉包.沒東西...