Class - 7 用戶輸入和while循環

7.1 函數input()的工做原理python

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

message = input("Tell me somethhing, and i will repeat it back to you:")
print(message) 輸出: Tell me somethhing, and i will repeat it back to you:Hello! Hello!

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

注意:Sublime Text不能運行提示用戶輸入的程序。能夠Sublime Text來編寫提示用戶輸入的程序,但必須衝終端運行。ide

7.1.1 編寫清晰的程序函數

每當使用函數input()時,都應指定清晰而易於明白的提示,準確地指出你但願用戶提供什麼樣的信息——指出用戶該輸入任何信息的提示都行。例:工具

name = input("Please enter your name: ")
print("Hello,"+ name +"!") 輸出: Please enter your name: Mack Hello,Mack!

經過在提示末尾包含一個空格,可將提示與用戶輸入分開,讓用戶清楚地知道起輸入始於何處。測試

有時候提示可能超過一行,例:你能夠能須要指出獲取特定輸入的緣由。在這種狀況下,可能提示存儲在一個變量中,再將該變量傳遞給函數input()。這樣,即使提示超過一行,input()語句也很是清晰。例:網站

prompt ="If you tell us who you are, we can personalize the message you see."
prompt +="\nWhat is your first name?" name = input(prompt) print("\nHello, "+ name + "!") 輸出: If you tell us who you are, we can personalize the message you see. What is your first name?Mack Hello, Mack!

 該示例演示一種穿件多行字符串的方式。第一行將消息前半部分存儲在prompt中;第二行中,運算符+=在存儲在prompt中國的字符串末尾附件一個字符串。最終的提示跨兩行,並在問號後面包含一個空格,也是出於清晰考慮。ui

7.1.2 使用int() 來獲取數值輸入spa

使用函數input()時,python將用戶輸入解讀Wie字符串。列:

>>> 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同18進行比較。

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 order.") 輸出: How tall are you,in inches? 26 You'll be able to ride when you're a little order.

爲什麼能夠將height與36比較?由於再叫前,height = int(height)將輸入轉換成數值表示。若是輸入數字小於36,就輸出用戶知足的身高條件

注意:將數值輸入用於計算和比較前,必須將其轉換成數值表示。

7.1.3 求模運算符

處理信息時,求模運算符(%)是一個頗有用的工具,它將兩個數相處並返回餘數。求模運算符不會指出一個數是另一個數的多少倍,只指出餘數是多少。

number = input("Enter a umber, ane 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.") 輸出: Enter a umber, ane i'll tell you if it's even or odd: 5 The number 5 is odd.

偶數都能被2整除,所以對一個數(number)和2執行求模運算的結果爲零,即number % 2 ==0,那麼這個數就是偶數;不然就是奇數。

7.1.4 在python 2.7中獲取輸入

若是你使用的是python2.7版本,應使用函數raw_input輸入來提示用戶輸入。這個函數與python3中的input()同樣,將數解讀爲字符串。

7.2 while循環

for 循環用於針對集合中的每一個元素的一個代碼塊,而while循環不斷的運行,直到指定的條件知足爲止。

7.2.1 使用while循環

current_number = 1
while current_number <=3:
    print(current_number) current_number +=1 輸出: 1 2 3

在第一行中,將current_number設置爲1,從而指定從1開始數。接下來的while循環被設置:只要current_number小於或者等於3,就接着運行循環。循環中的代碼輸出current_number的值,再使用代碼current_number +=1(代碼current_number = current_number + 1的簡寫)將其值加1.

只要知足條件current_number <= 3, python就接着循環。一直相加輸出,一旦current_number 大於3,循環中止,程序結束。

7.2.2 讓用戶選擇什麼時候退出

可以使用while循環讓程序在用戶願意時不斷運行。其中定義一個退出值,只要用戶輸入的不是這個值,程序就繼續運行:

prompt = "\nTell me something, anfd i will repeat it back to you:"
prompt += "\nEnter 'quit' to end the program. " message = "" while message != 'quit': message = input(prompt) print(message) 輸出: Tell me something, anfd i will repeat it back to you: Enter 'quit' to end the program. quit quit

