Python第18課-while循環
18.1 while 循環簡介
for循環用於針對集合中的每個元素的一個代碼塊,而while循環不斷的運行,直到指定的條件不滿足為止。
18.1.1 使用 while 循環
你可以使用while循環來數數,例如,下面的while循環從1數到5:
# -*- coding:utf-8 -*-
number = 1
while number
print(number)
number += 1
在第一行,我么將number設置為1,從而指定從1開始數。接下來的while循環被設置成這樣:只要number的值小於等於5,就接著運行這個循環。循環中的代碼列印number的值,再使用number += 1將其值加1。
只要滿足條件number
你每天使用的程序很可能就包含while循環。例如,遊戲使用while循環,確保在玩家想玩時不斷運行,並在玩家想退出時停止運行。
18.1.2 讓用戶選擇核實退出
可使用while循環讓程序在用戶願意時不斷的運行,也可讓用戶主動退出程序,如下面的示例,程序中定義了一個退出值,只要用戶輸入的不是這個值,程序就接著運行,否則就直接退出:
parrot.py
# -*- coding:utf-8 -*-
prompt = "
輸入"Q"退出程序。"
prompt += "
請輸入你要檢索的內容: "
message = ""
while message != "Q":
message = input(prompt)
if message != "Q":
print(message)
首次遇到這個循環時,message是一個空字元串,因此Python進入這個循環。執行到代碼行 message = input(prompt) 時,Python顯示提示消息,並等待用戶輸入。不管用戶輸入是什麼,都將存儲到變數message中並列印出來;接下來,Python重新檢查while語句中的條件。只要用戶輸入的不是"Q",Python就會再次顯示提示消息並等待用戶輸入。等到用戶終於輸入"Q"後,Python停止執行while循環,而整個程序也到底結束:
輸入"Q"退出程序。
請輸入你要檢索的內容: Python
Python
輸入"Q"退出程序。
請輸入你要檢索的內容: Python Program
Python Program
輸入"Q"退出程序。
請輸入你要檢索的內容: Q
在循環中,還使用了if語句,這個為了當用戶輸入"Q"時,直接退出程序,而不再列印這個輸入。
18.1.3 使用 break 退出循環
要立即退出while循環,不再運行餘下的代碼,也不管條件測試的結果如何,可使用break語句。break語句用於控制程序流程,可使用它來控制哪些代碼行將執行,哪些代碼行不執行,從而讓程序按你的要求執行你要執行的代碼。
例如,來看一個讓用戶指出他到過哪些地方的程序。在這個程序中,我們可以在用戶輸入"quit"後使用break語句立即退出循環:
cities.py
# -*- coding:utf-8 -*-
prompt = "
輸入"quit"退出程序。"
prompt += "
請輸入你曾到訪過的城市: "
while True:
city = input(prompt)
if city == "quit":
break
else:
print("我曾經到訪過" + city + ".")
以while True 開頭的循環,將不斷運行下去,直到暈倒break語句。這個程序中的循環不斷輸入用戶到訪過的城市,直到他輸入』quit"為止。用戶輸入"quit"後,將執行break語句,導致Python退出循環:
輸入"quit"退出程序。
請輸入你曾到訪過的城市: BeiJing
我曾經到訪過BeiJing.
輸入"quit"退出程序。
請輸入你曾到訪過的城市: ShangHai
我曾經到訪過ShangHai.
輸入"quit"退出程序。
請輸入你曾到訪過的城市: quit
18.1.4 在循環中使用continue
要返回到循環開頭,並根據條件測試結果決定是否繼續執行循環,可使用continue語句,它不像break語句那樣不再執行餘下的代碼並退出整個循環。例如,來看一個從1數到10,但只列印其中奇數的循環:
counting.py
# -*- coding:utf-8 -*-
number = 0
while number < 10:
number += 1
if number % 2 == 0:
continue
print(number)
我們首先將number設置為0,由於它小於10,Python進入while循環。進入循環後,我們以步長1的方式往上數,因此number的值為1。接下來,if語句檢查number與2的求模運算結果。如果結果為0,就執行continue語句,讓Python忽略餘下的代碼,並返回到循環的開頭。如果當前的數字不能被2整除,就執行循環中餘下的代碼,Python將這個數字列印出來:
18.1.5 避免無限循環
每個while循環都必須有停止運行的途徑,這樣才不會沒完沒了的執行下去。例如,下面的循環從1數到5:
x = 1
while x
print(x)
x += 1
但如果你像下面這樣不小心遺漏了代碼行 x += 1,這個循環將永遠執行下去:
x = 1
while x
print(x)
在這裡,x的初始值為1,但根本不會變,因此條件測試 x < = 5 始終未True,導致while循環永遠列印1。
如果不小心陷入了無限循環,可按Ctrl + C 結束循環,或關閉顯示程序輸出的終端窗口。
18.2 使用while循環來處理列表和字典
for循環是一種遍歷列表的有效方式,但在for循環中不應修改列表,否則將導致Python難以跟蹤其中的元素。要在遍歷列表的同時對其進行修改,可使用while循環。通過將while循環同列表和字典結合起來使用,可收集、存儲並組織大量輸入,供以後查看和顯示。
18.2.1 在列表之間移動元素
假設有一個列表,其中包含新註冊但還未驗證的網站用戶;驗證這些用戶後,如何將它們移到另一個已驗證用戶列表中呢?一種方法是使用一個while循環,在驗證用戶的同時將其從未驗證用戶列表提取出來,再將其加入到另一個已驗證用戶列表中。代碼類似於這樣:
# -*- coding:utf-8 -*-
# 創建一個待驗證用戶列表
unconfirmed_users = ["alice", "brian", "candace"]
# 創建一個用於存儲已驗證用戶的空列表
confirmed_users = []
# 驗證每個用戶,直到沒有未驗證用戶為止
while unconfirmed_users:
# 將每個經過驗證的用戶都移到已驗證用戶的列表中
current_user = unconfirmed_users.pop()
print("當前已驗證用戶:" + current_user.title())
confirmed_users.append(current_user)
# 顯示所有已驗證的用戶
print("
以下是已驗證的用戶:")
for confirmed_user in confirmed_users:
print(confirmed_user.title())
我們首先創建了一個未驗證用戶列表,其中包含3個用戶,還創建了一個空列表,用於存儲已驗證的用戶。while循環將不斷運行,直到列表unconfirmed_users 變成空的。在這個循環中,函數pop()以每次一個的方式從列表unconfirmed_users末尾刪除未驗證的用戶,並將其存儲在變數current_user中。
為模擬用戶驗證過程,我們列印一條驗證消息並將用戶加入到已驗證用戶的列表中。未驗證用戶列表越來越短,而已驗證用戶列表越來越長。未驗證用戶列表為空後循環結束,再列印已驗證用戶列表:
當前已驗證用戶:Candace
當前已驗證用戶:Brian
當前已驗證用戶:Alice
以下是已驗證的用戶:
Candace
Brian
Alice
18.2.2 刪除包含特定值的所有列表元素
假設有一個寵物列表,其中包含多個值為"cat"的元素。要刪除所有這些元素,可不斷運行一個while循環,直到列表中不再包含值"cat",如下所示:
# -*- coding:utf-8 -*-
pets = ["dog","cat","dog","goldfish","rabbit","cat","cat"]
print(pets)
while "cat" in pets:
pets.remove("cat")
print(pets)
首先創建了一個列表,其中包含多個值為"cat"的元素。列印這個列表後,Python進入while循環。進入這個循環後,Python刪除第一個"cat"並返回到while代碼行,不斷刪除"cat",直到這個值不包含在列表中,然後退出循環並列印列表:
["dog", "cat", "dog", "goldfish", "rabbit", "cat", "cat"]
["dog", "dog", "goldfish", "rabbit"]
18.2.3 使用用戶輸入來填充字典
可使用while循環提示用戶輸入任意數量的信息。下面來創建一個調查程序,其中的循環每次執行時都提示輸入被調查者的名字和回答。我們將收集的數據存儲在一個字典中,以便將回答同被調查者關聯起來。以下代碼調查用戶喜歡什麼編程語言:
# -*- coding:utf-8 -*-
responses = {}
# 設置一個標誌,指出調查是否繼續,即循環結束是否條件
polling_active = True
while polling_active:
# 提示輸入被調查者的名字和回答
name = input("
請輸入你的名字: ")
response = input("請輸入你的回答: ")
# 將被調查者名字和回答 存儲在字典中
responses[name] = response
# 詢問是否還有人要參與調查
repeat = input("還有人要參與調查嗎?(yes/no)")
if repeat == "no":
polling_active = False
# 調查結束,顯示調查結果
print("
以下是調查結果:")
for name,response in responses.items():
print(name + " 喜歡 " + response + ".")
我們首先定義了一個空字典,並設置了一個標誌,用於指出調查是否繼續。只要這個標誌polling_active為True,就一直運行while循環中的代碼。
在這個循環中,提示用戶輸入其用戶名及其喜歡的編程語言。將這些信息存儲在字典responses中,然後詢問用戶調查是否繼續。如果用戶輸入yes,程序將再次進入while循環,如果用戶輸入的是no,標誌polling_active將被設置為False,而while循環將就此結束。最後一個代碼塊,顯示調查結果。
運行這個程序,並輸入一些名字和回答,輸出類似於下面這樣:
請輸入你的名字: Tom
請輸入你的回答: Python
還有人要參與調查嗎?(yes/no)yes
請輸入你的名字: David
請輸入你的回答: Java
還有人要參與調查嗎?(yes/no)no
以下是調查結果:
Tom 喜歡 Python.
David 喜歡 Java.
18.3 實例練習 - 動手試一試
18.3.1 實例1 - 熟食店
創建一個名為sandwich_orders的列表,在其中包含各種三明治的名字;再創建一個名為finished_sandwiches的空列表。遍歷列表sandwich_orders,對於其中的每種三明治,都列印一條消息,如"我已經做好了榴槤三明治",並將其移到列表finished_sanwiches。所有三明治都製作好後,列印一條消息將這些三明治列出來。
18.3.2 實例2 - 五香煙熏牛肉賣完了
使用上述已經創建的列表sandwich_orders,並確保"pastrami"在其中至少出現3次。在程序開頭附近添加這樣的代碼:列印一條消息,指出熟食店的五香煙熏牛肉賣完了;再使用一個while循環將列表sandwich_orders中的"pastrami"都刪除。確認最終的列表finished_sandwiches中不包含"pastrami"。
18.3.2 夢想的度假勝地
編寫一個程序,調查用戶最想去的度假勝地是哪裡。使用類似於"你最想去哪裡度假?"的提示,並編寫一個列印調查結果的代碼塊。
小額贊助
鼓勵我繼續寫出高質量的內容
如果你覺得有所收穫,不妨小額贊助一下
歡迎加入
Python公開課
※python是什麼語言?現在學Python好找工作嗎?
※Python學習入門第二課:第一個Python程序
TAG:Python |