2020年9月22日星期二

007 Python编程 從入門到實踐 第一部分 基礎知識 第 7 章 用戶輸入和while 迴圈

 申明本站飛宇網 https://feiyetopro.blogspot.com/自網路收集整理之書籍文章影音僅供預覽交流學習研究,其[書籍、文章、影音]情節內容, 評論屬其個人行為, 與本網站無關。版權歸原作者和出版社所有,請在下載 24 小時內刪除,不得用作商業用途;如果您喜歡其作品,請支持訂閱購買[正版]謝謝!




7 章 用戶輸入和while 迴圈

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

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

你還將學習如何讓程式不斷地運行,讓使用者能夠根據需要輸入資訊,並在程式中使用這些資訊。為此,你需要使用while 迴圈讓程式不斷地運行,直到指定的條件不滿足為止。

通過獲取使用者輸入並學會控制程式的執行時間,可編寫出互動式程式。

7.1 函數input() 的工作原理

函數input() 讓程式暫停運行,等待使用者輸入一些文本。獲取使用者輸入後,Python將其存儲在一個變數中,以方便你使用。

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

parrot.py

 

message = input("Tell me something, and I will repeat it back to you: ")

print(message)

 

 

 

 

 

 

 

 

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

 

Tell me something, and I will repeat it back to you: Hello everyone!

Hello everyone!

 

 

 

 

 

 

 

 

注意  Sublime Text不能運行提示使用者輸入的程式。你可以使用Sublime Text來編寫提示使用者輸入的程式,但必須從終端運行它們。詳情請參閱1.4節。

7.1.1 編寫清晰的程式

每當你使用函數input() 時,都應指定清晰而易於明白的提示,準確地指出你希望使用者提供什麼樣的資訊——指出使用者該輸入任何資訊的提示都行,如下所示:

greeter.py

 

name = input("Please enter your name: ")

print("Hello, " + name + "!")

 

 

 

 

 

 

 

 

通過在提示末尾(這裡是冒號後面)包含一個空格,可將提示與用戶輸入分開,讓用戶清楚地知道其輸入始於何處,如下所示:

 

Please enter your name: Eric

Hello, Eric!

 

 

 

 

 

 

 

 

有時候,提示可能超過一行,例如,你可能需要指出獲取特定輸入的原因。在這種情況下,可將提示存儲在一個變數中,再將該變數傳遞給函數input() 。這樣,即便提示超過一行,input() 語句也非常清晰。

greeter.py

 

prompt = "If you tell us who you are, we can personalize the messages you see."

prompt += "\nWhat is your first name? "

 

name = input(prompt)

print("\nHello, " + name + "!")

 

 

 

 

 

 

 

 

這個示例演示了一種創建多行字串的方式。第1行將消息的前半部分存儲在變數prompt 中;在第2行中,運算子+= 在存儲在prompt 中的字串末尾附加一個字串。

最終的提示橫跨兩行,並在問號後面包含一個空格,這也是出於清晰考慮:

 

If you tell us who you are, 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? 21

>>> age

'21'

 

 

 

 

 

 

 

 

使用者輸入的是數字21,但我們請求Python提供變數age 的值時,它返回的是'21' ——使用者輸入的數值的字串表示。我們怎麼知道Python將輸入解讀成了字串呢?因為這個數字用引號括起了。如果我們只想列印輸入,這一點問題都沒有;但如果你試圖將輸入作為數位使用,就會引發錯誤:

 

  >>> age = input("How old are you? ")

  How old are you? 21

>>> age >= 18

  Traceback (most recent call last):

    File "<stdin>", line 1, in <module>

TypeError: unorderable types: str() >= int()

 

 

 

 

 

 

 

 

你試圖將輸入用於數值比較時(見),Python會引發錯誤,因為它無法將字串和整數進行比較:不能將存儲在age 中的字串'21' 與數值18 進行比較(見

為解決這個問題,可使用函數int() ,它讓Python將輸入視為數值。函數int() 將數位的字串表示轉換為數值表示,如下所示:

 

  >>> age = input("How old are you? ")

  How old are you? 21

>>> age = int(age)

  >>> age >= 18

  True

 

 

 

 

 

 

 

 

在這個示例中,我們在提示時輸入21 後,Python將這個數位解讀為字串,但隨後int() 將這個字串轉換成了數值表示(見)。這樣Python就能運行條件測試了:將變數age (它現在包含數值21)同18 進行比較,看它是否大於或等於18。測試結果為True 

如何在實際程式中使用函數int() 呢?請看下面的程式,它判斷一個人是否滿足坐過山車的身高要求:

rollercoaster.py

 

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? 71

 

You're tall enough to ride!

 

 

 

 

 

 

 

 

將數值輸入用於計算和比較前,務必將其轉換為數值表示。

7.1.3 求模運算子

處理數值資訊時,求模運算子 %)是一個很有用的工具,它將兩個數相除並返回餘數:

 

>>> 4 % 3

1

>>> 5 % 3

2

>>> 6 % 3

0

>>> 7 % 3

1

 

 

 

 

 

 

 

 

求模運算子不會指出一個數是另一個數的多少倍,而只指出餘數是多少。

如果一個數可被另一個數整除,餘數就為0,因此求模運算子將返回0。你可利用這一點來判斷一個數是奇數還是偶數:

even_or_odd.py

 

number = input("Enter a number, and I'll tell you if it's even or odd: ")

number = int(number)

 

if number % 2 == 0:

    print("\nThe number " + str(number) + " is even.")

else:

    print("\nThe number " + str(number) + " is odd.")

 

 

 

 

 

 

 

 

偶數都能被2整除,因此對一個數(number )和2執行求模運算的結果為零,即number % 2 == 0 ,那麼這個數就是偶數;否則就是奇數。

 

Enter a number, and I'll tell you if it's even or odd: 42

 

The number 42 is even.

 

 

 

 

 

 

 

 

7.1.4 在Python 2.7中獲取輸入

如果你使用的是Python 2.7,應使用函數raw_input() 來提示用戶輸入。這個函數與Python 3中的input() 一樣,也將輸入解讀為字串。

Python 2.7也包含函數input() ,但它將用戶輸入解讀為Python代碼,並嘗試運行它們。因此,最好的結果是出現錯誤,指出Python不明白輸入的代碼;而最糟的結果是,將運行你原本無意運行的代碼。如果你使用的是Python 2.7,請使用raw_input() 而不是input() 來獲取輸入。

動手試一試

7-1 汽車租賃 :編寫一個程式,詢問使用者要租賃什麼樣的汽車,並列印一條消息,如“Let me see if I can find you a Subaru”

7-2 餐館訂位 :編寫一個程式,詢問使用者有多少人用餐。如果超過8人,就列印一條消息,指出沒有空桌;否則指出有空桌。

7-3 10的整數倍 :讓使用者輸入一個數位,並指出這個數位是否是10的整數倍。

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 (代碼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:"

  prompt += "\nEnter 'quit' to end the program. "

message = ""

while message != 'quit':

      message = input(prompt)

      print(message)

 

 

 

 

 

 

 

 

處,我們定義了一條提示消息,告訴使用者他有兩個選擇:要麼輸入一條消息,要麼輸入退出值(這裡為'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 測試:

 

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. "

 

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 時,主遊戲迴圈將退出,此時可顯示一條遊戲結束消息,並讓使用者選擇是否要重新玩。

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.) "

 

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:

     current_number += 1

      if current_number % 2 == 0:

          continue

 

      print(current_number)

 

 

 

 

 

 

 

 

我們首先將current_number 設置成了0,由於它小於10Python進入while 迴圈。進入迴圈後,我們以步長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-4 比薩配料 :編寫一個迴圈,提示用戶輸入一系列的比薩配料,並在用戶輸入'quit' 時結束迴圈。每當用戶輸入一種配料後,都列印一條消息,說我們會在比薩中添加這種配料。

7-5 電影票 :有家電影院根據觀眾的年齡收取不同的票價:不到3歲的觀眾免費;3~12歲的觀眾為10美元;超過12歲的觀眾為15美元。請編寫一個迴圈,在其中詢問用戶的年齡,並指出其票價。

7-6 三個出口 :以另一種方式完成練習7-4或練習7-5,在程式中採取如下所有做法。

·          while 迴圈中使用條件測試來結束迴圈。

·          使用變數active 來控制迴圈結束的時機。

·          使用break 語句在用戶輸入'quit' 時退出迴圈。

7-7 無限迴圈 :編寫一個沒完沒了的迴圈,並運行它(要結束該迴圈,可按Ctrl +C,也可關閉顯示輸出的視窗)。

7.3 使用while 迴圈來處理清單和字典

到目前為止,我們每次都只處理了一項使用者資訊:獲取用戶的輸入,再將輸入列印出來或作出應答;迴圈再次運行時,我們獲悉另一個輸入值並作出回應。然而,要記錄大量的使用者和資訊,需要在while 迴圈中使用清單和字典。

for 迴圈是一種遍歷清單的有效方式,但在for 迴圈中不應修改列表,否則將導致Python難以跟蹤其中的元素。要在遍歷列表的同時對其進行修改,可使用while 迴圈。通過將while 迴圈同清單和字典結合起來使用,可收集、存儲並組織大量輸入,供以後查看和顯示。

7.3.1 在清單之間移動元素

假設有一個列表,其中包含新註冊但還未驗證的網站用戶;驗證這些用戶後,如何將他們移到另一個已驗證用戶列表中呢?一種辦法是使用一個while 迴圈,在驗證用戶的同時將其從未驗證用戶列表中提取出來,再將其加入到另一個已驗證用戶列表中。代碼可能類似於下面這樣:

confirmed_users.py

 

  # 首先,創建一個待驗證用戶列表

  #  和一個用於存儲已驗證使用者的空列表

unconfirmed_users = ['alice', 'brian', 'candace']

  confirmed_users = []

 

  # 驗證每個用戶,直到沒有未驗證用戶為止

  #  將每個經過驗證的列表都移到已驗證用戶列表中

while unconfirmed_users:

     current_user = unconfirmed_users.pop()

 

      print("Verifying user: " + current_user.title())

     confirmed_users.append(current_user)

 

  # 顯示所有已驗證的使用者

  print("\nThe following users have been confirmed:")

  for confirmed_user in confirmed_users:

      print(confirmed_user.title())

 

 

 

 

 

 

 

 

我們首先創建了一個未驗證用戶列表(見),其中包含用AliceBrianCandace,還創建了一個空清單,用於存儲已驗證的使用者。處的while 迴圈將不斷地運行,直到列表unconfirmed_users 變成空的。在這個迴圈中,處的函數pop() 以每次一個的方式從清單unconfirmed_users 末尾刪除未驗證的用戶。由於Candace位於列表unconfirmed_users 末尾,因此其名字將首先被刪除、存儲到變數current_user 中並加入到列表confirmed_users 中(見)。接下來是Brian,然後是Alice

為模擬用戶驗證過程,我們列印一條驗證消息並將使用者加入到已驗證用戶列表中。未驗證用戶列表越來越短,而已驗證用戶列表越來越長。未驗證用戶列表為空後結束迴圈,再列印已驗證用戶列表:

 

Verifying user: Candace

Verifying user: Brian

Verifying user: Alice

 

The following users have been confirmed:

Candace

Brian

Alice

 

 

 

 

 

 

 

 

7.3.2 刪除包含特定值的所有清單元素

在第3章中,我們使用函數remove() 來刪除列表中的特定值,這之所以可行,是因為要刪除的值在列表中只出現了一次。如果要刪除清單中所有包含特定值的元素,該怎麼辦呢?

假設你有一個寵物列表,其中包含多個值為'cat' 的元素。要刪除所有這些元素,可不斷運行一個while 迴圈,直到列表中不再包含值'cat' ,如下所示:

pets.py

 

pets = ['dog', 'cat', 'dog', 'goldfish', 'cat', 'rabbit', 'cat']

print(pets)

 

while 'cat' in pets:

    pets.remove('cat')

 

print(pets)

 

 

 

 

 

 

 

 

我們首先創建了一個列表,其中包含多個值為'cat' 的元素。列印這個列表後,Python進入while 迴圈,因為它發現'cat' 在列表中至少出現了一次。進入這個迴圈後,Python刪除第一個'cat' 並返回到while 代碼行,然後發現'cat' 還包含在列表中,因此再次進入迴圈。它不斷刪除'cat' ,直到這個值不再包含在列表中,然後退出迴圈並再次列印列表:

 

['dog', 'cat', 'dog', 'goldfish', 'cat', 'rabbit', 'cat']

['dog', 'dog', 'goldfish', 'rabbit']

 

 

 

 

 

 

 

 

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

可使用while迴圈提示使用者輸入任意數量的資訊。下面來創建一個調查程式,其中的迴圈每次執行時都提示輸入被調查者的名字和回答。我們將收集的資料存儲在一個字典中,以便將回答同被調查者關聯起來:

mountain_poll.py

 

  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 ---")

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? Eric

Which mountain would you like to climb someday? Denali

Would you like to let another person respond? (yes/ no) yes

 

What is your name? Lynn

Which mountain would you like to climb someday? Devil's Thumb

Would you like to let another person respond? (yes/ no) no

 

--- Poll Results ---

Lynn would like to climb Devil's Thumb.

Eric would like to climb Denali.

 

 

 

 

 

 

 

 

動手試一試

7-8 熟食店 :創建一個名為sandwich_orders 的列表,在其中包含各種三明治的名字;再創建一個名為finished_sandwiches 的空列表。遍歷列表sandwich_orders ,對於其中的每種三明治,都列印一條消息,如I made your tuna sandwich ,並將其移到列表finished_sandwiches 。所有三明治都製作好後,列印一條消息,將這些三明治列出來。

7-9 五香煙熏牛肉(pastrami)賣完了 :使用為完成練習7-8而創建的列表sandwich_orders ,並確保'pastrami' 在其中至少出現了三次。在程式開頭附近添加這樣的代碼:列印一條消息,指出熟食店的五香煙熏牛肉賣完了;再使用一個while 迴圈將列表sandwich_orders 中的'pastrami' 都刪除。確認最終的列表finished_sandwiches 中不包含'pastrami' 

7-10 夢想的度假勝地 :編寫一個程式,調查使用者夢想的度假勝地。使用類似於“If you could visit one place in the world, where would you go?”的提示,並編寫一個列印調查結果的代碼塊。

7.4 小結

在本章中,你學習了:如何在程式中使用input() 來讓使用者提供資訊;如何處理文本和數位輸入,以及如何使用while 迴圈讓程式按使用者的要求不斷地運行;多種控制while 迴圈流程的方式:設置活動標誌、使用break 語句以及使用continue 語句;如何使用while 迴圈在清單之間移動元素,以及如何從清單中刪除所有包含特定值的元素;如何結合使用while 迴圈和字典。

在第8章中,你將學習函數。函數讓你能夠將程式分成多個很小的部分,其中每部分都負責完成一項具體任務。你可以根據需要調用同一個函數任意次,還可將函數存儲在獨立的檔中。使用函數可讓你編寫的代碼效率更高,更容易維護和排除故障,還可在眾多不同的程式中重用。

0 留言:

發佈留言