返回目錄html
while僅能用於普通循環,而for除了能夠作循環外,還能夠遍歷序列、集合、字典、迭代器等。python
須要注意的是,在相似:for i in somelist: 的循環中,迭代變量 i 的做用域並不是for語句私有,循環結束後迭代變量依然保留最後一個值。有時候for能夠用於直接迭代對象,以下2個例子所示:app
直接迭代字典函數
for key in d: # 直接對字典進行迭代至關於 for key in d.keys(): print(key, d[key])
直接迭代文件工具
f = open('a.txt') for line in f: # 迭代文件對象中的每一行 print(line)
● breakui
可用於跳出while或for循環。break和下面的continue語句僅應用於正在執行的最內層循環,若是要跳出多層嵌套循環結構,可以使用raise()拋出異常。spa
● continuecode
結束本循環的當前輪,跳到本循環的下一輪開始。htm
● else對象
與while或for循環配對的else代碼段,僅在本循環中沒有調用過break時執行。
for i in range(0,100): if i > 100: break; else: print('running else.') # 結果爲:running else.
● 並行迭代
使用內建zip()函數,它能夠把兩個序列「壓縮」在一塊兒,返回一個元組列表。 當兩個序列長度不等時,以短的那個迭代完就會中止。zip()還支持同時對多個(3個及以上)列表進行迭代。
a = 'abc' b = [1,2,3] for x,y in zip(a,b): print(x,y) # 結果每次迭代依次顯示:a 一、b 二、c 3
以上代碼至關於:
for i in range(min(len(a),len(b)): print(a[i],b[i])
● 編號迭代
使用內建的enumerate()函數,能夠在迭代的同時,同時獲取迭代的次數索引。
a = 'abc' for i,x in enumerate(a): print('i=%d,x=%s' %(i,x)) # 結果依次顯示:i=0,x=a、i=1,x=b、i=2,x=c
● 列表推導(list comprehension)
「列表推導」是利用for循環來快速建立新列表的一種方法。
a. 基本用法:
[ x運算表達式 for x in 迭代器 ]
舉例:
[x*2 for x in range(5)] # 結果生成新序列:[0,2,4,6,8]
b. 條件判斷用法:
每次迭代時,只有當「條件表達式」的值爲真時,纔會對x進行運算,並將結果放入新序列。語法以下:
[ x運算表達式 for x in 迭代器 if 條件表達式 ]
舉例:
[x for x in range(10) if x%2] # 取出range(10)範圍內的全部奇數,結果爲:[1,3,5,7,9]
c. 完整用法:
能夠同時使用多個嵌套的for循環並對每一個循環使用if條件表達式,語法以下:
[ i_1,i_2,...,i_n運算表達式 for i_1 in iter1 if 條件表達式1 for i_2 in iter2 if 條件表達式2 ...... for i_n in itern if 條件表達式n ]
以上語法大體至關於以下等價代碼:
s = [] for i_1 in iter1: if 條件表達式1: for i_2 in iter2: if 條件表達式2: ...... for i_n in itern: if 條件表達式n: s.append(i_1,i_2,...,i_n運算表達式)
舉例:
a = 'abc' b = [1,2,3] [(i1,i2) for i1 in a for i2 in b if i2 % 2] # 結果爲:[('a',1), ('a',3), ('b',1), ('b',3), ('c',1), ('c',3) ]
● 迭代序列解包(sequence unpacking)
當可迭代對象返回元組時,這個特性比較有用。例如須要獲取字典中的鍵-值對時,可以使用序列解包方法:
for k,v in d.items(): # 每次循環同時取出字典中的鍵與值,分別放入k與v中 print(k,v)
可使一個普通對象也支持迭代操做,此時須要爲這個對象實現__iter__()方法和__next__()方法。
● __iter__()方法:
本方法要求返回一個迭代器對象(一般可直接返回對象自身,詳見下例)。
● __next__()方法:
__next__()方法由剛纔經過__iter__()方法返回的迭代器對象進行調用,其做用是計算並返回迭代的下一個對象。當迭代器已迭代完全部的內容時,__next__()方法應該引起一個StopIteration異常,以通知外部的調用者結束迭代。
如下代碼實現一個相似於 「列表[1,2,3,4,5]」 的迭代器:
class MyIterator: v = 0 def __iter__(self): return self def __next__(self): self.v += 1 if self.v > 5: raise StopIteration return self.v myiter = MyIterator() for i in myiter: print(i) # 運行結果爲,依次顯示:一、二、三、四、5
● 迭代的外部原理:
上例中,當運行for語句進行迭代時,等效於運行如下代碼:
_iter = myiter.__iter__() while 1: try: i = _iter.__next__() except StopIteration: break print(i) # 本句即爲 for 循環中用戶本身寫的循環內容
從上面的代碼中能夠看到,迭代是使用__iter__()返回的對象來調用__next__()方法的,因此能夠不必定是self。另外,內置函數iter()能夠從可迭代的對象中得到迭代器,內置函數next()能夠自動訪問可迭代對象的__next__()方法。
所以,上面的第1行和第4行語句可等效爲:
_iter = iter(s) # 至關於 _iter = myiter.__iter__() i = next(_iter) # 至關於 i = _iter.__next__(),甚至直接寫成:i = next(myiter) 也是能夠的
● 將迭代和序列互相轉換:
用list()的構造方法能顯式地將迭代器轉換爲列,也能用內置函數iter()將序列轉換爲迭代器。
# ...... # 前面已定義MyIterator類 myiter = MyIterator() s = list(myiter) print(s) # 結果爲:[1,2,3,4,5]