python 迭代器 Iterator

1、可迭代對象定義函數

能夠直接做用於for循環的數據類型有如下幾種:spa

一類是集合數據類型,如listtupledictsetstr、bytes、bytearray等;code

一類是generator,包括表達式生成器和帶yield的函數生成器。對象

這些能夠直接做用於for循環的對象統稱爲可迭代對象Iterableblog

2、判斷一個對象是不是可迭代對象generator

 1 >>> from collections import Iterable
 2 >>> isinstance([], Iterable)
 3 True
 4 >>> isinstance({}, Iterable)
 5 True
 6 >>> isinstance(b'abc', Iterable)
 7 True
 8 >>> isinstance((x for x in range(10)), Iterable)
 9 True
10 >>> isinstance(100, Iterable)
11 False

 3、迭代器定義it

生成器不但能夠做用於for循環,還能夠被next()函數不斷調用並返回下一個值,直到最後拋出StopIteration錯誤表示沒法繼續返回下一個值了。io

能夠被next()函數調用並不斷返回下一個值的對象稱爲迭代器Iteratorclass

4、判斷一個對象是不是迭代器import

1 >>> from collections import Iterator
2 >>> isinstance((x for x in range(10)), Iterator)
3 True
4 >>> isinstance([], Iterator)
5 False
6 >>> isinstance({}, Iterator)
7 False
8 >>> isinstance(b'abc', Iterator)
9 False

5、迭代器總結

生成器都是Iterator對象,但listtupledictsetstr、bytes、bytearray等雖然是Iterable,卻不是Iterator

listtupledictsetstr、bytes、bytearrayIterable變成Iterator可使用iter()函數。iter()函數能夠把一個可迭代對象轉換成一個迭代器

1 >>> from collections import Iterator
2 >>> isinstance(iter([]), Iterator)
3 True
4 >>> isinstance(iter(b'abc'), Iterator)
5 True

爲何listdictstr等數據類型不是Iterator

這是由於Python的Iterator對象表示的是一個數據流,Iterator對象能夠被next()函數調用並不斷返回下一個數據,直到沒有數據時拋出StopIteration錯誤。能夠把這個數據流看作是一個有序序列,但咱們卻不能提早知道序列的長度,只能不斷經過next()函數實現按需計算下一個數據,因此Iterator的計算是惰性的,只有在須要返回下一個數據時它纔會計算。

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

凡是可做用於for循環的對象都是Iterable類型;

凡是可做用於next()函數的對象都是Iterator類型,它們表示一個惰性計算的序列;

集合數據類型如listdictstr等是Iterable但不是Iterator,不過能夠經過iter()函數得到一個Iterator對象;

Python的for循環本質上就是經過不斷調用next()函數實現的。

相關文章
相關標籤/搜索