python 装饰器 生成器 迭代器和闭包
1.1裝飾器
a.裝飾器本質上是python函數或類,它可以讓其他函數或類在不需要做任何代碼修改的前提下增加額外功能, 裝飾器的返回值也是一個函數/類對象
b.常用的需求場景 插入日志,性能測試, 權限校驗等場景
(在方法執行前后插入代碼片段,以此來增強原有代碼的功能)
#裝飾器模版 def wrapper(fn):def inner(*args, **kwargs):ret = fn(*args, **kwargs)retur retreturn inner1.2生成器
a.生成器是迭代器的一種,使用yield返回值函數,每次調用yield會暫停,而可以使用next()函數和send()函數恢復生成器
b.python 有兩種不同的方式提供生成器
生成器函數:常規函數定義,但是yield語句而不是return語句返回結果。yield語句一次返回一個結果,在每一個結果中間,掛起函數的狀態,以便下次從它離開的地方繼續執行
生成器表達式(生成器表達式是用圓括號括起來的緊湊形式生成器標注。 生成器表達式會產生一個新的生成器對象。 其句法與推導式相同,區別在于它是用圓括號而不是用方括號或花括號括起來的。 在生成器表達式中使用的變量會在為生成器對象調用 next() 方法的時候以惰性方式被求值(即與普通生成器相同的方式)
#實際上next()和send()在一定意義上作用是相似的,區別是send()可以傳遞yield表達式的值進去,而next()不能傳遞特定的值,只能傳遞None進去。因此,我們可以看做c.next() 和 c.send(None) 作用是一樣的。 1 def consumer(): 2 r = 'here' 3 while True: 4 n1 = yield r #這里的等式右邊相當于一個整體,接受回傳值 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.迭代器協議是指:對象需要提供next方法,它要么返回迭代中的下一項, 要么引起一個StopIteration異常,以終止迭代
b.可迭代對象就是:實現了迭代器協議的對象
方法的對象都稱為迭代器
# 具有__iter__方法和 __next__方法的函數 都可稱為迭代器對象 # __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.在一個嵌套函數中,內部函數對外部作用域的變量進行引用,那么內部函數就被稱為閉包,閉包是由函數及其相關的引用環境組合而成的實體(閉包=函數+引用環境),函數可以作為另一個函數的參數或返回值,可以賦值給一個變量,函數可以嵌套定義,即在一個函數內部再定義一個函數,有了嵌套函數這種結構,便產生了閉包
在一個外函數中定義了一個內函數,內函數里運用了外函數的臨時變量,并且外函數的返回值是內函數的引用。這樣就構成了一個閉包。
一般情況下,在我們認知當中,如果一個函數結束,函數的內部所有東西都會釋放掉,還給內存,局部變量都會消失。
但是閉包是一種特殊情況,如果外函數在結束的時候發現有自己的臨時變量將來會在內部函數中用到,就把這個臨時變量綁定給了內部函數,然后自己再結束。
總結
以上是生活随笔為你收集整理的python 装饰器 生成器 迭代器和闭包的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SpringBoot微信公众号授权访问认
- 下一篇: 深入理解yield from语法