第七章 用戶輸入和while語句


    大多數編程都旨在解決最終用戶的問題,為此通常需要從用戶那里獲取一些信息。例如,假設有人要判斷自己是否到了投票的年齡,要編寫回答這個問題的程序,就需要知道用戶的年齡,這樣才能給出答案。因此,這種程序需要讓用戶輸入其年齡,再將其與投票年齡進行比較,以判斷用戶是否到了投票的年齡,再給出結果。

    在本章中,我們將學習如何接受用戶輸入,讓程序能夠對其進行處理。在程序需要一個名字時,我們需要提示用戶輸入該名字;程序需要一個名單時。我們需要提示用戶輸入一系列名字。為此,我們需要使用函數input()

    我們還將學習如何讓程序不斷地運行,讓用戶能夠根據需要輸入信息,並在程序中使用這些信息。為此,我們需要使用while循環讓程序不斷地運行,直到制定的條件不滿足為止。

    通過獲取用戶輸入並學會如何控制程序的運行時間,可編寫出交互程序。

7.1  函數input()的工作原理

    函數input()讓程序暫停運行等待用戶輸入一些文本。獲取用戶輸入后,Python將其存儲在一個變量中,以方便我們使用。

    例如,下面的程序讓用戶輸入一些文本,再將這些文本呈現給用戶:

message = input("Tell me something, and I'll repeat it back to you: ")
print(message)
函數input()接受一個參數:既要向用戶顯示的提示或說明,讓用戶知道該如何做。在這個示例中,Python運行第一行代碼時,用戶將看到提示Tell me
something, and I will repeat it back to you:。程序等待用戶輸入,並在用戶按回車鍵后繼續運行。用戶輸入存儲在變量message中,就下來的print(
message)將輸入呈現給用戶:
Tell me something, and I'll repeat it back to you: Hello everyone
Hello everyone

7.1.1 編寫清晰的程序
每當我們使用函數input()時,都應指定清晰而易於明白的指示,准確地指出我們希望用戶提供什么樣的信息——指出用戶該輸入任何信息的提示都行,
如下所示:
name = input("Please inter your name: ")
print("Hello," + name.title()+ "!")
通過在提示末尾(這里是冒號后面)包含一個空格,可將提示與用戶輸入分開,讓用戶清楚地知道其輸入始於何處,如下所示:
Please inter your name: zeng mingzhu
Hello,Zeng Mingzhu !
有時候,提示可能超過一行,例如,我們可能需要指出獲取特定輸入的原因。在這種情況下,可能提示存儲在一個變量中,再將該變量傳遞給函數input()
.這樣,即便提示超過一行,input()語句也非常清晰。
greeter.py

prompt = "If you tell us who are you, we can personalize the messages you see."
prompt += "\nWhat is your first name? "

name = input(prompt)
print('\nHello, ' + name.title())
這個示例演示了一種創建多行字符串的方式。第1行將消息的前半部分存儲在變量prompt中;在第2行中,運算符+=在存儲在prompt中的字符串末尾附加一個
字符串。
最終的提示橫跨兩行,並在問號后面包含一個空格,這也是出於清晰考慮:
If you tell us who are you, we can personalize the messages you see.
What is your first name? eric

Hello, Eric

