一.迭代對象
1.概念
迭代對象:可以直接作用於for循環的對象統稱為可迭代對象:Iterable。
2.可以直接作用於for循環的數據類型
(1)集合類數據類型,如list, tuple, dict, set, str等
(2)generator,包括生成器和帶yield的generator function.
以上這些直接作用於for循環的對象統稱為可迭代對象:Iterable.
3.判斷一個對象是不是可迭代對象(Iterable)
可以使用isinstance,需要導入模塊
from collections import Iterator
from collections import Iterable
(1)判斷 str 類型是不是可迭代對象
isinstance('',Iterable)
isinstance('abc',Iterable)
print(isinstance('',Iterable)) # True
print(isinstance('abc',Iterable)) # True
(2)判斷 list 類型是不是可迭代對象
isinstance([],Iterable)
isinstance([1,2,3,4],Iterable)
print(isinstance([],Iterable)) # True
print(isinstance([1,2,3,4],Iterable)) # True
(3)判斷 元組 類型是不是可迭代對象
isinstance(tuple(),Iterable)
isinstance((1,2,3,4),Iterable)
print(isinstance(tuple(),Iterable))
print(isinstance((1,2,3,4),Iterable))
(4)判斷 集合 類型是不是可迭代對象
isinstance(set(),Iterable)
isinstance((1,2,3,4),Iterable)
print(isinstance(set(),Iterable)) # True
print(isinstance((1,2,3,4),Iterable)) # True
(5)判斷 字典 類型是不是可迭代對象
isinstance({},Iterable)
isinstance({'name':'wanghua','age':28},Iterable)
print(isinstance({},Iterable)) # True
print(isinstance({'name':'wanghua','age':28},Iterable)) # True
(6)判斷 for 循環是不是可迭代對象
isinstance((x for x in range(10)), Iterable)
print(isinstance((x for x in range(10)), Iterator)) # True
二. 迭代器
1.概念
迭代器:可以被next()函數調用並不斷返回下一個值的對象稱為迭代器:Iterator。
迭代器是在python2.2中被加入的,它為類序列對象提供了一個類序列的接口。有了迭代器可以迭代一個不是序列的對象,因為他表現出了序列的行為。當在python中使用for循環迭代一個對象時,調用者幾乎分辨不出他迭代的是一個迭代器對象還是一個序列對象,因為python讓他(迭代器)像一個序列那樣操作。
2.判斷一個對象是否是迭代器(Iterator). 可以使用isinstance,需要導入模塊from collections import Iterator
3.判斷 for 循環是不是迭代器
isinstance((x for x in range(10)), Iterator)
print(isinstance((x for x in range(10)), Iterator)) # True
成器都是Iterator對象,但list、dict、str雖然是Iterable,卻不是Iterator。
把list、dict、str等Iterable變成Iterator可以使用iter()函數:
>>> isinstance(iter([]), Iterator)
True
>>> isinstance(iter('abc'), Iterator)
True
你可能會問,為什么list、dict、str等數據類型不是Iterator?
這是因為Python的Iterator對象表示的是一個數據流,Iterator對象可以被next()函數調用並不斷返回下一個數據,直到沒有數據時拋出StopIteration錯誤。可以把這個數據流看做是一個有序序列,但我們卻不能提前知道序列的長度,只能不斷通過next()函數實現按需計算下一個數據,所以Iterator的計算是惰性的,只有在需要返回下一個數據時它才會計算。
Iterator甚至可以表示一個無限大的數據流,例如全體自然數。而使用list是永遠不可能存儲全體自然數的