目錄
?編輯
7.2.2 讓用戶選擇何時退出
parrot.py
7.2.3 使用標志
7.2.4 使用 break 退出循環
cities.py
7.2.5 在循環中使用 continue
counting.py
7.2.6 避免無限循環
counting.py
7.3 使用 while 循環來處理列表和字典
7.3.1 在列表之間移動元素
confirmed_users.py
往期快速傳送門👆(在文章最后):
7.2.2 讓用戶選擇何時退出
可使用while循環讓程序在用戶愿意時不斷地運行,如下面的程序parrot.py所示。我們在其中 定義了一個退出值,只要用戶輸入的不是這個值,程序就接著運行:
parrot.py
1 prompt = "\nTell me something, and I will repeat it back to you:"
prompt += "\nEnter 'quit' to end the program. "
2 message = ""
3 while message != 'quit':message = input(prompt)print(message)
在1處,我們定義了一條提示消息,告訴用戶他有兩個選擇:要么輸入一條消息,要么輸 入退出值(這里為'quit')。接下來,我們創建了一個變量——message(見2),用于存儲用戶 輸入的值。我們將變量message的初始值設置為空字符串"",讓Python首次執行while代碼行時有 可供檢查的東西。Python首次執行while語句時,需要將message的值與'quit'進行比較,但此時 用戶還沒有輸入。如果沒有可供比較的東西,Python將無法繼續運行程序。為解決這個問題, 我們必須給變量message指定一個初始值。雖然這個初始值只是一個空字符串,但符合要求,讓 Python能夠執行while循環所需的比較。只要message的值不是'quit',這個循環(見3)就會不 斷運行。
首次遇到這個循環時,message是一個空字符串,因此Python進入這個循環。執行到代碼行 message = input(prompt)時,Python顯示提示消息,并等待用戶輸入。不管用戶輸入是什么,都 將存儲到變量message中并打印出來;接下來,Python重新檢查while語句中的條件。只要用戶輸 入的不是單詞'quit',Python就會再次顯示提示消息并等待用戶輸入。等到用戶終于輸入'quit' 后,Python停止執行while循環,而整個程序也到此結束:
Tell me something, and I will repeat it back to you:
Enter 'quit' to end the program. Hello everyone!
Hello everyone!
Tell me something, and I will repeat it back to you:
Enter 'quit' to end the program. Hello again.
Hello again.
Tell me something, and I will repeat it back to you:
Enter 'quit' to end the program. quit
quit
這個程序很好,唯一美中不足的是,它將單詞'quit'也作為一條消息打印了出來。為修復這 種問題,只需使用一個簡單的if測試:
prompt = "\nTell me something, and I will repeat it back to you:"
prompt += "\nEnter 'quit' to end the program. "
message = ""
while message != 'quit':message = input(prompt)if message != 'quit':
print(message)
現在,程序在顯示消息前將做簡單的檢查,僅在消息不是退出值時才打印它:
Tell me something, and I will repeat it back to you:
Enter 'quit' to end the program. Hello everyone!
Hello everyone!
Tell me something, and I will repeat it back to you:
Enter 'quit' to end the program. Hello again.
Hello again.
Tell me something, and I will repeat it back to you:
Enter 'quit' to end the program. quit
7.2.3 使用標志
在前一個示例中,我們讓程序在滿足指定條件時就執行特定的任務。但在更復雜的程序中, 很多不同的事件都會導致程序停止運行;在這種情況下,該怎么辦呢?
例如,在游戲中,多種事件都可能導致游戲結束,如玩家一艘飛船都沒有了或要保護的城市 都被摧毀了。導致程序結束的事件有很多時,如果在一條while語句中檢查所有這些條件,將既 復雜又困難。
在要求很多條件都滿足才繼續運行的程序中,可定義一個變量,用于判斷整個程序是否處于 活動狀態。這個變量被稱為標志,充當了程序的交通信號燈。你可讓程序在標志為True時繼續運 行,并在任何事件導致標志的值為False時讓程序停止運行。這樣,在while語句中就只需檢查一 個條件——標志的當前值是否為True,并將所有測試(是否發生了應將標志設置為False的事件) 都放在其他地方,從而讓程序變得更為整潔。
下面來在前一節的程序parrot.py中添加一個標志。我們把這個標志命名為active(可給它指 定任何名稱),它將用于判斷程序是否應繼續運行:
prompt = "\nTell me something, and I will repeat it back to you:"
prompt += "\nEnter 'quit' to end the program. "
1 active = True
2 while active:message = input(prompt)
3 if message == 'quit':active = False
4 else:print(message)
我們將變量active設置成了True(見1),讓程序最初處于活動狀態。這樣做簡化了while語 句,因為不需要在其中做任何比較——相關的邏輯由程序的其他部分處理。只要變量active為 True,循環就將繼續運行(見2)。 在while循環中,我們在用戶輸入后使用一條if語句來檢查變量message的值。如果用戶輸入 的是'quit'(見3),我們就將變量active設置為False,這將導致while循環不再繼續執行。如果 用戶輸入的不是'quit'(見4),我們就將輸入作為一條消息打印出來。
這個程序的輸出與前一個示例相同。在前一個示例中,我們將條件測試直接放在了while語句 中,而在這個程序中,我們使用了一個標志來指出程序是否處于活動狀態,這樣如果要添加測試 (如elif語句)以檢查是否發生了其他導致active變為False的事件,將很容易。在復雜的程序中, 如很多事件都會導致程序停止運行的游戲中,標志很有用:在其中的任何一個事件導致活動標志 變成False時,主游戲循環將退出,此時可顯示一條游戲結束消息,并讓用戶選擇是否要重新玩。
7.2.4 使用 break 退出循環
要立即退出while循環,不再運行循環中余下的代碼,也不管條件測試的結果如何,可使用 break語句。break語句用于控制程序流程,可使用它來控制哪些代碼行將執行,哪些代碼行不執 行,從而讓程序按你的要求執行你要執行的代碼。 例如,來看一個讓用戶指出他到過哪些地方的程序。在這個程序中,我們可以在用戶輸入 'quit'后使用break語句立即退出while循環:
cities.py
prompt = "\nPlease enter the name of a city you have visited:"
prompt += "\n(Enter 'quit' when you are finished.) "
1 while True:city = input(prompt)if city == 'quit':break
else:print("I'd love to go to " + city.title() + "!")
以while True打頭的循環(見?)將不斷運行,直到遇到break語句。這個程序中的循環不斷 輸入用戶到過的城市的名字,直到他輸入'quit'為止。用戶輸入'quit'后,將執行break語句,導 致Python退出循環:
Please enter the name of a city you have visited:
(Enter 'quit' when you are finished.) New York
I'd love to go to New York!
Please enter the name of a city you have visited:
(Enter 'quit' when you are finished.) San Francisco
I'd love to go to San Francisco!
Please enter the name of a city you have visited:
(Enter 'quit' when you are finished.) quit
注意 在任何Python循環中都可使用break語句。例如,可使用break語句來退出遍歷列表或字典 的for循環。
7.2.5 在循環中使用 continue
要返回到循環開頭,并根據條件測試結果決定是否繼續執行循環,可使用continue語句,它 不像break語句那樣不再執行余下的代碼并退出整個循環。例如,來看一個從1數到10,但只打印 其中偶數的循環:
counting.py
current_number = 0
while current_number < 10:
1 current_number += 1if current_number % 2 == 0:continueprint(current_number)
我們首先將current_number設置成了0,由于它小于10,Python進入while循環。進入循環后, 我們以步長1的方式往上數(見1),因此current_number為1。接下來,if語句檢查current_number 與2的求模運算結果。如果結果為0(意味著current_number可被2整除),就執行continue語句, 讓Python忽略余下的代碼,并返回到循環的開頭。如果當前的數字不能被2整除,就執行循環中 余下的代碼,Python將這個數字打印出來:
1
3
5
7
9
7.2.6 避免無限循環
每個while循環都必須有停止運行的途徑,這樣才不會沒完沒了地執行下去。例如,下面的 循環從1數到5:
counting.py
x = 1
while x <= 5:print(x)x += 1
但如果你像下面這樣不小心遺漏了代碼行x += 1,這個循環將沒完沒了地運行:
# 這個循環將沒完沒了地運行!
x = 1
while x <= 5:print(x)
在這里,x的初始值為1,但根本不會變,因此條件測試x <= 5始終為True,導致while循環沒 完沒了地打印1,如下所示:
1
1
1
1
--snip--
每個程序員都會偶爾因不小心而編寫出無限循環,在循環的退出條件比較微妙時尤其如此。 如果程序陷入無限循環,可按Ctrl + C,也可關閉顯示程序輸出的終端窗口。
要避免編寫無限循環,務必對每個while循環進行測試,確保它按預期那樣結束。如果你希 望程序在用戶輸入特定值時結束,可運行程序并輸入這樣的值;如果在這種情況下程序沒有結束, 請檢查程序處理這個值的方式,確認程序至少有一個這樣的地方能讓循環條件為False或讓break 語句得以執行。
注意 有些編輯器(如Sublime Text)內嵌了輸出窗口,這可能導致難以結束無限循環,因此不 得不關閉編輯器來結束無限循環。
7.3 使用 while 循環來處理列表和字典
到目前為止,我們每次都只處理了一項用戶信息:獲取用戶的輸入,再將輸入打印出來或作 出應答;循環再次運行時,我們獲悉另一個輸入值并作出響應。然而,要記錄大量的用戶和信息, 需要在while循環中使用列表和字典。
for循環是一種遍歷列表的有效方式,但在for循環中不應修改列表,否則將導致Python難以 跟蹤其中的元素。要在遍歷列表的同時對其進行修改,可使用while循環。通過將while循環同列 表和字典結合起來使用,可收集、存儲并組織大量輸入,供以后查看和顯示。
7.3.1 在列表之間移動元素
假設有一個列表,其中包含新注冊但還未驗證的網站用戶;驗證這些用戶后,如何將他們移 到另一個已驗證用戶列表中呢?一種辦法是使用一個while循環,在驗證用戶的同時將其從未驗 證用戶列表中提取出來,再將其加入到另一個已驗證用戶列表中。代碼可能類似于下面這樣:
confirmed_users.py
# 首先,創建一個待驗證用戶列表
# 和一個用于存儲已驗證用戶的空列表
1 unconfirmed_users = ['alice', 'brian', 'candace']
confirmed_users = []
# 驗證每個用戶,直到沒有未驗證用戶為止
# 將每個經過驗證的列表都移到已驗證用戶列表中
2 while unconfirmed_users:
3 current_user = unconfirmed_users.pop()print("Verifying user: " + current_user.title())
4 confirmed_users.append(current_user)
# 顯示所有已驗證的用戶
print("\nThe following users have been confirmed:")
for confirmed_user in confirmed_users:print(confirmed_user.title())
我們首先創建了一個未驗證用戶列表(見1),其中包含用戶Alice、Brian和Candace,還創 建了一個空列表,用于存儲已驗證的用戶。2處的while循環將不斷地運行,直到列表 unconfirmed_users變成空的。在這個循環中,3處的函數pop()以每次一個的方式從列表 unconfirmed_users末尾刪除未驗證的用戶。由于Candace位于列表unconfirmed_users末尾,因此 其名字將首先被刪除、存儲到變量current_user中并加入到列表confirmed_users中(見4)。接 下來是Brian,然后是Alice。
為模擬用戶驗證過程,我們打印一條驗證消息并將用戶加入到已驗證用戶列表中。未驗證用 戶列表越來越短,而已驗證用戶列表越來越長。未驗證用戶列表為空后結束循環,再打印已驗證 用戶列表: Verifyi
Verifying user: Candace
Verifying user: Brian
Verifying user: Alice
The following users have been confirmed:
Candace
Brian
Alice
Python:核心知識點整理大全12-筆記-CSDN博客