python中的迭代器與生成器

一、迭代器

實現一個迭代器,應滿足如下條件:

  • python2中,實現next()方法的類(python3可用__next__()取代)
  • 可變對象,unhashable type
  • 總是返回當前迭代位置之前的值(有限長度的迭代器,無法迭代最後值)
  • 產生StopIteration異常,證明到達迭代器末尾

簡單示例

#!/usr/bin/env python
class SampleIter:
	"""
	sample iterator
	>>> sampleIter = SampleIter()
	>>> sampleIter.next()
	'a'
	>>> sampleIter.next()
	'b'
	>>> sampleIter.next()
	Traceback (most recent call last):
	...
	StopIteration
	"""
	def __init__(self, start='a', end='c'):
		self.next_letter = start
		self.end = end
	def next(self):
		"""In python3, better to use __next__"""
		if self.next_letter == self.end:
			raise StopIteration
		current = self.next_letter
		self.next_letter = chr(ord(current)+1)
		return current

if __name__ == '__main__':
	import doctest
	doctest.testmod()

二、可迭代對象

能被for語句遍歷的對象是可迭代的,一個迭代對象需要實現__iter__方法。

  • 可迭代對象需要在__iter__方法裏返回一個迭代器
  • 同一個可迭代對象可以被迭代多次
  • 通常將迭代器實現爲可迭代對象

簡單示例

class SampleIterable:
	"""
	sample iterator
	>>> sampleIterable = SampleIterable()
	>>> sampleIter = sampleIterable.__iter__()
	>>> sampleIter.next()
	'a'
	>>> sampleIter.next()
	'b'
	>>> sampleIter.next()
	Traceback (most recent call last):
	...
	StopIteration
	>>> for letter in sampleIterable:
	...     letter
	'a'
	'b'
	"""
	def __init__(self, start='a', end='c'):
		self.start = start
		self.end = end
	def __iter__(self):
		return SampleIter(self.start, self.end)

三、生成器

生成器是迭代器的一種類型,不再用return關鍵字返回值,而是用yield關鍵字取代。

  • 當調用包含yield的方法時,並不會直接執行方法,而是返回一個generator對象
  • 函數執行到yield關鍵字的時候,會返回yield後面表達式的值,然後掛起方法直到下一次循環

簡單代碼

def sample_generator():
	"""
	sample generator
	>>> g = (x for x in range(3))
	>>> type(g)
	<type 'generator'>
	>>> d = {}
	>>> d[g] = 1 #no error,hashable type
	>>> type(sample_generator())
	<type 'generator'>
	>>> for letter in sample_generator():
	...     letter
	'a'
	'b'
	"""
	current = 'a'
	while current < 'c':
		yield current
		current = chr(ord(current)+1)

四、總結

       通常,list能完成我們對序列化數據的所有需求。可是當我們處理大數據序列或者無限序列時,list這種將數據直接寫入內存中處理方式就不再適用了。這種情況下,迭代器是一個很好的解決方案——它用一種lazy computation處理方式在需要時生成數據,消耗的內存空間微乎其微。









發佈了28 篇原創文章 · 獲贊 1 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章