簡述 yield和yield from關鍵字
阿新 • • 發佈:2018-11-11
1、可迭代物件與迭代器的區別
可迭代物件:指的是具備可迭代的能力,即enumerable. 在Python中指的是可以通過for-in 語句去逐個訪問元素的一些物件,比如元組tuple,列表list,字串string,檔案物件file 等。
迭代器:指的是通過另一種方式去一個一個訪問可迭代物件中的元素,即enumerator。在python中指的是給內建函式iter()傳遞一個可迭代物件作為引數,返回的那個物件就是迭代器,然後通過迭代器的next()方法逐個去訪問。
2、生成器
生成器的本質就是一個逐個返回元素的函式,即“本質——函式”
生成器有什麼好處?
最大的好處在於它是“延遲載入”,即對於處理長序列問題,更加的節省儲存空間。即生成器每次在記憶體中只儲存一個值,比如列印一個斐波拉切數列:原始的方法可以如下所示:
def fab(max):
n, a, b = 0, 0, 1
L = []
while n < max: L.append(b) a, b = b, a + b n = n + 1 return L
這樣做最大的問題在於將所有的元素都儲存在了L裡面,很佔用記憶體,而使用生成器則如下所示
def fab(max):
n, a, b = 0, 0, 1
while n < max:
yield b #每次迭代時值載入這一個元素,而且替換掉之前的那一個元素,這樣就大大節省了記憶體。而且程式在遇見yield語句時會 停下來,這是後面使用yield阻斷原理進行多執行緒程式設計的一個啟發,(python協程程式設計會在後面講到) a, b = b, a + b n = n + 1
生成器其實就是下面這個樣子,寫得簡單一些就是一次返回一條,如下:
def generator():
for i in range(5):
yield i def generator_1(): yield 1 yield 2 yield 3 yield 4 yield 5
上面這兩種方式是完全等價的,只不過前者更簡單一些。
3、什麼又是yield from呢?
簡單地說,yield from generator 。實際上就是返回另外一個生成器。如下所示:
def generator1():
item = range(10)
for i in item: yield i def generator2(): yield 'a' yield 'b' yield 'c' yield from generator1() #yield from iterable本質上等於 for item in iterable: yield item的縮寫版 yield from [11,22,33,44] yield from (12,23,34) yield from range(3) for i in generator2() : print(i)
從上面的程式碼可以看書,yield from 後面可以跟的式子有“ 生成器 元組 列表等可迭代物件以及range()函式產生的序列”
上面程式碼執行的結果為:
a
b
c
0
1
2
3
4
5
6
7
8
9
11
22
33
44
12
23
34
0
1
2