Python函數之進階二
阿新 • • 發佈:2018-02-02
python 返回值 引用 rst pos 容器 類對象 print pan
一、函數名的本質
函數名本質上就是函數的內存地址。
1、可以被當做值或變量引用
def func(): print(111) print(func) #<function func at 0x00000218A911AB70> --函數在內存中的地址 f = func #將其傳給變量f print(f) #<function func at 0x00000279A5A6AB70> f() #111
2、函數可以被當做容器類型的元素存儲
#將其當做容器存儲在列表中 def func1(): print(‘func1‘) def func2(): print(‘func2‘) def func3(): print(‘func3‘) lis = [func1, func2, func3] lis[0]() #func1 lis[1]() #func2 lis[2]() #func3
3、可以當做函數的參數和返回值
#當做參數和返回值 def func1(): print(‘func1‘) def func(argv): argv() return argv #func1作為返回值 f = func(func1) #func1作為參數 f() #輸出 func1 func1
總結:
# 1、函數名的內存地址--print(函數名). # 2、函數名可以賦值給其他變量. # 3、函數名可以當做容器類的元素. # 4、函數名可以當做函數的參數. # 5、函數名可以當做函數的返回值. # 學名:第一類對象(first-class object)
# 總之:可以把函數名當做變量來用
二、閉包
在一個外函數中定義了一個內函數,內函數裏運用了外函數的臨時變量,並且外函數的返回值是內函數的引用。這樣就構成了一個閉包(即:內層函數,對外層函數(非全局)的變量的引用)。
#閉包函數的基本用法 def func(): name = ‘eva‘ def inner(): print(name) return inner f = func() f() #eva
檢測閉包函數的公共屬性:__closure__
#閉包函數 #輸出結果如果有 cell 就是閉包函數 def wrapper(): name = ‘是閉包‘ def inner(): print(name) #是閉包 inner() print(inner.__closure__) #(<cell at 0x000001945CE07588: str object at 0x000001945CE06B70>,) wrapper() # 非閉包函數 #輸出結果如果是 None 就不是閉包函數 name = ‘不是閉包‘ def wrapper(): def inner(): print(name) #不是閉包 inner() print(inner.__closure__) #None wrapper()
Python函數之進階二