區分:迭代器Iterator和可迭代對象Iterable 1、可迭代對象Iterable:可以直接作用於for迴圈的對象統稱為可迭代對象 1)可以直接作用於for迴圈的數據類型有以下幾種: 一類是集合數據類型,如list、tuple、dict、set、str等; 一類是生成器generator,包括 ...
區分:迭代器Iterator
和可迭代對象Iterable
1、可迭代對象Iterable:可以直接作用於for
迴圈的對象統稱為可迭代對象
1)可以直接作用於for
迴圈的數據類型有以下幾種:
一類是集合數據類型,如list
、tuple
、dict
、set
、str
等;
一類是生成器generator
,包括生成器和帶yield
的g生成器函數
2)可以使用isinstance()
判斷一個對象是否是Iterable
對象,如:
1 from collections.abc import Iterable 2 3 print(isinstance("abcdefg", Iterable)) 4 print(isinstance([],Iterable)) 5 print(isinstance({},Iterable)) 6 print(isinstance((i for i in range(10)),Iterable)) 7 print(isinstance(100,Iterable)) 8 9 >>> 10 True 11 True 12 True 13 True 14 False
2、迭代器:可以被next()
函數調用並不斷返回下一個值的對象稱為迭代器
1)可以使用isinstance()
判斷一個對象是否是Iterator
對象:
1 from collections import Iterator 2 3 print(isinstance("abcdefg", Iterator)) 4 print(isinstance([],Iterator)) 5 print(isinstance({},Iterator)) 6 print(isinstance((i for i in range(10)),Iterator)) 7 print(isinstance(100,Iterator)) 8 9 >>> 10 False 11 False 12 False 13 True #可見,只有生成器是迭代器對象 14 False
2)生成器都是迭代器對象,但list
、dict
、str
雖然是可迭代對象,卻不是迭代器
但是:可以使用iter()
函數將list
、dict
、str
等可迭代對象
變成迭代器
1 from collections import Iterator 2 3 print(isinstance(iter("abcdefg"), Iterator)) 4 print(isinstance(iter([]),Iterator)) 5 print(isinstance(iter({}),Iterator)) 6 print(isinstance((i for i in range(10)),Iterator)) 7 print(isinstance(100,Iterator)) # 不是可迭代對象,更不是迭代器 8 9 >>> 10 True 11 True 12 True 13 True 14 False
實質上,for迴圈就是通過不斷調用next()
函數實現的
1 for i in [1,2,3,4,5]: 2 print(i) 3 >>> 4 1 5 2 6 3 7 4 8 5 9 10 ######等價於⬇⬇⬇ 11 A = iter([1,2,3,4,5]) 12 while True: 13 try: 14 x = next(A) 15 print(x) 16 except StopIteration: 17 break 18 >>> 19 1 20 2 21 3 22 4 23 5
加餐:
Python的迭代器
對象表示的是一個數據流,迭代器對象可以被next()
函數調用並不斷返回下一個數據,直到沒有數據時拋出StopIteration
錯誤。可以把這個數據流看做是一個有序序列,但我們卻不能提前知道序列的長度,只能不斷通過next()
函數實現按需計算下一個數據,所以迭代器
的計算是惰性的,只有在需要返回下一個數據時它才會計算。迭代器甚至可以表示一個無限大的數據流,例如全體自然數。而使用list是永遠不可能存儲全體自然數的