2. 從函數開始
2.1. 定義一個函數
如下定義了一個求和函數:
代碼如下:
def add(x, y):
return x + y
關于參數和返回值的語法細節可以參考其他文檔,這里就略過了。
使用lambda可以定義簡單的單行匿名函數。lambda的語法是:
代碼如下:
lambda args: expression
參數(args)的語法與普通函數一樣,同時表達式(expression)的值就是匿名函數調用的返回值;而lambda表達式返回這個匿名函數。如果我們給匿名函數取個名字,就像這樣:
代碼如下:
lambda_add = lambda x, y: x + y
這與使用def定義的求和函數完全一樣,可以使用lambda_add作為函數名進行調用。然而,提供lambda的目的是為了編寫偶爾為之的、簡單的、可預見不會被修改的匿名函數。這種風格雖然看起來很酷,但并不是一個好主意,特別是當某一天需要對它進行擴充,再也無法用一個表達式寫完時。如果一開始就需要給函數命名,應該始終使用def關鍵字。
2.2. 使用函數賦值
事實上你已經見過了,上一節中我們將lambda表達式賦值給了add。同樣,使用def定義的函數也可以賦值,相當于為函數取了一個別名,并且可以使用這個別名調用函數:
代碼如下:
add_a_number_to_another_one_by_using_plus_operator = add
print add_a_number_to_another_one_by_using_plus_operator(1, 2)
既然函數可以被變量引用,那么將函數作為參數和返回值就是很尋常的做法了。
2.3. 閉包
閉包是一類特殊的函數。如果一個函數定義在另一個函數的作用域中,并且函數中引用了外部函數的局部變量,那么這個函數就是一個閉包。下面的代碼定義了一個閉包:
代碼如下:
def f():
n = 1
def inner():
print n
inner()
n = 'x'
inner()
函數inner定義在f的作用域中,并且在inner中使用了f中的局部變量n,這就構成了一個閉包。閉包綁定了外部的變量,所以調用函數f的結果是打印1和'x'。這類似于普通的模塊函數和模塊中定義的全局變量的關系:修改外部變量能影響內部作用域中的值,而在內部作用域中定義同名變量則將遮蔽(隱藏)外部變量。
如果需要在函數中修改全局變量,可以使用關鍵字global修飾變量名。Python 2.x中沒有關鍵字為在閉包中修改外部變量提供支持,在3.x中,關鍵字nonlocal可以做到這一點:
代碼如下:
#Python 3.x supports `nonlocal'
def f():
n = 1
def inner():
nonlocal n
n = 'x'
新聞熱點
疑難解答