什么是迭代
在一般語(yǔ)言中, 我們通常有這么一種for循環(huán)
for (i=0; i<list.length; i++) {
n = list[i];
}
這種遍歷我們稱之為迭代(Iteration)
但是在python中, 并沒(méi)有提供這樣的for循環(huán), 因此在Python中, 我們通過(guò)for ... in
來(lái)完成迭代, 比如
for i in range(1,100):
if i%7 == 0:
print i,
else:
continue
Python 的 for循環(huán)不僅可以用在list或tuple上,還可以作用在其他任何可迭代對(duì)象上沼填。
因此,迭代操作就是對(duì)于一個(gè)集合嗜逻,無(wú)論該集合是有序還是無(wú)序龙宏,我們用 for 循環(huán)總是可以依次取出集合的每一個(gè)元素。
注意:Python中我們常用的集合包括:
- 有序集合:list杏节,tuple唯竹,str和unicode乐导;
- 無(wú)序集合:set
- 無(wú)序集合并且具有 key-value 對(duì):dict
迭代是一個(gè)動(dòng)詞,它指的是一種操作浸颓,在Python中物臂,就是 for 循環(huán)
索引迭代
Python中,迭代永遠(yuǎn)是取出元素本身产上,而非元素的索引棵磷。
通常情況下我們用for...in
迭代是沒(méi)辦法拿到有序集合的索引的, 但是我們可以通過(guò)enumerate() 函數(shù)拿到有序集合的索引
L = ['Adam', 'Lisa', 'Bart', 'Paul']
for index, name in enumerate(L):
print index, '-', name
0 - Adam
1 - Lisa
2 - Bart
3 - Paul
為什么enumerate() 函數(shù)可以拿到有序集合的索引呢?
enumerate() 函數(shù)把:
['Adam', 'Lisa', 'Bart', 'Paul']
變成了類似:
[(0, 'Adam'), (1, 'Lisa'), (2, 'Bart'), (3, 'Paul')]
因此,迭代的每一個(gè)元素實(shí)際上是一個(gè)tuple, 因此我們最開(kāi)始的代碼相當(dāng)于
for t in enumerate(L):
index = t[0]
name = t[1]
print index, '-', name
迭代dict
迭代dict的value
dict是一個(gè)可迭代對(duì)象, 通常用for循環(huán)迭代dict每次都拿到dict的一個(gè)key
如果我們想迭代dict對(duì)象的value,可以使用 dict 對(duì)象的 values() 方法晋涣,這個(gè)方法把dict轉(zhuǎn)換成一個(gè)包含所有value的list
d = { 'Adam': 95, 'Lisa': 85, 'Bart': 59 }
print d.values()
# [85, 95, 59]
for v in d.values():
print v
# 85
# 95
# 59
dict除了values()方法外仪媒,還有一個(gè) itervalues() 方法,用 itervalues() 方法替代 values() 方法姻僧,迭代效果完全一樣:
d = { 'Adam': 95, 'Lisa': 85, 'Bart': 59 }
print d.itervalues()
# <dictionary-valueiterator object at 0x106adbb50>
for v in d.itervalues():
print v
# 85
# 95
# 59
那這兩個(gè)方法有何不同之處呢规丽?
values() 方法實(shí)際上把一個(gè) dict 轉(zhuǎn)換成了包含 value 的list。
itervalues() 方法不會(huì)轉(zhuǎn)換撇贺,它會(huì)在迭代過(guò)程中依次從 dict 中取出 value赌莺,所以 itervalues() 方法比 values() 方法節(jié)省了生成 list 所需的內(nèi)存。
打印 itervalues() 發(fā)現(xiàn)它返回一個(gè) <dictionary-valueiterator> 對(duì)象松嘶,這說(shuō)明在Python中艘狭,for 循環(huán)可作用的迭代對(duì)象遠(yuǎn)不止 list,tuple翠订,str巢音,unicode,dict等尽超,任何可迭代對(duì)象都可以作用于for循環(huán)官撼,而內(nèi)部如何迭代我們通常并不用關(guān)心
如果一個(gè)對(duì)象說(shuō)自己可迭代,那我們就直接用 for 循環(huán)去迭代它似谁,可見(jiàn)傲绣,迭代是一種抽象的數(shù)據(jù)操作,它不對(duì)迭代對(duì)象內(nèi)部的數(shù)據(jù)有任何要求
迭代dict的key和value
利用dict 對(duì)象的 items() 方法可以同時(shí)迭代dict的key和value
們看看 dict 對(duì)象的 items() 方法返回的值:
d = { 'Adam': 95, 'Lisa': 85, 'Bart': 59 }
print d.items()
[('Lisa', 85), ('Adam', 95), ('Bart', 59)]
可以看到巩踏,items() 方法把dict對(duì)象轉(zhuǎn)換成了包含tuple的list秃诵,我們對(duì)這個(gè)list進(jìn)行迭代,可以同時(shí)獲得key和value:
for key, value in d.items():
print key, ':', value
Lisa : 85
Adam : 95
Bart : 59
和 values() 有一個(gè) itervalues() 類似塞琼, items() 也有一個(gè)對(duì)應(yīng)的 iteritems()菠净,iteritems() 不把dict轉(zhuǎn)換成list,而是在迭代過(guò)程中不斷給出 tuple彪杉,所以毅往, iteritems() 不占用額外的內(nèi)存。