日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

python 装饰器 生成器 迭代器和闭包

發(fā)布時間:2025/3/21 python 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python 装饰器 生成器 迭代器和闭包 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1.1裝飾器

a.裝飾器本質(zhì)上是python函數(shù)或類,它可以讓其他函數(shù)或類在不需要做任何代碼修改的前提下增加額外功能, 裝飾器的返回值也是一個函數(shù)/類對象

b.常用的需求場景 插入日志,性能測試, 權(quán)限校驗等場景

(在方法執(zhí)行前后插入代碼片段,以此來增強原有代碼的功能)

#裝飾器模版 def wrapper(fn):def inner(*args, **kwargs):ret = fn(*args, **kwargs)retur retreturn inner

1.2生成器

a.生成器是迭代的一種,使用yield返回值函數(shù),每次調(diào)用yield會暫停,而可以使用next()函數(shù)和send()函數(shù)恢復(fù)生成器

b.python 有兩種不同的方式提供生成器

生成器函數(shù):常規(guī)函數(shù)定義,但是yield語句而不是return語句返回結(jié)果。yield語句一次返回一個結(jié)果,在每一個結(jié)果中間,掛起函數(shù)的狀態(tài),以便下次從它離開的地方繼續(xù)執(zhí)行

生成器表達(dá)式(生成器表達(dá)式是用圓括號括起來的緊湊形式生成器標(biāo)注。 生成器表達(dá)式會產(chǎn)生一個新的生成器對象。 其句法與推導(dǎo)相同,區(qū)別在于它是用圓括號而不是用方括號或花括號括起來的。 在生成器表達(dá)式中使用的變量會在為生成器對象調(diào)用 next() 方法的時候以惰性方式被求值(即與普通生成器相同的方式)

#實際上next()和send()在一定意義上作用是相似的,區(qū)別是send()可以傳遞yield表達(dá)式的值進(jìn)去,而next()不能傳遞特定的值,只能傳遞None進(jìn)去。因此,我們可以看做c.next() 和 c.send(None) 作用是一樣的。 1 def consumer(): 2 r = 'here' 3 while True: 4 n1 = yield r #這里的等式右邊相當(dāng)于一個整體,接受回傳值 5 if not n1: 6 return 7 print('[CONSUMER] Consuming %s...' % n1) 8 r = '%d00 OK' % n1 9 10 def produce(c): 11 aa = c.send(None) 12 n = 0 13 while n < 5: 14 n = n + 1 15 print('[PRODUCER] Producing %s...' % n) 16 r1 = c.send(n) 17 print('[PRODUCER] Consumer return: %s' % r1) 18 c.close() 19 20 c = consumer()

1.3迭代器

a.迭代器協(xié)議是指:對象需要提供next方法,它要么返回迭代中的下一項, 要么引起一個StopIteration異常,以終止迭代

b.可迭代對象就是:實現(xiàn)了迭代器協(xié)議的對象

方法的對象都稱為迭代器

# 具有__iter__方法和 __next__方法的函數(shù) 都可稱為迭代器對象 # __iter__方法 能夠證明為一個可迭代對象 >>> li = [11, 22, 33, 44, 55] >>> li_iter = iter(li) >>> next(li_iter) 11 >>> next(li_iter) 22 >>> next(li_iter) 33 >>> next(li_iter) 44 >>> next(li_iter) 55 >>> next(li_iter) Traceback (most recent call last):File "<stdin>", line 1, in <module> StopIteration

1.4閉包

a.在一個嵌套函數(shù)中,內(nèi)部函數(shù)對外部作用域的變量進(jìn)行引用,那么內(nèi)部函數(shù)就被稱為閉包,閉包是由函數(shù)及其相關(guān)的引用環(huán)境組合而成的實體(閉包=函數(shù)+引用環(huán)境),函數(shù)可以作為另一個函數(shù)的參數(shù)或返回值,可以賦值給一個變量,函數(shù)可以嵌套定義,即在一個函數(shù)內(nèi)部再定義一個函數(shù),有了嵌套函數(shù)這種結(jié)構(gòu),便產(chǎn)生了閉包

在一個外函數(shù)中定義了一個內(nèi)函數(shù),內(nèi)函數(shù)里運用了外函數(shù)的臨時變量,并且外函數(shù)的返回值是內(nèi)函數(shù)的引用。這樣就構(gòu)成了一個閉包。
一般情況下,在我們認(rèn)知當(dāng)中,如果一個函數(shù)結(jié)束,函數(shù)的內(nèi)部所有東西都會釋放掉,還給內(nèi)存,局部變量都會消失。
但是閉包是一種特殊情況,如果外函數(shù)在結(jié)束的時候發(fā)現(xiàn)有自己的臨時變量將來會在內(nèi)部函數(shù)中用到,就把這個臨時變量綁定給了內(nèi)部函數(shù),然后自己再結(jié)束。

# 計算print輸出的結(jié)果 def outer_func():loc_list = []def inner_func(name):loc_list.append(len(loc_list) + 1)print(f'{name} loc_list = {loc_list}')return inner_func clo_func_0 = outer_func() clo_func_0('clo_func_0') clo_func_0('clo_func_0') clo_func_0('clo_func_0') clo_func_1 = outer_func() clo_func_1('clo_func_1') clo_func_0('clo_func_0') clo_func_1('clo_func_1') # 以上代碼執(zhí)行結(jié)果 clo_func_0 loc_list = [1] clo_func_0 loc_list = [1, 2] clo_func_0 loc_list = [1, 2, 3] clo_func_1 loc_list = [1] clo_func_0 loc_list = [1, 2, 3, 4] clo_func_1 loc_list = [1, 2]

總結(jié)

以上是生活随笔為你收集整理的python 装饰器 生成器 迭代器和闭包的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。