定義一條提示消息,告訴用戶兩個選擇:要麼輸入一條消息,要不輸入退出值(此處爲quit)。接下來,建立一個變量-message用於存儲用戶輸入的值。咱們將變量message的初始值設置爲空字符串「 」,讓python首次執行while代碼行時有可供檢查的東西。python首次執行while語句時,須要將message的值與‘quit’進行比較,但此時用戶尚未輸入。若是沒有可供比較的東西,python將沒法繼續運行程序。爲解決這問題,必須給別按了message指定一個初始值。雖然作這個初始值只是一個空字符串,但符合要求,讓python執行while循環所需的比較。只要message的值不是quit,這個循環就會不斷的運行。

 首次遇到這個循環時,message是一個空字符串,所以python進入這個循環。執行到代碼行message = input(prompt)時,python顯示提示消息,並等待yoghurt輸入。不遠用戶輸入什麼,都將存儲到變量message中b並輸出;接下來,python從新檢查while語句中的條件。只要用戶輸入的單詞不是quit,python就會再次顯示提示消息並等待用戶輸入。等到用戶終於輸入quit後,python中止執行while循環,而整個程序到此結束。

若是在中止時,不須要輸出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. yes yes 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的事件)都凡在其餘地方,從而讓程序變得更爲整潔。

咱們在程序中添加一個標誌。把這個標誌命名爲active,它將應予判斷程序是否應繼續運行:

prompt ="If you tell us who you are, we can personalize the message you see."
prompt +="\nWhat is your first name?" active = True while active: message = input(prompt) if message == 'quit': active = False else: print(message) 輸出: If you tell us who you are, we can personalize the message you see. What is your first name? Mack Mack If you tell us who you are, we can personalize the message you see. What is your first name?quit

 咱們將變量active設置成True,讓程序最初處於活動狀態。這樣減緩while語句,由於不須要在其中作任何比較——行管的邏輯有程序的其餘部分處理。只要在變量active爲True,循環while語句就將繼續運行。

在while循環中,咱們在用戶輸入後使用一條if語句來檢查變量message的值。若是用戶輸入的是‘quit’(if語句),我就將變量active設置爲False,這將致使while循環再也不繼續執行。若是用戶輸入的不是quit,咱們將輸入做爲一條消息輸出出來。

上個示例中,咱們將條件測試直接放在while語句中,在這個程序中,使用一個標誌來指出程序是否處於活動狀態,這樣若是要添加測試(如elif語句)一檢查是否發生了其餘致使active變爲False的事件會很容易。在複雜的程序中,如不少事件都會致使程序中止運行,標誌頗有用:在其中的任何一個事件致使活動標誌變成False時,住遊戲循環將退出,此時可顯示一條遊戲結束消息,並讓用戶選擇是否要從新玩。

7.2.4 使用break退出循環

 要求當即退出while循環,再也不運行循環中餘下的代碼,也無論條件測試的結果如何,可以使用break語句。break語句用於控制程序流程,可以使用它來控制哪些代碼行將執行,哪些代碼不執行,從而讓程序按你的要求執行你要的代碼。

例:

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()+"!") 輸出: Please enter the name of a city you have visited: (Enter 'quit' when you are finished.)Beijin I'd love to go to Beijin!  Please enter the name of a city you have visited: (Enter 'quit' when you are finished.)quit

在這個程序中,咱們能夠再用戶輸入‘quit’後使用break語句當即退出while循環:
以while Ture打頭的循環將不斷運行,直到遇到break語句。這個程序中的循環不斷輸入用戶到過的城市的名字,知道他輸入quit爲止,用戶輸入‘quit’後,將執行break語句,致使python退出循環。

注意:在任何python循環中均可使用break語句,例如,可以使用break語句來退出遍歷列表或字典的for循環。

7.2.5  在循環中使用continue

要返回到循環開頭,並根據條件測試結果決定是否繼續執行循環,但是有continue語句,不會像break語句那樣再也不執行餘下的代碼並退出整個循環。例:

current_number = 0 
while current_number < 10: current_number += 1 #代碼 current_number = current_number + 1 的簡寫 if current_number %2 == 0: continue print(current_number) 輸出: 1 3 5 7 9

首先將current_number設置成0,因爲它小於10,python進入while循環。進入循環後,咱們一補償1的方式往上數(current_number +=1),所以current_number爲1.接下來,if語句檢查current_number與2的求模運算結果。若是結果爲0(意味着current_number可被2整除),執行continue語句,讓python忽略餘下代碼,並返回到循環的開頭。若是當前的數字不能被2整除,就執行循環中餘下的代碼,python輸出數字。

7.2.6 避免無限循環

每一個while循環都必須有中止運行的途徑,這樣纔不會沒完沒了的執行下去。例:

