while循環
while循環是檢測某一個條件,如果條件爲真就執行while命令內的代碼塊。
一般格式
最完整的格式是:首行以及測試表達式,有一列或者多列擁有相同代碼縮進的主體,以及一個可選的else部分。
while <test>:
<statements1>
else: #else部分是循環語句在沒有break語句執行的情況下,離開循環時執行
<statements2>
Python並沒有其他語句中所謂的do….until循環語句。需要達到這種效果,可以藉助break語句。
break,continue,pass和循環else
語句 | 說明 | 備註 |
---|---|---|
break | 跳出最近所在的循環 | 跳過整個循環語句 |
continue | 直接進行循環語句的下次迭代 | 跳到循環語句的開頭處,繼續執行循環 |
pass | 什麼也不做 | 空語句的佔位符 |
循環else | 當循環正常結束,執行else代碼塊 | 正常結束即沒有執行到break語句;沒有執行循環主體語句時,也會執行else部分 |
pass語句通常用於爲複合語句或函數編寫一個空的主體,複合語句或函數在編程後面才實現時,爲了程序不產生語法或其它錯誤,就用pass來跳過改語句或函數的執行,如下:
def fun(): pass while <test>: pass
for循環
for循環是Python中很常用的一個循環,是一個通用的序列迭代器:可以用於迭代任何有序的序列對象內的元素。
一般格式
for <target> in <object>: #每一次迭代<target>就像遊標一樣,取出object中的一個元素,進入循環主體進行處理。
<statements1>
else:
<statements2> #這裏的else模塊與while的else模塊執行規則一致,沒有碰到break語句時執行。
循環編寫技巧
for循環包括多數計數器式的循環。一般而言,for比while容易寫,執行速度也比較快。在某些情況下,你需要某種特定的方式來進行迭代,就可以使用python提供的內置函數:
- 內置函數range返回一些列連續增加的整數,可作爲for中的索引。
- 內置zip函數返回並行元素的元組的組成,可用作for中內遍歷數個序列。
>>> range(6)
range(0, 6)
>>> list(range(6))
[0, 1, 2, 3, 4, 5]
>>> list(range(2,5)) #第一個與第二個元素,提供產生範圍的上下邊界
[2, 3, 4]
>>> list(range(2,5,2))
[2, 4]
>>> list(range(2,10,2)) #第三個參數提供步長
[2, 4, 6, 8]
>>>
並行遍歷:zip和map
內置函數range允許我們在for循環中以非完備的方式遍歷序列。內置的zip函數也讓我們使用for循環來並行使用多個序列。
>>> l1=[1,2,3,4,5]
>>> l2=[6,7,8,9,0]
>>> zip(l1,l2)
<zip object at 0x7f8f149fe7c8>
>>> list(zip(l1,l2))
[(1, 6), (2, 7), (3, 8), (4, 9), (5, 0)]
>>> l2=[6,7,8,9] #注意到當l2列表少一個元素時,zip會將長的列表“裁剪”與短列表一致
>>> list(zip(l1,l2))
[(1, 6), (2, 7), (3, 8), (4, 9)]
>>> for (a,b) in zip(l1,l2): #zip函數的返回對象,可以直接用於循環迭代。
... print(a,b)
...
1 6
2 7
3 8
4 9
>>>
map會帶一個函數和一個序列,將序列中的每一個元素都應用於這個函數,並將函數結果返回。
>>> map(int,'123456')
<map object at 0x7f8f1730f588>
>>> list(map(int,'123456'))
[1, 2, 3, 4, 5, 6]
>>>
用zip函數可以巧妙的構造字典:
>>> l1
[1, 2, 3, 4, 5]
>>> l2
[6, 7, 8, 9]
>>> for (x,y) in zip(l1,l2): D[x]=y #用鍵值方式構建字典時,必須先聲明一個空字典
...
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'D' is not defined
>>> D={}
>>> for (x,y) in zip(l1,l2): D[x]=y
...
>>> D
{1: 6, 2: 7, 3: 8, 4: 9}
>>> D2=dict(zip(l1,l2)) #這是一種更簡單的方法,對dict調用時,實際上得到的是類似列表到字典的轉換
>>> D2
{1: 6, 2: 7, 3: 8, 4: 9}
>>>
產生偏移和元素:enumerate
有些循環,我們需要得到該次迭代在循環體中的偏移量。
>>> for (x,y) in enumerate("abcdefg"): #enumerate返回一個生成器對象,這種對象支持迭代協議
... print("index:",x," ",y) #簡而言之,這個對象會有一個__next__方法,由一個內置函數調用它
...
index: 0 a
index: 1 b
index: 2 c
index: 3 d
index: 4 e
index: 5 f
index: 6 g
>>>
小結
在Python中,循環是很常見的複合語句,本章討論了循環語句,以及循環語句的使用函數與使用技巧。while語句是一個通用的循環語句,for循環設計用來在一個序列中遍歷各個元素(序列需要是真正可迭代的)。zip函數用來循環並行兩個列表。range函數用來生成連續值的,可以用在for語句中進行循環控制。