python 裝飾器 生成器 迭代器

2022-05-31 10:12:11 字數 2433 閱讀 6850

普通裝飾器編寫的格式

def

外層函式(引數)

def 內層函式(*args,**kwargs)

#函式執行之前

data= 引數(*args,**kwags)

#函式執行之後

return

data

return 內層函式

用法示例:  

def

func(arg):

def inner(*args,**kwargs):

v = arg(*args,**kwargs)

return

v

return

inner

@func

#@裝飾器的語法 : 等價於: index = func(index)

defindex():

print(123)

return 666ret =index()

print

(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

def

func():

print('f1'

)

yield 1

print('f2'

)

yield 2

print('f3'

)#函式內部**不會執行,返回乙個生成器物件

v1 =func()

#生成器可以被for 迴圈,一旦開始迴圈函式內部**就開始執行

for item in

v1:

print

(item)

#f1 1 f2 2 f3

特殊的迭代物件

def

func():

yield 1v =func()

result = v.__iter__

()print(result)

迭代器想要獲取每個元素 : 反覆呼叫val = v1.__next__()

v1 = "

alex

"v2 =iter(v1)

while

true:

try:

val = v2.__next__

()

print

(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 函式的定義,這種在 執行期間動態增加功...