1. 程式人生 > >寫的比較好的叠代器和生成器

寫的比較好的叠代器和生成器

多線程 return 方法 可叠代對象 簡單 每次 以及 enume 占用內存

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

寫的比較好的叠代器和生成器