區分:迭代器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是永遠不可能存盤全體自然數的
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/137143.html
標籤:Python
上一篇:自帶函式
