普通裝飾器編寫的格式
def外層函式(引數)
def 內層函式(*args,**kwargs)
#函式執行之前
data= 引數(*args,**kwags)
#函式執行之後
return
data
return 內層函式
用法示例:
deffunc(arg):
def inner(*args,**kwargs):
v = arg(*args,**kwargs)
return
v
return
inner
@func
#@裝飾器的語法 : 等價於: index = func(index)
defindex():
print(123)
return 666ret =index()
(ret)
執行原理:
1. 函式從上往下執行,遇到 @func 時,執行 index = func(index),引數 arg =index,同時將返回值 inner 函式賦值給 index ,
2. 遇到 index()時,此時就是 inner(),執行 inner 函式
3. 執行 inner 函式,裡面的 arg(*args,**kwargs)執行,就是 index 函式執行,列印 123 ,同時將 index 的返回值 666 賦值給 v : v = 666
4. 繼續執行 inner 函式, inner 函式的返回值是 v , 執行 inner 函式的是 ret = index() , 所以 ret = v = 666
應用示例
#示例:計算函式執行時間
import
time
defbase(func):
definner(*args,**kwargs):
start_time = time.time() --->#
函式執行之前
v=func(*args,**kwargs)
end_tme = time.time() ---->#
函式執行之後
print(end_time-start_time)
return
v
return
inner
@base
deffunc1():
time.sleep(2) #
函式執行延緩2秒
print(123)
@base
deffunc2():
time.sleep(1)
print(456)
生成器的本質就是迭代器
生成器函式 : 內部是否包含yield
deffunc():
print('f1'
)
yield 1
print('f2'
)
yield 2
print('f3'
)#函式內部**不會執行,返回乙個生成器物件
v1 =func()
#生成器可以被for 迴圈,一旦開始迴圈函式內部**就開始執行
for item in
v1:
(item)
#f1 1 f2 2 f3
特殊的迭代物件
deffunc():
yield 1v =func()
result = v.__iter__
()print(result)
迭代器想要獲取每個元素 : 反覆呼叫val = v1.__next__
()
v1 = "alex
"v2 =iter(v1)
while
true:
try:
val = v2.__next__
()
(val)
except
stopiterationas e:
break
直到報錯:stoplteration錯誤,表示迭代已經完畢
如何判斷乙個物件是否是迭代器 : 內部是否有__next__
方法
for 迴圈
v1 = [11,22,33,44]#1.內部會將v1轉換成迭代器
#2.內部反覆執行 迭代器.__next__()
#3.取完不報錯
for item in
v1:
print(item)
可迭代物件
Python生成器 迭代器 裝飾器
python生成器 迭代器 裝飾器 最簡單的生成器 g x x for x in range 10 for i in g print i函式方法實現稍複雜的生成器 def fib max n,a,b 0,1,1 while nyield b a,b b,a b n 1 for n in fib 6 ...
python 裝飾器,生成器,迭代器
示例1 無參無返回值 def shuai func 示例2 帶參函式的裝飾器 帶參函式的裝飾器 示例3 帶參有返回值的裝飾器 def zhuangshiqi func 資料量非常小,記憶體占用不大 l i for i in range 10 資料量特別大時,會造成記憶體占用突然增大 l2 i for...
Python裝飾器,迭代器,生成器
1.python裝飾器 由於函式也是乙個物件,而且函式物件可以被賦值給變數,所以,通過變數也能呼叫該函式。所有函式都有乙個 name 屬性,這樣我們就可以那到函式名。現在,假設我們要增強now 函式的功能,比如,在函式呼叫前後自動列印日誌,但又不希望修改now 函式的定義,這種在 執行期間動態增加功...