函數名本質上就是函數的內存地址數據結構
1.能夠被引用閉包
def func(): print('in func') f = func print(f) 輸出: <function func at 0x0000029C11C93E18>
2.能夠被看成容器類型的元素app
def f1(): print('f1') def f2(): print('f2') def f3(): print('f3') l = [f1,f2,f3] d = {'f1':f1,'f2':f2,'f3':f3} #調用 l[0]() d['f2']() 輸出: f1 f2
3.能夠看成函數的參數和返回值函數
*不明白?那就記住一句話,就當普通變量用spa
def func(): print('in func') return 10 def func2(arg): arg() return arg f = func2(func) f() 輸出: in func in func
第一類對象的概念:
函數名能夠賦值
能夠做爲一個數據結構的元素
能夠做爲一個函數的參數
能夠做爲一個函數的返回值code
閉包對象
def func(): name = 'eva' def inner(): print(name)
閉包函數:blog
內部函數包含對外部做用域而非全劇做用域名字的引用,該內部函數稱爲閉包函數 內存
#函數內部定義的函數稱爲內部函數作用域
因爲有了做用域的關係,咱們就不能拿到函數內部的變量和函數了。若是咱們就是想拿怎麼辦呢?返回呀!
咱們都知道函數內的變量咱們要想在函數外部用,能夠直接返回這個變量,那麼若是咱們想在函數外部調用函數內部的函數呢?
是否是直接就把這個函數的名字返回就行了?
這纔是閉包函數最經常使用的用法
def func(): name = 'eva' def inner(): print(name) return inner f = func() f() 輸出: eva
判斷閉包函數的方法__closure__
#輸出的__closure__有cell元素 :是閉包函數 def func(): name = 'eva' def inner(): print(name) print(inner.__closure__) return inner f = func() f() #輸出的__closure__爲None :不是閉包函數 name = 'egon' def func2(): def inner(): print(name) print(inner.__closure__) return inner f2 = func2() f2()
閉包嵌套:
def wrapper(): money = 1000 def func(): name = 'eva' def inner(): print(name,money) return inner return func f = wrapper() i = f() i() 閉包嵌套