函數的嵌套python
在Python編程語言中,在函數體內建立另一個函數(對象,由於Python一切皆對象,函數其實也是對象)是徹底合法的,這種函數叫作內部/嵌套函數。編程
例子:閉包
# coding : utf-8 def outer(): def inner(): print("is Inner Method") print("Is outer Method") inner() #調用outer函數 outer() #調用outer()的內部函數,報錯 # inner()
運行結果:編程語言
Is outer Method
is Inner Methodideinner() #調用inner()時,出現以下錯誤
NameError: name 'inner' is not defined函數
函數的閉包ui
何爲閉包?對象
若是在一個內部函數裏,對在外部做用域(不是全局做用域)的變量進行引用,那麼內部函數就被認爲是閉包(closure)事件
說的明瞭一點就是:在內部函數中,引用了外部函數的自由變量
utf-8
閉包的做用:
保存函數的狀體信息,使函數的局部變量信息能夠保存下來,對於安裝計算、隱藏狀態是頗有用的
在GUI或者在不少API支持回調函數的事件驅動編程中也有很用處
閉包有兩種調用方式:
在內部直接調用
返回函數名稱
e.g
1.在內部直接調用
# -*- coding: utf-8 -*- def outer(name): def inner(name): # name = "Mr.Zhang" #這裏的name值會覆蓋調用outer函數實參的值,這是涉及變量在函數做用域的範圍 print("sub method :%s" %name) # 使用__closuer__內置屬性來判斷是不是一個閉包,返回地址,則是,返回None,則不是閉包函數 print(inner.__closure__) inner(name) #在內部直接調用 outer("GuiDo")
運行結果:
sub method :GuiDo
(<cell at 0x000001D2792EF7C8: function object at 0x000001D2793687B8>,)
e.g
2.返回函數名稱
# -*- coding: utf-8 -*- def sumer(num = 0): count = [num] def add(): count[0] += 1 return count[0] return add f = sumer(3) print(f()) print(f()) print(f())
運行結果:
456