我們已經知道可以對list、tuple、dict、set、str等型別的資料使用for...in...的迴圈語法從其中依次拿到資料進行使用,我們把這樣的過程稱為遍歷,也叫迭代。
把可以通過for...in...這類語句迭代讀取一條資料供我們使用的物件稱之為可迭代物件(iterable)。
在python中,迭代可通過for ... in來完成,例如列表的迭代:
>>> for num in [11, 22 , 33]:...
(num)
...11
2233
list這種資料型別雖然有下標,但很多其他資料型別是沒有下標的,但是,只要是可迭代物件,無論有無下標,都可以迭代,比如dict就可以迭代:
>>> d =>>> for key in
d:...
(key)
...acb
因為dict的儲存不是按照list的方式順序排列,所以,迭代出的結果順序很可能不一樣。
預設情況下,dict迭代的是key。如果要迭代value,可以用for value in d.values(),如果要同時迭代key和value,可以用for k, v in d.items()。
由於字串也是可迭代物件,因此,也可以作用於for迴圈:
>>> for str in'python':
...
(str)
...pyt
hon
2. 如何判斷乙個物件是否可以迭代
可以使用 isinstance() 判斷乙個物件是否是 iterable 物件:
in [50]: from collections importiterable
in [51]: isinstance(, iterable)
out[51]: true
in [52]: isinstance({}, iterable)
out[52]: true
in [53]: isinstance('
abc'
, iterable)
out[53]: true
in [54]: isinstance(mylist, iterable)
out[54]: false
in [55]: isinstance(100, iterable)
out[55]: false
3. 可迭代物件的本質
我們分析對可迭代物件進行迭代使用的過程,發現每迭代一次(即在for...in...中每迴圈一次)都會返回物件中的下一條資料,一直向後讀取資料直到迭代了所有資料後結束。那麼,在這個迭代過程中就應該有乙個「記錄員」去記錄每次訪問到了第幾條資料,以便每次迭代都可以返回下一條資料。我們把這個能幫助我們進行資料迭代的「記錄員」稱為迭代器(iterator)。可迭代物件的本質就是可以向我們提供乙個這樣的「記錄員」即迭代器幫助我們對其進行迭代遍歷使用。
可迭代物件通過__iter__方法向我們提供乙個迭代器,我們在迭代乙個可迭代物件的時候,實際上就是先獲取該物件提供的乙個迭代器,然後通過這個迭代器來依次獲取物件中的每乙個資料。那麼也就是說,乙個具備了__iter__方法的物件,就是乙個可迭代物件。
>>> classmylist(object):
...
def__init__
(self):
... self.container =
...
defadd(self, item):
...
def__iter__
(self):
...
"""返回乙個迭代器
"""...
#我們暫時忽略如何構造乙個迭代器物件
... pass
...>>> mylist =mylist()
>>> from collections import
iterable
>>>isinstance(mylist, iterable)
true
>>>
#這回測試發現新增了__iter__方法的mylist物件已經是乙個可迭代物件了
list、tuple等都是可迭代物件,我們可以通過iter()函式獲取這些可迭代物件的迭代器。然後我們可以對獲取到的迭代器不斷使用next()函式來獲取下一條資料。iter()函式實際上就是呼叫了可迭代物件的__iter__方法。
>>> li = [11, 22, 33, 44, 55]>>> li_iter =iter(li)
>>>next(li_iter)
11>>>next(li_iter)
22>>>next(li_iter)
33>>>next(li_iter)
44>>>next(li_iter)
55>>>next(li_iter)
traceback (most recent call last):
file
"", line 1, in
stopiteration
>>>
注意,當我們已經迭代完最後乙個資料之後,再次呼叫next()函式會丟擲stopiteration的異常,來告訴我們所有資料都已迭代完成,不用再執行next()函式了。
可迭代物件 迭代物件
2.可迭代物件 迭代器物件 滿足可迭代物件前提 可以被迴圈的物件就是可迭代物件 例如 str list tuple set dict range generator 可以使用比較高效的方式判斷某個物件是否是可迭代物件 需要匯入collections模組中的iterable屬性,並且需要配合內建函式i...
關於可迭代物件的詳解
1 可迭代物件是什麼?意思分析 可以重複的迭代的實實在在的東西 專業角度 內部含有 iter 方法的物件,就是可迭代物件 2 可迭代物件都有什麼?list,dict keys values items tuple,str,set,range 3 檢視內建函式內部有哪些方法?print dir str...
可迭代物件
可迭代物件 1.生成器 2.元組 列表 集合 字典 字串 如果判斷乙個物件可迭代?from collections import iterable list1 1,2,3,4,5,6,7,8,9 c isinstance list1,iterable print c 迭代是訪問結合元素的一種方式。迭...