[python3]內嵌函式和閉包
阿新 • • 發佈:2019-01-27
1.內嵌函式
內嵌函式(允許在函式內部建立另一個函式,叫內部函式)
def fun1():
print('fun1 is using...')
def fun2():
print('fun2 is using...')
fun2()
print('fun1 end...')
fun1()
'''輸出如下;
fun1 is using...
fun2 is using...
fun1 end...
'''
注意:內部函式的整個作用域都在外部函式之內,如fun2整個定義和呼叫的過程都在fun1裡面,除了在fun1裡可以任意呼叫,出了fun1之外無法被呼叫,會系統報錯
2.閉包
閉包——函數語言程式設計的重要語法結構。
如果在一個內部函式被外部作用域(但不是全域性作用域的變數)進行引用,那麼內部函式會被認為是閉包 。
def funX(x): #外部作用域 的變數 x def funY(y): #內部函式(閉包) return x * y #引用了x變數 return funY i = funX(8) print(i) #<function funX.<locals>.funY at 0x000002889E0E8510> print(type(i)) #<class 'function'> print(i(a)) #40 print(funX(8)(5)) #40
1.如下報錯: def fun1(): x = 5 def fun2(): print(x) #5 x *= x # return x return fun2() print(fun1()) #UnboundLocalError: local variable 'x' referenced before assignment 2.如果想正確執行 def fun1(): x = [5] print(x[0]) #5 def fun2(): print(x[0]) #5 x[0] *= x[0] return x[0] return fun2() print(fun1()) #25 3.在python3.x中,也可以用關鍵字:nonlocal def fun1(): x = 5 def fun2(): nonlocal x x *= x return x return fun2() print(fun1()) #25
#如何訪問funIn()函式 #1 def funOut(): def funIn(): print("yes, funin") return funIn funOut()() #yes, funin #2 def funOut(): def funIn(): print("yes, funin") return funIn() funOut() #yes, funin
#a = funX()的時候,只要a變數沒有被重新賦值,funX()就沒有被釋放,也就是說區域性變數x就沒有被重新初始化。 def funX(): x = 5 def funY(): nonlocal x x += 1 return x return funY a = funX() print(a()) #6 print(a()) #7 print(a()) #8