裝飾器
裝飾器的本質就是一個閉包函數,其作用就是在不修改原函數及其調用方式的情況下對原函數功能進行擴展
閉包原理
def wraper(func):
b = '我是b' # 閉包中inner中的b變量先從inner中獲取值,沒有則從wraper中獲取一層層往上找
def inner(a):
print(a,b)
print('before')
ret = func(a)
print('after')
return ret
return inner
@wraper
def show_list(b):
print('show_list')
show_list('我是a')
裝飾器的使用場景
授權:裝飾器能有助於檢查某個人是否被授權去使用一個web應用的端點(endpoint)。它們被大量使用於Flask和Django web框架中
日誌:在記錄日誌的地方添加裝飾器
緩存:通過裝飾器獲取緩存中的值
迭代器
可以被for循環的都是可迭代的 字符串、列表、元組、字典、集合都可以被for循環,說明他們都是可迭代的,將某個數據集內的數據“一個挨着一個的取出來”,就叫做迭代。
from collections import Iterable
l = [1,2,3,4]
t = (1,2,3,4)
d = {1:2,3:4}
s = {1,2,3,4}
print(isinstance(l,Iterable))
print(isinstance(t,Iterable))
print(isinstance(d,Iterable))
print(isinstance(s,Iterable))
結合我們使用for循環取值的現象,再從字面上理解一下,其實迭代就是我們剛剛說的,可以將某個數據集內的數據“一個挨着一個的取出來”,就叫做迭代。
-
可迭代協議
從結果分析原因,能被for循環的就是“可迭代的”,但是for怎麼知道誰是可迭代的呢?
假如我們自己寫了一個數據類型,希望這個數據類型裏的東西也可以使用for被一個一個的取出來,那我們就必須滿足for的要求。這個要求就叫做“協議”。
**可以被迭代要滿足的要求就叫做可迭代協議。**可迭代協議的定義非常簡單,就是內部實現了__iter__方法。
接下來我們就來驗證一下:
可以被for循環的都是可迭代的,要想可迭代,內部必須有一個__iter__方法.
-
迭代協議
'''
dir([1,2].__iter__())是列表迭代器中實現的所有方法,dir([1,2])是列表中實現的所有方法,都是以列表的形式返回給我們的,爲了看的更清楚,我們分別把他們轉換成集合,
然後取差集。
'''
#print(dir([1,2].__iter__()))
#print(dir([1,2]))
print(set(dir([1,2].__iter__()))-set(dir([1,2])))
結果:
{'__length_hint__', '__next__', '__setstate__'}
生成器
生成器可以理解爲一種數據類型,這種數據類型自動實現了迭代器協議(其他數據類型需要調用自己的內置iter方法)
在Python中,一邊循環,一邊計算的機制,稱爲生成器。
我們知道的迭代器有兩種:一種是調用方法直接返回的,一種是可迭代對象通過執行iter方法得到的,迭代器有的好處是可以節省內存。如果在某些情況下,我們也需要節省內存,就只能自己寫。我們自己寫的這個能實現迭代器功能的東西就叫生成器。
Python中提供的生成器:
-
生成器函數:常規函數定義,但是,使用yield語句而不是return語句返回結果。yield語句一次返回一個結果,在每個結果中間,掛起函數的狀態,以便下次重它離開的地方繼續執行
-
生成器表達式:類似於列表推導,但是,生成器返回按需產生結果的一個對象,而不是一次構建一個結果列表
生成器Generator:
本質:迭代器(所以自帶了__iter__方法和__next__方法,不需要我們去實現)
特點:惰性運算,開發者自定義
迭代器和生成器
-迭代器
-可迭代協議--含有iter方法的都可以迭代的
-迭代器協議--含有next和iter的都是迭代器
特點:
-節省內存空間
-方便逐個取值,一個迭代器只能取一次
-生成器
所有的生成器都是迭代器
-含有yield 關鍵字的函數都是生成器函數
-生成器函數特點:
-調用之後函數內的代碼不執行,返回生成器
-每從生成器中取一個值就會執行一段代碼,遇見yield就停止
如何從生成器中取值?
-for : 如果沒有break會一直取完
-next : 每次只取一次
-send: 不能用在一第一個,取下一個值的時候給上一個位置傳一個新的值
- 數據類型強制轉換:會一次性把所有的數據都讀到內存中
生成器表達式:
(條件成立想放在生成器中的值 for i in 可迭代的 if 條件)