1. 程式人生 > >關於生成器和迭代器

關於生成器和迭代器

首先,我們要討論的三個物件:可迭代物件(iterables)、迭代器(iterator),生成器(generator)。

可迭代物件是每次可以返回一個元素的物件,如list,典型的可迭代物件。

事實上我們用到的很多內建函式,都會返回一個迭代器,如enumerate,zip。迭代器是一種表示資料流的物件,列表只是可迭代物件,不是迭代器,因為他不是資料流。迭代器用iter()函式得到:

  list1=[1,2,3,4]
  list2=iter(list1)
  print(next(list2))
  print(next(list2))
  >>>1
  >>>2

生成器,是用來創造迭代器的一種簡單方式,但不是唯一方式。生成器函式如下:

def range(x):
	i=0
	while i<x:
	yield i
	i+=1

該函式就是一個生成器函式,注意有yield是生成器函式的標誌。呼叫它
range(4)就會返回一個生成器(generator):

 	type(range(4))
 	>>> <class 'generator'>
 	for i in range(4):
 		print(i)

注意:遍歷了生成器元素之後,它裡面就沒有元素了,再用list(range(4))它返回的只能是一個空列表,[ ].
也可以用以下式子得到生成器:

				get_data = (i for i in range(10))
				print(type(get_data))
				>>>  <class 'generator'>

遍歷它來得到其中的元素(只能遍歷一次)。

迭代器也具有同樣的性質,裡面的元素只能用一次:
在這裡插入圖片描述
在這裡插入圖片描述
如圖,把迭代器b變成list後,再去迭代它,什麼都沒有得到。
在這裡插入圖片描述
在這裡插入圖片描述
即使不列印list(b),只要它list化了,迭代器b裡面就已經沒有元素了,所以執行結果為空。

在這裡插入圖片描述
在這裡插入圖片描述
如圖,如果先迭代,再列印list(b),則它沒有元素,得到的是空列表。

注意即使迭代器b裡面沒有元素了,它仍是迭代器:
看這裡


執行結果
可以看到b的元素迭代完之後,得到的只能說空列表,然而b還是那個迭代器(iterator),它的地址沒有變,只是裡面沒有元素了。