python 叠代器之chain
阿新 • • 發佈:2018-05-27
last lin 數據 lan eba pan 產生 clas 下一個 可以被
itertools.chain(*iterables)
可以被next()
函數調用並不斷返回下一個值的對象稱為叠代器:Iterator
。
可以直接作用於for
循環的對象統稱為可叠代對象:Iterable
。
直接作用於for
循環的數據類型有以下幾種:
一類是集合數據類型,如list
、tuple
、dict
、set
、str
等;
一類是generator
,包括生成器和帶yield
的generator function。
集合數據類型如list
、dict
、str
等是Iterable
但不是Iterator
,不過可以通過iter()
函數獲得一個Iterator
對象。
在Python中,這種一邊循環一邊計算的機制,稱為生成器:generator。
>>> g = (x * x for x in range(10)) >>> next(g) 0 >>> next(g) 1 >>> next(g) 4 >>> next(g) 9 >>> next(g) 16 >>> next(g) 25 >>> next(g) 36 >>> next(g) 49 >>> next(g) 64 >>> next(g) 81 >>> next(g) Traceback (most recent call last): File "<stdin>", line 1, in <module> StopIteration
yield在函數中的功能類似於return,不同的是yield每次返回結果之後函數並沒有退出,
而是每次遇到yield關鍵字後返回相應結果,並保留函數當前的運行狀態,等待下一次的調用。
def func():
for i in range(0,3):
yield i
f = func()
f.next()
f.next()
在python 3.x中 generator(有yield關鍵字的函數則會被識別為generator函數)中的next變為__next__了,next是python 3.x以前版本中的方法
itertools.chain(*iterables)
def chain(*iterables):
# chain(‘ABC‘, ‘DEF‘) --> A B C D E F
for it in iterables:
for element in it:
yield element
將多個叠代器作為參數, 但只返回單個叠代器,
它產生所有參數叠代器的內容, 就好像他們是來自於一個單一的序列.
python 叠代器之chain