6.2 迭代
如果給定一個(gè)list
或tuple
,我們可以通過(guò)for
循環(huán)來(lái)遍歷這個(gè)list
或tuple
,這種遍歷我們稱(chēng)為迭代(Iteration)。
在Python中,迭代是通過(guò)for ... in
來(lái)完成的,而很多語(yǔ)言比如C語(yǔ)言,迭代list
是通過(guò)下標(biāo)完成的,比如C代碼:
for (i=0; i<length; i++)
{
? ?n = list[i];?
}
可以看出,Python的for
循環(huán)抽象程度要高于C的for
循環(huán),因?yàn)镻ython的for
循環(huán)不僅可以用在list
或tuple
上,還可以作用在其他可迭代對(duì)象上。
list
這種數(shù)據(jù)類(lèi)型雖然有下標(biāo),但很多其他數(shù)據(jù)類(lèi)型是沒(méi)有下標(biāo)的,但是,只要是可迭代對(duì)象,無(wú)論有無(wú)下標(biāo),都可以迭代,比如dict
就可以迭代:
>>> d = {'a': 1, 'b': 2, 'c': 3}
>>> for key in d:
... ? ?print(key)
...?
a?
c?
b
因?yàn)?code>dict的存儲(chǔ)不是按照list
的方式順序排列,所以,迭代出的結(jié)果順序很可能不一樣。
默認(rèn)情況下,dict
迭代的是key。如果要迭代value,可以用for value in d.values()
,如果要同時(shí)迭代key和value,可以用for k, v in d.items()
。
由于字符串也是可迭代對(duì)象,因此,也可以作用于for
循環(huán):
>>> for ch in 'ABC':
... ? ?print(ch)
...
A?
B?
C
所以,當(dāng)我們使用for
循環(huán)時(shí),只要作用于一個(gè)可迭代對(duì)象,for
循環(huán)就可以正常運(yùn)行,而我們不太關(guān)心該對(duì)象究竟是list
還是其他數(shù)據(jù)類(lèi)型。
那么,如何判斷一個(gè)對(duì)象是可迭代對(duì)象呢?方法是通過(guò)collections.abc
模塊的Iterable
類(lèi)型判斷:
>>> from collections.abc import Iterable
>>> isinstance('abc', Iterable) # str是否可迭代True
>>> isinstance([1,2,3], Iterable) # list是否可迭代True
>>> isinstance(123, Iterable) # 整數(shù)是否可迭代False
最后一個(gè)小問(wèn)題,如果要對(duì)list
實(shí)現(xiàn)類(lèi)似Java那樣的下標(biāo)循環(huán)怎么辦?Python內(nèi)置的enumerate
函數(shù)可以把一個(gè)list
變成索引-元素對(duì),這樣就可以在for
循環(huán)中同時(shí)迭代索引和元素本身:
>>> for i, value in enumerate(['A', 'B', 'C']):
... ? ?print(i, value)?
...
0 A
1 B
2 C
上面的for
循環(huán)里,同時(shí)引用了兩個(gè)變量,在Python里是很常見(jiàn)的,比如下面的代碼:
>>> for x, y in [(1, 1), (2, 4), (3, 9)]:
... ? ?print(x, y)?
...
1 1
2 4
3 9