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