国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Python深入學習之閉包

2020-02-23 05:46:57
字體:
來源:轉載
供稿:網友

閉包(closure)是函數式編程的重要的語法結構。函數式編程是一種編程范式 (而面向過程編程和面向對象編程也都是編程范式)。在面向過程編程中,我們見到過函數(function);在面向對象編程中,我們見過對象(object)。函數和對象的根本目的是以某種邏輯方式組織代碼,并提高代碼的可重復使用性(reusability)。閉包也是一種組織代碼的結構,它同樣提高了代碼的可重復使用性。

不同的語言實現閉包的方式不同。Python以函數對象為基礎,為閉包這一語法結構提供支持的 (我們在特殊方法與多范式中,已經多次看到Python使用對象來實現一些特殊的語法)。Python一切皆對象,函數這一語法結構也是一個對象。在函數對象中,我們像使用一個普通對象一樣使用函數對象,比如更改函數對象的名字,或者將函數對象作為參數進行傳遞。

函數對象的作用域

和其他對象一樣,函數對象也有其存活的范圍,也就是函數對象的作用域。函數對象是使用def語句定義的,函數對象的作用域與def所在的層級相同。比如下面代碼,我們在line_conf函數的隸屬范圍內定義的函數line,就只能在line_conf的隸屬范圍內調用。

代碼如下:
def line_conf():
    def line(x):
        return 2*x+1
    print(line(5))   # within the scope


line_conf()
print(line(5))       # out of the scope

line函數定義了一條直線(y = 2x + 1)。可以看到,在line_conf()中可以調用line函數,而在作用域之外調用line將會有下面的錯誤:
代碼如下:
NameError: name 'line' is not defined

說明這時已經在作用域之外。

同樣,如果使用lambda定義函數,那么函數對象的作用域與lambda所在的層級相同。

閉包

函數是一個對象,所以可以作為某個函數的返回結果。

代碼如下:
def line_conf():
    def line(x):
        return 2*x+1
    return line       # return a function object

my_line = line_conf()
print(my_line(5))      

上面的代碼可以成功運行。line_conf的返回結果被賦給line對象。上面的代碼將打印11。

如果line()的定義中引用了外部的變量,會發生什么呢?

代碼如下:
def line_conf():
    b = 15
    def line(x):
        return 2*x+b
    return line       # return a function object

b = 5
my_line = line_conf()
print(my_line(5))      

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 比如县| 康乐县| 吴江市| 霍邱县| 鄂伦春自治旗| 藁城市| 麻城市| 汽车| 翁源县| 容城县| 顺昌县| 肇庆市| 澄江县| 寿光市| 乐平市| 新干县| 东乌珠穆沁旗| 新郑市| 虹口区| 吉隆县| 洪江市| 潞城市| 阿克苏市| 紫金县| 新营市| 祁东县| 吉木萨尔县| 普安县| 松溪县| 旌德县| 信宜市| 鹤岗市| 无棣县| 渑池县| 迭部县| 丽水市| 保康县| 漾濞| 盱眙县| 防城港市| 阿勒泰市|