函數之裝飾器
---恢復內容開始---
一。函數名(學名:第一類對象)
函數名本質上就是函數的內存地址。通俗點就是特殊的變量.
def my():
print(666)
print(my) # 函數名my在內存的地址
print(id(my)) #變量my在內存的地址
結果:
1.可以被引用(即可以賦值給其他變量)
def func(): print(666) f = func #將func賦值給f f() #相當於func()
結果:
2.可以被當作容器類型的元素
def func(): print(111) def func2(): print(222) def func3(): print(333) li = [func(),func2(),func3()] for i in li: i
結果;
3.可以當作函數的參數和返回值
def func(): print(111) def func2(): return func #當作返回值 f = func2() f() #當作參數
結果:
第一類對象(first-class object)指
1.可在運行期創建
2.可用作函數參數或返回值
3.可存入變量的實體。
二。閉包
閉包的定義:內層函數,對外層函數(非全局)的變量的引用,叫做閉包
閉包的用處:如果說你內存函數是個閉包,python內部有一個機制,遇到閉包
內存會在內存中開啟一個內存空間,不會隨著函數的結束而關閉,避免多次開關內存.
簡單應用
from urllib.request import urlopen print(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 get index(‘http://www.cnblogs.com/jin-xin/articles/8259929.html‘)()
結果;
判斷函數是否是閉包.__closure__
def func(): name = ‘alex‘ def func2(): print(name) func2() print(func2.__closure__) #引用幾個變量就有幾個cell 這個函數就是閉包 不引用就是None 函數不是閉包 func()
結果:
三,在外層函數內部執行內部函數
def func(): def func2(): print(111) func2() func() def func(): def func2(): print(111) return func2 func()()
結果:
四。裝飾器
1.比如計算一個函數的執行效率
import time def func(): print(‘666‘) start_time = time.time() time.sleep(0.1) func() end_time = time.time() print(‘------的執行效率%s‘%(end_time-start_time))
結果:
2.進階寫法
import time def func(): print(‘666‘) def timmer(): start_time = time.time() time.sleep(0.1) func() end_time = time.time() print(‘------的執行效率%s‘%(end_time-start_time)) timmer()
結果;
3.簡單的裝飾器
import time def func(): print(‘我們都一樣‘) def timmer(): start_time = time.time() time.sleep(0.1) func() end_time = time.time() print(‘------的執行效率%s‘%(end_time-start_time)) timmer()
結果;
4.帶返回值的裝飾器(語法糖的用法)
@timmer 相當於 #func = timmer(func) 即待求的函數名 = 新函數名(待求的函數名)
import time def 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 @timmer def func(): return ‘666‘
print(func())
結果:
5.通用裝飾器
def wrapper(func): def inner(*args,**kwargs): ‘‘‘執行函數前的操作‘‘‘ ret = func(*args,**kwargs) ‘‘‘執行函數後的操作‘‘‘ return ret return inner @wrapper def func(): print(111) func()
函數之裝飾器