1. 程式人生 > >簡述 yield和yield from關鍵字

簡述 yield和yield from關鍵字

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