x = 1
while x <= 5:
    print(x) x += 1 輸出: 1 2 3 4 5

若是不當心遺漏 X += 1,這個循環將無限運行,在這裏,x的初始值爲1,但根本不會改變,所以條件X<= 5始終未True,致使while循環無線運行。若是程序陷入無限循環,可按Ctrl+C,也可關閉顯示程序輸出的終端窗口。

 

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

若是須要積累大量的用戶信息,須要在while循環中使用列表和字典。

for循環是一種遍歷列表的有效方式,但在for循環中不該修改列表,不然致使python難以跟蹤其中的元素。要在遍歷列表的同事對其進行修改,可以使用while循環。經過將while循環同列表和字典結合起來使用,可手機、存儲並組織大量輸入,供之後查看和顯示。

7.3.1 在列表之間移動元素

假設有一個列表,其中包含像你註冊單還未驗證的網站用戶;驗證這些用戶之後,如何將他們移到另外一個已驗證用戶列表中呢?一種辦法是使用一個while循環,在驗證用戶的同時將其從未驗證用戶列表提取出來,再將其加入到另外一個已驗證用戶列表中。例:

#建立一個待驗證用戶列表
#和一個用於存儲已驗證用戶的空列表
unconfirmed_users = ['alien', 'brian', 'candace']
confirmed_users = [] #驗證每一個用戶,直到沒有未驗證用戶爲止 #將每一個通過驗證的列表都移到已驗證用戶列表中 while unconfirmed_users: current_user = unconfirmed_users.pop() #pop() 刪除並顯示列表末尾的元素 print("Verify 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()) 輸出: Verify user: Candace Verify user: Brian Verify user: Alien The following users have been confirmed: Candace Brian Alien

首先定義建立一個未驗證的列用戶列表,包含用戶,還建立一個空列表,用於存儲已驗證的用戶。在while處的循環將不斷的運行,直到列表unconfirm_users變成空的。在這個循環中,函數pop()以每次一個的方式從列表unconfirm_users末尾刪除爲驗證的用戶。因爲Candace位於unconfirm_users末尾,所以名字首先被刪除,存儲到變量current_user中並加入列表confirmed_users中。

爲模擬用戶驗證過程,咱們輸出一條驗證消息並將用戶加入到已驗證用戶列表中,未驗證用戶列表將愈來愈短,而已驗證用戶列表愈來愈長。未驗證用戶列表爲空後結束循環,在輸出已驗證用戶列表。

7.3.2 刪除包含特定值的全部列表元素

使用remove()來刪除列表中的特定值,這之因此可行,是由於刪除的值在列表中只出現了一次。若是要刪除列表中包含全部(重複)的特定值元素,可不斷運行一個while循環,直到列表不在不包含其特定值。例:

pets = ['dog', 'cat', 'goldfish', 'cat', 'rabbit', 'cat']
print(pets) while 'cat' in pets: pets.remove('cat') print (pets) 輸出: ['dog', 'cat', 'goldfish', 'cat', 'rabbit', 'cat'] ['dog', 'goldfish', 'rabbit']

首先建立一個列表,其中包含多個‘cat’值的元素。輸出這個列表後,進入while循環,因‘cat‘在列表中不止出現一次。

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

可以使用while循環提示用戶輸入任意數量信息。建立一個調查程序,其中循環每次執行時都輸被調查者的名字和回答。將數據存儲在一個字典中,以便將回答與被調查者關聯起來。例:

responses = {}

#設置一個標誌,指出調查是否繼續
polling_active = True while polling_active: #提示輸入被調查者的名字和回答 name = input("\nWhat is your name? ") response = input("Which montain would you liek 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 + ".") 輸出: What is your name? mack Which montain would you liek to climb someday? dashan Would you like to let another person respond? (yes/ no) yes What is your name? tao Which montain would you liek to climb someday? none Would you like to let another person respond? (yes/ no) no --- Poll results --- mack Would like to climb dashan. tao Would like to climb none.

這個程序首先定義了一個空字典(response),並設置一個標誌(polling_active),用於指出調查是否繼續。只要polling_active 爲True,就會運行while循環代碼。

在這個循環中,提示用戶輸入其用戶名及喜歡爬哪座山。將這些信息存儲在字典response中,而後詢問用戶調查是否繼續。若是用戶輸入yes,程序再次while循環;若是用戶輸入no,標誌polling_active將被設置爲False,而while循環就此結束。最後一個代碼塊顯示調查結果。

相關文章
相關標籤/搜索