python 装饰器 生成器 迭代器和闭包
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 inner1.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> StopIteration1.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é)束。
總結(jié)
以上是生活随笔為你收集整理的python 装饰器 生成器 迭代器和闭包的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SpringBoot微信公众号授权访问认
- 下一篇: 深入理解yield from语法