1. 程式人生 > >python閉包詳解+例項演示

python閉包詳解+例項演示

轉載自:http://www.cnblogs.com/blueel/archive/2012/12/28/2837673.html

“閉包”這個詞語相信大多數學過程式設計的同學並不陌生,但是有時候理解起來還是有一定難度。先看定義:

閉包是由函式和與其相關的引用環境組合而成的實體。比如參考資源中就有這樣的的定義:在實現深約束時,需要建立一個能顯式表示引用環境的東西,並將它與相關的子程式捆綁在一起,這樣捆綁起
來的整體被稱為閉包。

python閉包(closure)其實並不是什麼很複雜的東西。

通俗的講就是:如果在一個內部函式裡,對在外部作用域(但不是在全域性作用域)的變數進行引用,那麼內部函式就被認為是閉包(closure)。它只不過是個“內層”的函式,由一個名字(變數)來指
代,而這個名字(變數)對於“外層”包含它的函式而言,是本地變數。

看到這裡或許你依然不明白什麼是閉包,沒關係,看完下面的小例子你一定會明白!

複製程式碼
 1 #! /usr/bin/env python
 2 # coding=utf-8
 3 # http://***
 4 
 5 #定義一個函式
 6 def plus(number):
 7 
 8 #在函式內部再定義一個函式,其實這個裡面的函式就被認為是閉包
 9 def plus_in(number_in):
10 #這裡列印一下number_in變數,以便大家可以更清楚傳進來的變數時哪一個
11 print str(number_in) + "\r\n"
12 
13 return number+number_in
14 #其實這裡返回的就是閉包的結果
15 return plus_in
16 
17 
18 #給plus函式賦值,這個20就是給引數number
19 v1=plus(20)
20 
21 #注意這裡的100其實給引數number_in
22 
23 print v1(100)
複製程式碼

執行結果:

100

120

理解:閉包就是一個函式A裡面內嵌了一個函式B,那麼這個函式A就稱為閉包。要呼叫這個閉包A,因為它抽象了兩層,所以需要初始化兩次,第一次得到A的例項也就是上下文環境先確定沒有發生函式呼叫,第二次初始化時傳參給A的內嵌函式B的,這樣整個閉包A就例項化了進行了函式呼叫。 如果閉包A抽象了多層比如內嵌了N層,那麼需要例項化N次,才初始化整個閉包然後才發生函式呼叫。