通過for迴圈來遍歷乙個list或tuple,這種遍歷我們稱為迭代(iteration)。因此,可用於for-in迴圈的物件被稱為可迭代(iterable)物件。例如:前面介紹的python內建的資料結構列表、元組、字典、集合,還有字串、range、生成器都是可迭代物件,而整數型別不是可迭代物件。
如何判斷乙個物件是可迭代物件呢?方法是通過collections模組的iterable型別判斷。
from collections.abc import iterable
print
(isinstance([
1,2,
3],iterable)
)print
(isinstance
(123
,iterable)
)print
(isinstance
('abc'
,iterable)
)print
(isinstance
((i*i for i in
range(1
,11))
,iterable)
)true
false
true
true
如果乙個可迭代物件可以作為內建函式next()的實參從而支援惰性推算,該物件稱為迭代器(iterator)物件。
前面列舉的物件中,只有生成器屬於迭代器物件。
from collections.abc import iterator
print
(isinstance([
1,2,
3],iterator)
)print
(isinstance
(123
,iterator)
)print
(isinstance
('abc'
,iterator)
)print
(isinstance
((i*i for i in
range(1
,11))
,iterator)
)false
false
false
true
呼叫內建函式iter()可以把不支援惰性推算的可迭代物件轉換為迭代器物件。
print
(isinstance
(iter([
1,2,
3]),iterator)
)print
(isinstance
(iter
('abc'
),iterator)
)true
true
print
(next([
1,2,
3]))
typeerror:
'list'
object
isnot an iterator
print
(next
('abc'))
typeerror:
'str'
object
isnot an iterator
print
(next
(iter([
1,2,
3]))
)print
(next
(iter
('abc')))1a
如果乙個物件同時實現了特殊方法__iter__()和__next__(),那麼該物件也被稱為迭代器物件。其中,iter()用於返回乙個可迭代物件,next()用於返回下一次迭代的值,直到丟擲stopiteration錯誤。
python的for迴圈本質上就是通過不斷呼叫next()函式實現的。
class
myiterator
(object):
def__init__
(self)
: self.data=
0def
__iter__
(self)
:return self
def__next__
(self)
:if self.data>=5:
raise stopiteration(
)else
: self.data+=
1return self.data
for item in myiterator():
print
(item)
輸出為
123
45
python的迭代器表示的是乙個元素流,可以被next()函式呼叫並不斷返回下乙個元素,直到沒有元素時丟擲stopiteration錯誤。可以把這個元素流看做是乙個有序序列,但卻不能提前知道序列的長度,只能不斷通過next()函式得到下乙個元素,所以迭代器可以節省記憶體和空間。
最後通過一張圖說明生成式、生成器、迭代器、可迭代物件的關係。
python 從入門到放棄
本人所有關於python的內容均為學習期間的整理的筆記,希望可以給學習者帶來些許幫助!不過一入it深似海!準備入行者請做好充分的心理準備!計算機的知識跟新迭代速度很快,不學習就會被淘汰!如果你打算入行然後找乙份安穩的工作安度餘生,那麼我還是建議去考公務員吧!這個行業可能並不適合你!有不少的人可能都覺...
Python 從入門到放棄(一)
列表 list 和元組 tuple python中有6中內建序列 sequence list,tuple,字串,unicode字串,buffer,xrange。序列和對映是兩種主要的容器 container 序列包括 list 和 tuple 對映包括 dict set 即不是序列又不是對映 序列操...
Python 從入門到放棄(三)
2011 12 11 mon 13 58 直接建立 phonebook phonebook out 224 phonebook dict alice 1234 bob 2345 注意關鍵字不能是expression,不是 alice 而是alice phonebook out 228 或者通過鍵值對...