7.1.2 使用int()來獲取數值輸入
使用函數input()時,Python將用戶輸入解讀為字符串。請看下面讓用戶輸入其年齡的解釋器會話:
>>> age = input("How old are you? ")
How old are you? 25
>>> age
'25'
>>> age > 10
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unorderable types: str() > int()
用戶輸入的是數字21,但我們請求Python提供變量age的值時,它返回的是'21'--用戶輸入的數值的字符串表示。我們怎么知道Python將輸入解讀成了字符串
呢?因為這個數字用引號括起來了。如果我們只想打印輸入,這一點沒有問題;但如果我們試圖將輸入作為數字使用,就會引發錯誤:
>>> age = input("How old are you? ")
How old are you? 30
>>> print("I'm " + age + " years old.")
I'm 30 years old.
>>> age >= 30
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unorderable types: str() >= int()
我們知道在我們進行字符串和數字相加的時候,經常會引發錯誤,提示我們字符串和數字不能相加,但是我們這里向程序輸入了30,但是結果卻可以相加,
這是因為input()函數將用戶輸入的數字當成了字符串,當我們用這個輸入進行比較的時候會發現,也提示了錯誤,字符串不能夠和數字進行比較。這點我們要
牢記,使用函數input()輸入的都是字符串格式
我們試圖將輸入用於數值比較時,Python會引發錯誤,因為它無法將字符串和整數進行比較:不能將存儲在age中的字符串'30'與數值30進行比較。
為解決這個問題,可使用函數int(),它讓Python將輸入視為數值。函數int()將數字的字符串表示轉換為數值表示,如下所示:
>>> age = input("What's your age? ")
What's your age? 25
>>> age = int(age)
>>> age >= 30
False
>>> age <= 18
False
>>> age >= 18
True
在這個示例中,我們在提示時輸入25后,Python將這個數字解讀為字符串,但隨后int()將這個字符串轉換成了數值表示。這樣Python就能運行條件測試了:
將變量age(它現在包含數值21)同18進行比較,看它是否大於或等於18.測試結果為True。
如何在實際程序中使用函數int()呢?(要轉換為數值的時候使用,但不需要轉換的時候就不需要,字符串的格式也免得我們把數值轉換為字符串)請看下面
的程序,它判斷一個人是否滿足坐過山車的身高要求:
#讓用戶輸入自己的身高,並且將輸入的身高轉化為數值,以方便判斷是否滿足條件要求
height = input("How tall are you, in inches? ")
height = int(height)

if height >= 36:
print("\nYou're tall enough to ride!")
else:
print("\nYou'll be able to ride when you're a little older.")
在這個程序中,為何可以將height同36進行比較呢?因為在比較前,height = int(height)將輸入轉換成了數值表示。如果輸入的數字大於或等於36,我
們就告訴用戶他滿足身高條件:
How tall are you, in inches? 40

You're tall enough to ride!
將數值輸入用於計算和比較前,務必將其轉換為數值表示。

7.1.3 求模運算符
處理數值信息時,求模運算符(%)是一個很有用的工具,它將兩個數相處並返回余數:
>>> 4 % 3
1
>>> 5%3
2
>>> 6 % 3
0
>>> 1 % 3
1
>>> 2 % 3
2
>>> 0 % 3
0
求模運算符不會指出一個數是另一個數的多少倍,而只指出余數是多少。
如果一個數可被另一個數整除,余數就為0,因此求模運算符將返回0.我們可以利用這一點來判斷一個數是奇數還是偶數:
even_or_odd.py
number = input("Enter a number, and I will tell you if it's even or odd: ")
number_0 = int(number)

if number_0 % 2 == 0:
print("\nThe number " + number + ' is even.')
else:
print("\nThe number " + number + " is odd.")
 偶數都能被2整除,因此對一個數(number)和2執行求模運算的結果為零,即number % 2 == 0,那么這個數就是偶數;否則就是奇數。
Enter a number, and I will tell you if it's even or odd: 38

The number 38 is even.

總結:其實我們只要牢記一點,就是input()函數獲取用戶輸入得到的是字符串,無論我們輸入什么,都是以字符形式出現的,因此要根據我們的目的,我們
想要以字符形式使用還是數字形式使用,如果以字符形式使用,那么就不用進行轉換,要是以數值形式運用,就行比較,就需要進行轉換才能使用。

動手試一試
7-1 汽車租賃:編寫一個程序,詢問用戶要租賃什么樣的汽車,並打印一條消息,如"Let me see if I can find you a Subaru."
rent_car = input("What kind of car do you need to rent? ")

print("Let me see if I can find you a " + rent_car.title() + ".")

運行結果如下:
What kind of car do you need to rent? audi
Let me see if I can find you a Audi.

7-2 餐館訂位: 編寫一個程序,詢問用戶有多少人用餐。如果超過8個人,就打印一條消息,指出沒有空桌;否則指出有空桌。
persons = input("How many of you have dinner together? ")
persons = int(persons)

if persons > 8 :
print("\nSorry,there's no table.")
else:
print("\nThere's table for yours, come in, please.")
運行結果如下:
How many of you have dinner together? 16

Sorry,there's no table.

7-3 10的整數倍: 讓用戶輸入一個數字,並指出這個數字是否是10的整數倍。
本題主要考察我們求模運算符(%)的使用
number = int(input("Enter a number, and I'll tell you if it's 10 integer times? "))

if number % 10 == 0:
print("\nThe number is 10 integer times.")
else:
print("\nThe number is not 10 integer times.")
運算結果如下:
Enter a number, and I'll tell you if it's 10 integer times? 100

The number is 10 integer times.

7.2 while循環簡介
for循環用於針對集合中的每個元素的一個代碼塊,而while循環不斷地運行,直到指定的條件不滿足為止

7.2.1 使用while循環
我們可以使用while循環來數數,例如,下面的while循環從1數到5:
counting.py
current_number = 1
while current_number <= 5:
print(current_number)
current_number += 1
在第1行,我們將current_number設置為1,從而指定從1開始數。接下來的while循環被設置成這樣:只要current_number小於或等於5,就接着運行這個
循環。循環中的代碼打印current_number的值,再使用代碼current_number += 1將其值加1.
只要滿足條件current_number <= 5 ,Python就接着運行這個循環。由於1小於5,因此Python打印1,並將current_number加1,使其為2,;由於2小於5,
因此Python打印2,並將current_number加1,使其為3,一次類推。一旦current_number大於5,循環將停止,整個程序也將到此結束:
1
2
3
4
5
我們每天使用的程序很可能就包含while循環。例如,游戲使用while循環,確保在玩家想玩時不斷運行,並在玩家想退出時停止運行。如果程序在用戶沒有
讓它停止時就停止運行,或者在用戶要退出時還繼續運行,那就太沒有意思了;有鑒於此,while循環很有用。

7.2.2 讓用戶選擇何時退出
可使用while循環讓程序在用戶願意時不斷地運行,如下面的程序parrot.py所示。我們在其中定義了一個退出值,只要用戶輸入的不是這個值,程序就接着
運行:
parrot.py
prompt = '\nTell me something, and I will repeat it back to you: ' ——(1)
prompt += "\nEnter 'quit' to end the program. "
message = "" ——(2)
while message != 'quit': ——(3)
message = input(prompt)
print(message)
在(1)處,我們定義了一條消息,告訴用戶他有兩個選擇:要么輸入一條消息,要么輸入退出值(這里為'quit')。接下來,我們創建了一個變量——message
用於存儲用戶輸入的值。我們將變量message的初始值設置為空字符串"",讓Python首次執行while代碼時有可供檢查的東西。Python首次執行while語句時,
需要將message的值與'quit'進行比較,但此時用戶還沒有輸入。如果沒有可供比較的東西,Python將無法運行程序。為解決這個問題,我們必須給變量message
指定一個初始值。雖然這個初始值只是一個空字符串,但符合要求,讓Python能夠執行while循環所需的比較。只是message的值不是'quit',這個循環就會不斷
運行。
首次遇到這個循環時,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測試:
propmt = "\nTell me something and I will repeat it back to you: "
propmt += '\nEnter "quit" to end the program. '

message = ''
while message != 'quit':
message = input(propmt)
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. "

active = True
while active:
message = input(prompt)

if message == 'quit':
active = False
else:
print(message)

我們將變量active設置成了True,讓程序最初處於活動狀態。這樣做簡化了while語句,因為不需要在其中做任何比較——相關的邏輯由程序的其他部分
處理。只要變量active為True,循環就將繼續運行。
在while循環中,我們在用戶輸入后使用一條if語句來檢查變量message的值。如果用戶輸入的是'quit',我們就將變量active設置為False,這將導致
while循環不在執行。如果用戶輸入的不是'quit',我們就將輸入作為一條消息打印出來。
這個程序的輸出與前一個示例相同。在前一個示例中,我們將條件測試直接放在了while語句中,而在這個程序中,我們使用了一個標志來指出程序是否處於
活動狀態,這樣如果要添加測試(如elif語句)以檢查是否發生了其他導致active變為False的事件,將很容易。在復雜的程序中,如很多事件都會導致程序停止
運行的游戲中,標志很有用:在其中的任何一個事件導致活動標志變成False時,主游戲循環將退出,此時可顯示一條游戲結束消息,並讓用戶選擇是否要重新玩
標志事件可能有時候很有用,然而不斷如何使用,我們一定要記得,如何開啟while循環,以及如何退出這個循環,不能讓while循環變成死循環,一直不停
的運行,這樣就沒有太多的意義了。

7.2.4 使用break退出循環
立即退出while循環,不再運行循環中余下的代碼,也不管條件測試的結果如何,可使用break語句。break語句用於控制程序流程,可使用它來控制
哪些代碼行將執行,哪些代碼行不執行,從而讓程序按我們的要求執行要執行的代碼。
例如,來看一個讓用戶指出他到過哪些地方的程序。在這個程序中,我們可以在用戶輸入'quit'后使用break語句立即退出while循環:
prompt = '\nPlease enter the name of a city you have visited: '
prompt += "\nEnter 'quit' when you are finished. "

while True:
cities = input(prompt)
if cities == 'quit':
break
else:
print("I'd love to go to " + cities.title() + ".")
以while True打頭的循環將不斷運行,直到遇到break語句。這個程序中的循環不斷輸入用戶到過城市的名字,知道他輸入'quit'為止。用戶輸入'quit'后
,將執行break語句,導致Python退出循環:
Please enter the name of a city you have visited:
Enter 'quit' when you are finished. beijing
I'd love to go to Beijing.

Please enter the name of a city you have visited:
Enter 'quit' when you are finished. seoul
I'd love to go to Seoul.

Please enter the name of a city you have visited:
Enter 'quit' when you are finished. quit

7.2.5 在循環中使用continue
要返回到循環開頭,並根據條件測試結果決定是否繼續執行循環,可使用continue語句,它不像break語句那樣不再執行余下的代碼並退出整個循環。例如
來看一個從1數到10,但只打印其中奇數的循環:
counting.py
current_number = 0
while current_number < 10:
current_number += 1

if current_number % 2 == 0:
continue

print(current_number)
我們首先將current_number設置成了0,由於它小於10,Python進入while循環。進入循環后,我們以步長1的方式往上數,因此current_number為1,接下
來,if語句檢查current_number與2的求模運算結果。如果結果為0(意味着current_number可能被2整除),就執行continue語句,讓Python忽略余下的代碼,並
返回到循環的開頭。如果當前的數字不能被2整除,就執行循環中余下的代碼,Python將這個數字打印出來。
1
3
5
7
9


感悟:第一遍學習的時候我也總是弄錯,感覺continue循環的用處是什么,不也是退出循環的嗎?現在才完全明白,原來continue是退出當前這次循環,不再
執行當前循環continue后面的語句,直接返回循環開頭重新進行判斷,這就要求我們,條件一定是在continue語句前面進行改變,不然條件如果在后面的話,
就會陷入到死循環,因為后面的語句執行不了,這點需要我們注意。下面來重新看一下我們之前的程序,當我們退出的時候會有怎樣的結果:
current_number = 1
while current_number < 10:

if current_number % 2 == 0:
continue

print(current_number)
current_number += 1
如果對上述代碼進行修改,那么就會陷入到一個死循環,第一次打印一個1,然后current_number == 2,那么執行到if語句的時候,求模運算的結果為0,
執行continue語句,跳到循環的開頭,這個時候,current_number還是2,一直這樣執行,陷入到一個死循環過程中。

我們將cities.py的代碼進行簡單修改,把break改成continue,看程序會怎樣:
prompt = '\nPlease enter the name of a city you have visited: '
prompt += "\nEnter 'quit' when you are finished. "

while True:
cities = input(prompt)
if cities == 'quit':
continue
else:
print("I'd love to go to " + cities.title() + ".")
運行結果如下:
Please enter the name of a city you have visited:
Enter 'quit' when you are finished. beijing
I'd love to go to Beijing.

Please enter the name of a city you have visited:
Enter 'quit' when you are finished. shanghai
I'd love to go to Shanghai.

Please enter the name of a city you have visited:
Enter 'quit' when you are finished. quit

Please enter the name of a city you have visited:
Enter 'quit' when you are finished. seoul
I'd love to go to Seoul.

Please enter the name of a city you have visited:
Enter 'quit' when you are finished. quit

Please enter the name of a city you have visited:
Enter 'quit' when you are finished.
當我們輸入信息時,程序運行;當我們輸入退出條件的時候,程序是不執行continue后面的語句了,但是程序繼續運行,從新詢問我們,並沒有停止運行,
這個程序就是一個死循環,不停的運行。沒有終止條件了。

7.2.6 避免無限循環

每個while循環都必須有停止運行的途徑,這樣才不會沒完沒了地執行下去。例如,下面的循環從1數到5:x = 1
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
1
1
1
1
1
1
1
Traceback (most recent call last):
  File "/home/zhuzhu/title7/counting2.py", line 3, in <module>
    print(x)
KeyboardInterrupt
1
每個程序員都會偶爾因不小心而編寫出無限循環,在循環的退出條件比較微妙時尤其如此。如果程序陷入無限循環,可按Ctrl+C,也可關閉顯示程序輸出的
終端窗口。
要避免編寫無限循環,務必對每個while循環進行測試,確保它按預期那樣結束。如果我們希望程序在用戶輸入特定值時結束,可運行程序並輸入這樣的值;
如果在這種情況下程序沒有結束,請檢查程序處理這個值的方式,確認程序至少有一個這樣的地方能讓循環條件為False或讓break語句得以執行。

動手試一試
7-4 比薩配料: 編寫一個循環,提示用戶輸入一系列的比薩配料,並在用戶輸入'quit'時結束循環。每當用戶輸入一種配料后,都打印一條消息,說我們會在
比薩中添加這種配料。
本題考察的是input()函數的應用,還有一循環,因為我們要添加用戶的配料,為了更逼真一點,我們可以添加一個空的列表,用於存放用戶的配料
prompt = "\nPlease enter your choice of pizza ingredients: "
prompt += '\nEnter "quit" to end the program. '

ingredients = []
active = True
while active:
message = input(prompt)
if message == 'quit':
active = False
else:
print("We will add the " + message.title() + " to your pizza.")
ingredients.append(message.title())
print(ingredients)
運行結果如下:
Please enter your choice of pizza ingredients:
Enter "quit" to end the program. pepper
We will add the Pepper to your pizza.

Please enter your choice of pizza ingredients:
Enter "quit" to end the program. pepperoni
We will add the Pepperoni to your pizza.

Please enter your choice of pizza ingredients:
Enter "quit" to end the program. quit
['Pepper', 'Pepperoni']
上述程序,由於語句太長,我們分成兩行,然后把它放到input()函數里面,當做提示語,提示用戶輸入什么信息,如何退出,這樣看起來比較簡介;我們定
義了一個空列表,用戶存放用戶輸入的配料,最后打印出來,看是否有添加進去,我們使用的是標志的方式讓程序運行和結束,本題可以使用直接判斷,或者break
語句都可以完成問題。

7.3 使用while循環來處理列表和字典

到目前為止,我們每次都值處理了一項用戶信息:獲取用戶輸入,再將輸入打印出來或作出應答;循環再次運行時,我們獲悉了另一個輸入值並作出響應。然
而,要記錄大量的用戶和信息,需要在while循環中使用列表和字典。
for循環是一種遍歷列表的有效方式,但在for循環中不應修改列表,否則將導致Python難以跟蹤其中的元素。要在遍歷列表的同時對其進行修改,可使用while
循環。通過將while循環同列表和字典結合起來使用,可收集、存儲並組織大量輸入,供以后查看和顯示。

7.3.1 在列表之間移動元素

假設有一個列表,其中包含新注冊但還為驗證的網站用戶;驗證這些用戶后如何將它們移到另一個已驗證用戶列表中呢?一種辦法是使用while循環,在驗證
用戶的同時將其從未驗證用戶列表中提取出來,再將其加入到另一個已驗證用戶列表中:

#首先,創建一個待驗證用戶列表
#和一個用於存儲已驗證用戶的空列表
unconfirmed_users = ['alice','brian','candace']
confirmed_users = []

#驗證每個用戶,直到沒有為驗證用戶為止
#將每個經過驗證的列表都移到已驗證用戶列表中
while unconfirmed_users:
current_user = unconfirmed_users.pop()

print("Verifying user: " + current_user)
confirmed_users.insert(1,current_user)

#顯示所有已驗證的用戶
print("\nThe following users have been confirmed: ")
for confirmed_user in confirmed_users:
print(confirmed_user.title())
我們首先創建了一個未驗證的用戶列表,其中包含用戶Alice、Brian和Candace,還創建了一個空列表,用戶存儲已驗證的用戶。while循環將不斷地運行,
直到列表unconfirmed_users變成空的,在這個循環中,函數pop()以每次一個的方式從列表unconfirmed_users末尾刪除為驗證的用戶。由於Candance位於列
表unconfirmed_users末尾,因此其名字將首先被刪除、存儲到變量current_user中並加入到列表confirmed_users中。接下來是Brian,然后是Alice。
為模擬用戶驗證過程,我們打印一條驗證消息並將用戶加入到已驗證用戶列表中。未驗證用戶列表越來越短,而已驗證用戶列表越來越長。未驗證用戶列表
為空后結束循環,再打印已驗證用戶列表:
Verifying user: candace
Verifying user: brian
Verifying user: alice

The following users have been confirmed:
Candace
Alice
Brian

7.3.2 刪除包含特定值的所有列表元素

在第三章中,我們使用remove()來刪除列表中的特定值,這只所以可行,是因為要刪除的值在列表中只出現了一次。如果要刪除列表中所有包含特定值的元
原,該怎么辦呢?
假設我們有一個寵物列表,其中包含多個值為'cat'的元素。要刪除所有這些元素,可不斷運行一個while循環,直到列表中不在包含值'cat',如下所示:
pets = ['dog','cat','dog','goldfish','cat','rabbit','cat']

while 'cat' in pets:
pets.remove('cat')

print(pets)
    我們首先創建了一個列表,其中包含多個值為'cat'的元素。打印這個列表后,Python進入while循環,因為它發現'cat'在列表中至少出現了一次。進入這
個循環后,Python刪除第一個'cat',並返回到while代碼行,然后發現'cat'還包含在列表中,因此再次進入循環。它不斷刪除'cat',知道這個值不再包含在
列表中,然后退出循環並再次打印列表。
['dog', 'dog', 'goldfish', 'rabbit']

7.3.3 使用用戶輸入來填充字典

可使用while循環提示用戶輸入任意數量的信息。下面來創建一個調查程序,其中的循環每次執行都提示輸入被調查者的名字和回答。我們將收集的數據存
儲在一個字典中,以便將回答同被調查者關聯起來:
#創建一個空字典,用戶存儲用戶的輸入
responses = {}

#設置一個標志,指出調查是否繼續
polling_active = True

while polling_active:
#提示輸入被調查這的名字和回答
name = input('\nWhat is your name? ')
response = input("Which mountain would you like to climb someday? ")

#將答卷存儲在字典中,字典的表示方法,以及如何向字典中添加新的元素
responses[name] = response

#看看是否還有人要參與調查
repeat = input("Would you like to let another person respond? (yes/no) ")
if repeat == 'no':
polling_active = False

#調查結果,顯示結果
print('\n--- Poll Results ---')
print(responses)
for name,response in responses.items():
print(name + ' would like to climb ' + response + '.')

這個程序首先定義了一個空字典(responses),並設置了一個標志(polling_active),用於指出調查是否繼續。只要polling_active為True,Python就運行
while循環中的代碼。
在這個循環中,提示用戶輸入其用戶名及其喜歡爬哪座山。將這些信息存儲在字典responses中,然后詢問用戶調查是否繼續。如果用戶輸入yes,程序將
再次進入while循環;如果用戶輸入no,標志polling_active將被設置為False,而while循環將就此結束。最后一個代碼塊顯示調查結果。
如果運行這個程序,並輸入一些名字和問答,輸出將類似於下面這樣:
What is your name? zeng
Which mountain would you like to climb someday? taishan
Would you like to let another person respond? (yes/no) yes

What is your name? geng
Which mountain would you like to climb someday? hengshan
Would you like to let another person respond? (yes/no) no

--- Poll Results ---
{'geng': 'hengshan', 'zeng': 'taishan'}
geng would like to climb hengshan.
zeng would like to climb taishan.

動手試一試
7-8 熟食店:創建一個名為Sandwich_orders的列表,在其中包含各種三明治的名字;在創建一個名為finished_sandwiches.所有三明治都制作好后,打印一
條消息,將這些三明治列出來。
本題考察的是while循環對列表的操作,從一個列表中轉移到另外一個列表中
sandwich_orders = ["Tea Sandwiches",'Classic Club Sandwiches','Crilled Cheese Sandwiches','Ham Sandwiches']
finished_sandwiches = []

while sandwich_orders:
current_sandwich = sandwich_orders.pop()
finished_sandwiches.append(current_sandwich)

print(finished_sandwiches)


7-10 夢想的度假勝地:編寫一個程序,調查用戶夢想的度假勝地。使用類似於"if you could visit one place in the world,where would you go?"的
提示,並編寫一個打印調查結果的代碼塊。
#定義一個空的字典,用戶存儲用戶名以及用戶想去的地方
vacationlands = {}

#定義一個標志,用於判斷是否繼續進行調查
visit_active = True
while visit_active:
#提示用戶輸入名字和回答
name = input("\nWhat's your name? ")
response = input("If you could visit one place in the world, where would you go? ")

#將答卷存儲在字典中
vacationlands[name] = response

#看看是否還有人要參與調查
repeat = input("Would you like to let another person respond? (yes/no) ")
if repeat == 'no':
visit_active = False

print(vacationlands)
運行結果如下:
What's your name? zengmingzhu
If you could visit one place in the world, where would you go? seoul
Would you like to let another person respond? (yes/no) yes

What's your name? tom
If you could visit one place in the world, where would you go? london
Would you like to let another person respond? (yes/no) no
{'tom': 'london', 'zengmingzhu': 'seoul'}
7.4 小結

在本章中,我們學習了:如何在程序中使用input()來讓用戶提供信息;如何處理文本和數字輸入,以及如何使用while循環讓程序按用戶的要求不斷地運
行;多種控制while循環流程的方式:設置活動標志、使用break語句以及使用continue語句;如何使用while循環在列表之間移動元素,以及如何從列表中刪除
所有包含特定值的元素;如何結合使用while循環和字典。
在第8章,我們將學習函數。函數讓我們能夠將程序分成很多很小的部分,其中每部分都負責完成一項具體任務。我們可以根據需要調用一個函數任意次,還
可將函數存儲在獨立的文件中。使用函數可讓我們編寫的代碼效率更高,更容易維護和排除故障,還可在眾多不同的程序中重用。




 
 




 
 

 



 


 
 



 
















免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM