【廖雪峰python入門筆記】迭代
1. 迭代
在Python中,如果給定一個list或tuple,我們可以通過for迴圈來遍歷這個list或tuple,這種遍歷我們成為迭代
(Iteration)。
在Python中,迭代是通過for ... in
來完成的,而很多語言比如C或者Java,迭代list是通過下標完成的,比如Java程式碼
:
for (i=0; i<list.length; i++) {
n = list[i];
}
可以看出,Python的for迴圈抽象程度要高於Java的for迴圈。
因為 Python 的 for迴圈不僅可以用在list或tuple上,還可以作用在其他任何可迭代物件
上。
因此,迭代操作
就是對於一個集合
,無論該集合是有序還是無序,我們用 for 迴圈總是可以依次取出集合的每一個元素。
注意: 集合
是指包含一組元素的資料結構
,我們已經介紹的包括:
1. 有序集合
:list,tuple,str和unicode;
2. 無序集合
:set
3. 無序集合
並且具有key-value
對:dict
而迭代
是一個動詞,它指的是一種操作,在Python中,就是 for 迴圈
。
迭代
與按下標訪問
陣列最大的不同是,後者是一種具體的迭代實現方式,而前者只關心迭代結果,根本不關心迭代內部是如何實現的。
3. 索引迭代
Python中,迭代
永遠是取出元素本身
,而非元素的索引。
對於有序集合
,元素確實是有索引的。有的時候,我們確實想在 for 迴圈中拿到索引,怎麼辦?
方法是使用 enumerate()
函式:
>>> L = ['Adam', 'Lisa', 'Bart', 'Paul']
>>> for index, name in enumerate(L):
print index, '-', name
0 - Adam
1 - Lisa
2 - Bart
3 - Paul
使用 enumerate() 函式,我們可以在for迴圈中同時繫結索引index和元素name。但是,這不是 enumerate() 的特殊語法。實際上
,enumerate() 函式把:
[‘Adam’, ‘Lisa’, ‘Bart’, ‘Paul’]
變成了類似:
[(0, ‘Adam’), (1, ‘Lisa’), (2, ‘Bart’), (3, ‘Paul’)]
因此,迭代的每一個元素實際
上是一個tuple:
for t in enumerate(L):
index = t[0]
name = t[1]
print index, '-', name
如果我們知道每個tuple元素都包含兩個元素,for迴圈又可以進一步簡寫為:
for index, name in enumerate(L):
print index, '-', name
這樣不但程式碼更簡單,而且還少了兩條賦值語句。
可見,索引迭代
也不是真的按索引訪問,而是由 enumerate()
函式自動把每個元素變成 (index, element)
這樣的tuple,再迭代,就同時獲得了索引
和元素本身
。
例項
在迭代 [‘Adam’, ‘Lisa’, ‘Bart’, ‘Paul’] 時,如果我們想列印出名次 - 名字(名次從1開始),請考慮如何在迭代中列印出來。
- 用zip()函式和range()函式替代enumerate()
- zip()函式可以把兩個 list 變成一個 list:
L = ['Adam', 'Lisa', 'Bart', 'Paul']
for index, name in enumerate(L):
print index+1, '-', name
L = ['Adam', 'Lisa', 'Bart', 'Paul']
for index, name in zip(range(1,len(L)+1),L):
print index, '-', name
4.迭代dict的value
我們已經瞭解了dict物件
本身就是可迭代物件
,用 for 迴圈直接迭代 dict,可以每次拿到dict的一個key。
如果我們希望迭代 dict 物件的value
,應該怎麼做?
dict 物件有一個 values()
方法,這個方法把dict轉換成一個包含所有value的list,這樣,我們迭代的就是 dict的每一個 value:
d = { 'Adam': 95, 'Lisa': 85, 'Bart': 59 }
print d.values()
# [85, 95, 59]
for v in d.values():
print v
# 85
# 95
# 59
如果仔細閱讀Python的文件,還可以發現,dict除了values()方法外,還有一個 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
那這兩個方法有何不同之處呢?
values() 方法實際上把一個
dict
轉換成了包含 value 的list
。但是
itervalues()
方法不會轉換,它會在迭代過程中依次從 dict 中取出 value,所以 itervalues() 方法比 values() 方法節省
了生成 list 所需的記憶體
。列印 itervalues() 發現它返回一個 物件,這說明在Python中,for 迴圈可作用的迭代物件遠不止 list,tuple,str,unicode,dict等,任何
可迭代物件
都可以作用於for迴圈
,而內部如何迭代我們通常並不用關心。
如果一個物件說自己可迭代,那我們就直接用 for 迴圈去迭代它,可見,迭代是一種抽象的資料操作
,它不對迭代物件內部的資料有任何要求。
5. 迭代dict的key和value
我們瞭解瞭如何迭代 dict 的key和value,那麼,在一個 for 迴圈中,能否同時
迭代 key和value?答案是肯定的。
首先,我們看看 dict 物件的items()
方法返回的值:
>>> d = { 'Adam': 95, 'Lisa': 85, 'Bart': 59 }
>>> print d.items()
[('Lisa', 85), ('Adam', 95), ('Bart', 59)]
可以看到,items() 方法把dict物件
轉換成了包含tuple的list
,我們對這個list進行迭代,可以同時獲得key和value:
>>> for key, value in d.items():
... print key, ':', value
...
Lisa : 85
Adam : 95
Bart : 59
和 values() 有一個 itervalues() 類似, items() 也有一個對應的 iteritems()
,iteritems() 不把dict轉換成list,而是在迭代過程中不斷給出 tuple
,所以, iteritems() 不佔用額外的記憶體。
相關文章
- 【廖雪峰python入門筆記】dictPython筆記
- 【廖雪峰python入門筆記】setPython筆記
- 【廖雪峰python入門筆記】切片Python筆記
- 【廖雪峰python入門筆記】函式Python筆記函式
- 【廖雪峰python入門筆記】變數Python筆記變數
- 【廖雪峰python入門筆記】if語句Python筆記
- 【廖雪峰python入門筆記】for迴圈Python筆記
- 【廖雪峰python入門筆記】列表生成式Python筆記
- 【廖雪峰python入門筆記】list_建立Python筆記
- 【廖雪峰python入門筆記】tuple_建立Python筆記
- 【廖雪峰python入門筆記】while迴圈Python筆記While
- 【廖雪峰python入門筆記】多重迴圈Python筆記
- 【廖雪峰python入門筆記】break和continuePython筆記
- 【廖雪峰python入門筆記】list刪除元素_pop()Python筆記
- 【廖雪峰python入門筆記】list_替換元素Python筆記
- 【廖雪峰python入門筆記】tuple_“元素可變”Python筆記
- 【廖雪峰python入門筆記】tuple_建立單元素Python筆記
- 【廖雪峰python入門筆記】字串_轉義字元的使用Python筆記字串字元
- 【廖雪峰python入門筆記】raw 字串和多行字串表示Python筆記字串
- 【廖雪峰python入門筆記】整數和浮點數Python筆記
- 【廖雪峰python入門筆記】list_按照索引訪問Python筆記索引
- 【廖雪峰python入門筆記】list_倒序訪問Python筆記
- 【廖雪峰python入門筆記】布林運算和短路計算Python筆記
- 【廖雪峰python入門筆記】list新增元素_append()和insert()Python筆記APP
- 【廖雪峰python進階筆記】模組Python筆記
- 廖雪峰Git教程筆記Git筆記
- 【廖雪峰python入門筆記】Unicode編碼_UnicodeDecodeError處理Python筆記UnicodeError
- 【廖雪峰python進階筆記】定製類Python筆記
- 【廖雪峰python進階筆記】類的繼承Python筆記繼承
- 廖雪峰JS學習總結-入門篇JS
- 【廖雪峰python進階筆記】物件導向程式設計Python筆記物件程式設計
- 【廖雪峰python進階筆記】函數語言程式設計Python筆記函數程式設計
- 廖雪峰Git學習筆記1-Git簡介Git筆記
- 跟著廖雪峰學python 005Python
- Python廖雪峰13個案例講解分析帶你全面入門人工智慧Python人工智慧
- 廖雪峰《Python3 基礎教程》讀書筆記——第一、第二章Python筆記
- 20190228 學習筆記——廖雪峰 git筆記Git
- Python入門筆記Python筆記