使用者:Xyy23330121/Python/循環

來自維基學院


Python 中有兩種語句可以用作循環。while 語句需要的基礎較少,只要學會 if 表達式,while 語句就完全是類似的東西。

而 for 語句則涉及到 Python 的可迭代對象。對於 for 語句而言,Python 的 for 語句和 C 語言等語言的、簡單的 for 語句是完全不同的兩個東西。

while 語句[編輯 | 編輯原始碼]

我們先看一個示例:

a = 0
while a < 3:
    print("a 的值为", a)
    a += 1

程序輸出的結果為:

a 的值为 0
a 的值为 1
a 的值为 2

while 語句執行時,只要 while 後面緊跟的表達式返回 True ,就會執行一次後面語句組的語句。在後面語句組的語句執行完後,再進行一次判斷。只要 while 後面緊跟的表達式返回 True ,就會再執行一次後面語句組的語句。

由於 while 語句的上述特性,讀者請一定要注意不要造出「無限循環」來。

類似 if 語句,while 語句也可以放在語句組裡,從而進行嵌套。

break 語句[編輯 | 編輯原始碼]

在循環執行時,如果遇到 break 語句,就會立刻停止循環。我們考慮以下代碼:

b = 0
while b < 2:
    a = 0
    while a < 3:
        print("a 的值为", a)
        if a == 1:
            break
        print("a 的值为", a)
        a += 1
    b += 1

程序輸出的結果為:

a 的值为 0
a 的值为 0
a 的值为 1
a 的值为 0
a 的值为 0
a 的值为 1

a 的值為 1 時,在執行過一次print函數後執行了 break 語句,從而語句組中、所有 break 語句之後的語句都被跳過,並且循環直接結束。break 語句只能跳出最近一層循環,更外層的循環不受影響。

continue 語句[編輯 | 編輯原始碼]

在循環執行時,如果遇到 break 語句,就會立刻跳過該次循環,並進入下一次循環。我們考慮以下代碼:

b = 0
while b < 2:
    a = 0
    while a < 2:
        print("a 的值为", a)
        if a == 0:
            continue
        print("a 的值为", a)
        a += 1
    b += 1

程序輸出的結果為:

a 的值为 0
a 的值为 1
a 的值为 1
a 的值为 0
a 的值为 1
a 的值为 1

a 的值為 1 時,在執行過一次print函數後執行了 continue 語句,從而語句組中、所有 continue 語句之後的語句都被跳過,然後進入下一次循環。continue 語句只能跳過最近一層循環中的一次循環,更外層的循環不受影響。

for 語句[編輯 | 編輯原始碼]

對於可迭代對象,for 語句會按迭代順序,遍歷可迭代對象中的所有元素。我們看以下示例:

for i in "python":
    print(i)

程序輸出的結果為:

p
y
t
h
o
n

在上面代碼中,先檢查可迭代對象的第一個元素。本例中"python"的第一個元素為"p"。於是,Python 先讓i = "p",然後執行語句組。語句組執行完成後,檢查python的下一個元素。下一個元素是"y"。於是,Python 先讓i = "y",然後執行語句組……這一過程直到檢查下一個元素時,發現可迭代對象沒有下一個元素為止。

我們可以在循環結束後,再輸出一遍i的數值,

與 while 語句類似,for 語句中遇到 break 語句時會立即跳出循環、遇到 continue 語句時會立即進行下一次循環。

注意事項[編輯 | 編輯原始碼]

for 語句很難正確地在迭代多項集的同時修改多項集的內容。比如我們要刪除列表中所有的0。

a = [0,0,1,2,0,3,4]
for i in a:
	if i == 0:
		del i
print(a)

由於之前提到的 for 語句的原理,我們每一次循環前,都執行了一遍對i賦值。因此,列表a根本就沒有變!此時用 while 語句更好處理,比如:

a = [0,0,1,2,0,3,4]
i = 0
while i < len(a):
    if a[i] == 0:
        del a[i]
        continue
    i += 1

range 函數[編輯 | 編輯原始碼]

可迭代對象並非只有列表、元組和字符串。range函數可以生成等差數列。我們看以下示例:

for i in range(2):
    print(i)

輸出的結果為:

0
1

我們也可以用list函數將range函數生成的等差數列直接寫出來。

print(list(range(3)))        #[0, 1, 2]
print(list(range(1, 3)))     #[1, 2]
print(list(range(0, 5, 2)))  #[0, 2, 4]
print(list(range(5, 0, -2))) #[5, 3, 1]
print(list(range(0)))        #[]

具體來講,range函數總共有 3 個參數:

  1. 起始值start,默認值為0
  2. 終止值stop,無默認值
  3. 步進step,默認值為1

3 個參數都應當傳入整數,同時step不能為零。當傳入一個參數時,認為傳入的是stop;當傳入兩個參數時,認為按順序傳入的是start, stop;當傳入三個參數時,認為按順序傳入的是start, stop, step。因為stop沒有默認值,至少要傳入一個參數。

在生成等差數列時,如果step大於零,則判斷start < stop。如果為True,則把start添加到數列里。然後判斷start + step是否小於stop……直到start + i * step < stopFalse為止。

如果step小於零,則改為判斷start > stop。然後做類似的操作,直到start + i * step > stopFalse為止。

屬性[編輯 | 編輯原始碼]

range 對象是讀者可以接觸的,第一個具有「屬性」的對象。range有三個屬性:

  1. 起始值start
  2. 終止值stop
  3. 步進step

對應生成 range 對象時的三個參數。知道屬性的名稱後,我們可以用以下方式調用屬性:

a = range(3)
print(a.start)   #输出:0
print(a.stop)    #输出:3
print(a.step)    #输出:1
print(a.start + a.stop - a.step)  #输出:2

提示[編輯 | 編輯原始碼]

我們要對列表內所有元素作操作,有兩種方法。第一種:

for i in list:
    i

和第二種:

for i in range(len(list)):
    list[i]

選擇的原則應當取決於元素的索引是否參與操作。如果元素的索引參與了操作,則應當用第二種方法;如果元素的索引不參與操作,則使用第一種方法更為簡潔。

else[編輯 | 編輯原始碼]

在 for 語句或 while 語句後,可以添加 else 語句。

else 子句將在退出循環時運行,除非退出循環的原因是 break 語句。在用 break 語句退出循環時,else 子句會被跳過。