簡述 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM