第七章 用戶輸入和while語句

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

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

    咱們還將學習如何讓程序不斷地運行,讓用戶可以根據須要輸入信息,並在程序中使用這些信息。爲此,咱們須要使用while循環讓程序不斷地運行,直到制定的條件不知足爲止。app

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

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章,咱們將學習函數。函數讓咱們可以將程序分紅不少很小的部分,其中每部分都負責完成一項具體任務。咱們能夠根據須要調用一個函數任意次,還
可將函數存儲在獨立的文件中。使用函數可以讓咱們編寫的代碼效率更高,更容易維護和排除故障,還可在衆多不一樣的程序中重用。




 
 




 
 

 



 


 
 



 















相關文章
相關標籤/搜索