用戶:Xyy23330121/Python/循環
Python 中有兩種語句可以用作循環。while 語句需要的基礎較少,只要學會 if 表達式,while 語句就完全是類似的東西。
而 for 語句則涉及到 Python 的可迭代對象。對於 for 語句而言,Python 的 for 語句和 C 語言等語言的、簡單的 for 語句是完全不同的兩個東西。
我們先看一個示例:
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 語句,就會立刻停止循環。我們考慮以下代碼:
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 語句只能跳出最近一層循環,更外層的循環不受影響。
在循環執行時,如果遇到 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 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
函數可以生成等差數列。我們看以下示例:
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 個參數:
- 起始值
start
,默認值為0
- 終止值
stop
,無默認值 - 步進
step
,默認值為1
3 個參數都應當傳入整數,同時step
不能為零。當傳入一個參數時,認為傳入的是stop
;當傳入兩個參數時,認為按順序傳入的是start, stop
;當傳入三個參數時,認為按順序傳入的是start, stop, step
。因為stop
沒有默認值,至少要傳入一個參數。
在生成等差數列時,如果step
大於零,則判斷start < stop
。如果為True
,則把start
添加到數列里。然後判斷start + step
是否小於stop
……直到start + i * step < stop
為False
為止。
如果step
小於零,則改為判斷start > stop
。然後做類似的操作,直到start + i * step > stop
為False
為止。
range
對象是讀者可以接觸的,第一個具有「屬性」的對象。range
有三個屬性:
- 起始值
start
- 終止值
stop
- 步進
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]
選擇的原則應當取決於元素的索引是否參與操作。如果元素的索引參與了操作,則應當用第二種方法;如果元素的索引不參與操作,則使用第一種方法更為簡潔。
在 for 語句或 while 語句後,可以添加 else 語句。
else 子句將在退出循環時運行,除非退出循環的原因是 break 語句。在用 break 語句退出循環時,else 子句會被跳過。