1. 程式人生 > >[python3]內嵌函式和閉包

[python3]內嵌函式和閉包

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