標籤:判斷 log bsp 其他 closed 實體 opened blog 傳回值
一。函數名(學名:第一類對象)
函數名本質上就是函數的記憶體位址。通俗點就是特殊的普通變數
def func(): print(111)func()print(func)# 結果:# 111# <function func at 0x00000150713F6048>
1.可以被引用(即可以賦值給其他變數)
def func(): print(‘in func‘)f = funcf()# 結果:# in func
2.可以被當作容器類型的元素
def func(): print(111)def func2(): print(222)def func3(): print(333)li = [func(),func2(),func3()]for i in li: i# 結果: 111 222 333
3.可以當作函數的參數和傳回值
def func(): print(111)func()def func2(): return funcf = func2()f()# 結果: 從上到下運行,遇見func()後調用函數列印一個111,# 111 之後到f = func2(),調用func2()返回給f一個值func,# 111 最後f()即func()再次調用後列印一個111
第一類對象(first-class object)指
1.可在運行期建立
2.可用作函數參數或傳回值
3.可存入變數的實體。
二。閉包
閉包的定義:內層函數,對外層函數(非全域)的變數的引用,叫做閉包
閉包的用處:如果說你記憶體函數是個閉包,python內部有一個機制,遇到閉包
他會在記憶體中開啟一個記憶體空間,不會隨著函數的結束而關閉
from urllib.request import urlopenprint(urlopen(‘http://www.cnblogs.com/jin-xin/articles/8259929.html‘).read())def index(url): content = urlopen(url).read() def get(): with open(‘爬蟲‘,‘a‘) as f1: f1.write(content.decode(‘utf-8‘)) return getindex(‘http://www.cnblogs.com/jin-xin/articles/8259929.html‘)()index(‘http://www.cnblogs.com/jin-xin/articles/8259929.html‘)()index(‘http://www.cnblogs.com/jin-xin/articles/8259929.html‘)()index(‘http://www.cnblogs.com/jin-xin/articles/8259929.html‘)()index(‘http://www.cnblogs.com/jin-xin/articles/8259929.html‘)()def index(): url = "http://www.xiaohua100.cn/index.html" def get(): return urlopen(url).read() return get
耙梳頁(閉包用處)
判斷是否是閉包函數:__closure__
ef func(): name = ‘alex‘ def func2(): print(name) func2() print(func2.__closure__) #含有 cell 就是閉包 None 不是閉包func()# 結果:# alex# (<cell at 0x0000011AD42A75B8: function object at 0x0000011AD6178A60>, <cell at 0x0000011AD42A75E8: str object at 0x0000011AD6177378>)name = ‘alex‘def func(): def func2(): print(name) func2() print(func2.__closure__) # None 不是閉包func()# 結果:# alex# Nonedef func(x): def func2(): print(x) func2() print(func2.__closure__) func(‘alex‘)# 結果:# alex# (<cell at 0x0000029D98CE75B8: str object at 0x0000029D98D77538>,)
三。在外層函數內部執行內建函式
def func(): def func2(): print(111) func2()func()def func(): def func2(): print(111) return func2func()()
四。裝飾器
比如計算一個函數的執行效率
1.最low的寫法
import timedef func(): print(‘我們都一樣‘)start_time = time.time()time.sleep(0.1)func()end_time = time.time()print(‘------的執行效率%s‘%(end_time-start_time))# 結果:# 我們都一樣# ------的執行效率0.10034990310668945
View Code
2.進階寫法
import timedef func(): print(‘我們都一樣‘)def timmer(): start_time = time.time() time.sleep(0.1) func() end_time = time.time() print(‘------的執行效率%s‘%(end_time-start_time))timmer()# 雖然也可以運行,但是影響了func()的正常運行,還可以在進階
View Code
3.簡單的裝飾器
import timedef func(): print(‘我們都一樣‘)def timmer(f): def inner(): start_time = time.time() time.sleep(0.1) f() end_time = time.time() print(‘------的執行效率%s‘%(end_time-start_time)) return innerfunc = timmer(func)func()# 可以理解為func,timmer,inner通過賦值轉換,加參數,最後只剩一個func,# 這樣就可以運行程式,又可以知道執行效率
View Code
4.帶傳回值的裝飾器(文法糖的用法)
@timmer 相當於 #func = timmer(func) 即待求的函數名 = 新函數名(待求的函數名)
import timedef timmer(func): def inner(*args,**kwargs): start_time = time.time() time.sleep(0.1) ret = func(*args,**kwargs) end_time = time.time() print(‘------執行效率%s‘%(end_time-start_time)) return ret return inner@timmerdef func(): return ‘天若有情天亦老,人間正道是滄桑‘# func() 列印傳回值的話不能寫這步,否則函數會在調用一次,多列印一次執行效率print(func())# 結果:# ------執行效率0.1002659797668457# 天若有情天亦老,人間正道是滄桑
5.通用裝飾器
def wrapper(func): def inner(*args,**kwargs): ‘‘‘執行函數前的操作‘‘‘ ret = func(*args,**kwargs) ‘‘‘執行函數後的操作‘‘‘ return ret return inner@wrapperdef func(): print(111)func()
python函數三 (裝飾器)