1. 程式人生 > >python入門之叠代器

python入門之叠代器

循環 生成器 作用 ner als exce 實現 ont instance

叠代器

  已知,可以直接作用於for循環的數據類型有:

  一類是集合數據類型,如list、tuple、dict、set、str

  一類是generator,包括生成器和帶yield的generator function

  這些可以直接作用於for循環的對象統稱為可叠代對象:Iterable

判斷是否為可叠代對象:

>>> from collections import Iterable
>>> isinstance([],Iterable)
True
>>> isinstance({},Iterable)
True
>>> isinstance(
abc,Iterable) True >>> isinstance(x*2 for x in range(10),Iterable) True >>> isinstance(100,Iterable) False

  可以被next()函數調用並不斷返回下一個值的對象稱為叠代器:Iterator

判斷是否為叠代器:

>>> from collections import Iterator
>>> isinstance([],Iterator)
False
>>> isinstance({},Iterator)
False
>>> isinstance(abc,Iterator) False >>> isinstance((x*2 for x in range(10)),Iterator) True >>> isinstance(100,Iterator) False

  使用iter()函數可將list、dict、str等Iterable變成Iterator

為什麽list、dict、str等數據類型不是Iterator?

  因為python的Iterator對象表示的是一個數據流,Iterator對象可以被next()函數調用並不斷返回下一個數據,直到沒有數據時拋出StopIteration錯誤,可以把這個數據流看作是一個有序序列,但我們卻不能提前知道序列的長度,只能不斷通過next()函數實現按需計算下一個數據,所以Iterator的計算是惰性的,只有在需要返回下一個數據時它才會計算。

  Iterator可以表示一個無限大的數據流,例如全體自然數,而使用list是永遠不可能存儲全體自然數的。

另外:

  python的for循環本質上就是通過不斷調用next()函數實現的,例如:

    for x in [1,2,3,4,5]:

      pass

  實際上完全等價於:

#首先獲得Iterator對象:
it = iter([1,2,3,4,5])
#循環:
while True:
    try:
        #獲得下一個值
        x = next(it)
    except stopIteration:
        #遇到stopiteration就退出循環
        break

python入門之叠代器