python允許建立巢狀函式。也就是說我們可以在函式裡面定義函式,而且現有的作用域和變數生存週期依舊不變。
例子:
#encoding=utf-8
defouter()
: name=
"python"
definner()
:#outer函式內部定義的函式
print name
return inner(
)#返回該內部函式
在inner函式中,python解析器需要找乙個叫name的本地變數,查詢失敗後會繼續在上層的作用域裡面尋找,這個上層作用域定義在outer函式裡,python函式可以訪問封閉作用域。
return內層函式時不加括號,只返回函式的位址。
如果乙個函式定義在另乙個函式的作用域內,並且引用了外層函式的變數,則該函式稱為閉包。閉包是python所支援的一種特性,它讓在非global scope定義的函式可以引用其外圍空間中的變數,這些外圍空間中被引用的變數叫做這個函式的環境變數。環境變數和這個非全域性函式一起構成了閉包。
def
line_conf
(a, b)
:def
line
(x):
return a * x + b
return line
巢狀函式line中的**訪問了a和b變數,line本身函式體內並不存在這兩個變數,所以會逐級向外查詢,往上走一層就找到了來自主函式line_conf傳遞的a, b。若往外直至全域性作用域都查詢不到的話**會拋異常。
line_a = line_conf(2,
1)#y=2x+b
line_b = line_conf(3,
2)#y=3x+2
#列印x對應y的值
print
(line_a(1)
)#3print
(line_b(1)
)#5
內包的語法為
def 父函式(引數)
:#這裡的引數外部傳遞給子函式作其函式引數
def 子函式(引數): #這裡的引數為外部傳遞給子函式作其自變數額值
fuction
return 子函式值
呼叫語法:
變數=父函式(賦給子函式的引數)
result=變數(子函式自變數的值)
result的值為子函式的計算值
在python中,迴圈體內定義的函式是無法儲存迴圈執行過程中的不停變化的外部變數
_list =
for i in
range(3
):deffunc
(a):
return i+a
for f in _list:
print
(f(1
))
輸出結果是3, 3, 3 。
想要讓上面的**輸出1, 2, 3可以使用如下的閉包函式:
_list =
for i in
range(3
):deffunc
(i):
deff_closure
(a):
# <<<---
return i + a
return f_closure
)# <<<---
for f in _list:
print
(f(1
))
python 內嵌C函式
yum install python devel.x86 64 include usr include python2.7 python.h int add int a,int b pyobject wrap add pyobject self,pyobject args static pymeth...
python 內嵌函式和閉包
在函式體內定義函式 定義a 函式 defa print a 函式 定義b 函式 defb print b 函式 呼叫b 函式 b 呼叫a 函式 a 輸出 a 函式 b 函式 定義閉包函式 defa num1 def b num2 return num1 num2 return b 檢視a 函式的返回...
C 內聯函式(內嵌函式,內建函式)
呼叫函式時需要一定的時間和空間的開銷。c 提供一種提高效率的方法,即在編譯時將函式呼叫處用函式體替換,類似於c語言中的巨集展開。這種在函式呼叫處直接嵌入函式體的函式稱為內聯函式 inline function 又稱內嵌函式或內嵌函式。指定內聯函式的方法很簡單,只需要在定義函式時增加 inline 關...