http(二):headers
1. 生成器定義
生成器可以理解為一種資料型別,這種資料型別自動實現了迭代器協議(其他資料型別需要呼叫自己的內建iter方法)
在Python中,一邊迴圈,一邊計算的機制,稱為生成器。
2. 生成器的作用
1. 通過列表生成式,我們可以直接建立一個列表,但是,受到記憶體限制,列表容量肯定是有限的。
2. 而且,建立一個包含100萬個元素的列表,不僅佔用很大的儲存空間,如果我們僅僅需要訪問前面幾個元素,那後面絕大多數元素佔用的空間都白白浪費了。
3. 所以,如果列表元素可以按照某種演算法推算出來,那我們是否可以在迴圈的過程中不斷推算出後續的元素呢?
4. 這樣就不必建立完整的list,從而節省大量的空間。在Python中,這種一邊迴圈一邊計算的機制,稱為生成器:generator。
3. 生成器工作原理
1)生成器是這樣一個函式,它記住上一次返回時在函式體中的位置。
2)對生成器函式的第二次(或第 n 次)呼叫跳轉至該函式中間,而上次呼叫的所有區域性變數都保持不變。
3)生成器不僅“記住”了它資料狀態;生成器還“記住”了它在流控制構造中的位置。
4)生成器是一個函式,而且函式的引數都會保留。
5)迭代到下一次的呼叫時,所使用的引數都是第一次所保留下的,即是說,在整個所有函式呼叫的引數都是第一次所呼叫時保留的,而不是新建立的
4. yield生成器執行機制
在Python中,yield就是這樣的一個生成器。
1) 當你問生成器要一個數時,生成器會執行,直至出現 yield 語句,生成器把yield 的引數給你,之後生成器就不會往下繼續執行。
2) 當你問他要下一個數時,他會從上次的狀態開始執行,直至出現yield語句,把引數給你,之後停下。如此反覆
3) 在python中,當你定義一個函式,使用了yield關鍵字時,這個函式就是一個生成器
4) 它的執行會和其他普通的函式有很多不同,函式返回的是一個物件,而不是你平常所用return語句那樣,能得到結果值。如果想取得值,那得呼叫next()函式
5) 每當呼叫一次迭代器的next函式,生成器函式執行到yield之處,返回yield後面的值且在這個地方暫停,所有的狀態都會被保持住,直到下次next函式被呼叫,或者碰到異常迴圈退出。
# yield實現fib數
def fib(max_num):
a,b = 1,1
while a < max_num:
yield b
a,b=b,a+b
g = fib(10) #生成一個生成器:[1,2, 3, 5, 8, 13]
print(g.__next__()) #第一次呼叫返回:1
print(list(g)) #把剩下元素變成列表:[2, 3, 5, 8, 13]