使用者輸入和while 迴圈
阿新 • • 發佈:2018-12-13
# 使用者輸入和while迴圈 # 7.1函式input() 的工作原理 # 函式input() 讓程式暫停執行,等待使用者輸入一些文字。獲取使用者輸入後,Python將其儲存在一個變數中,以方便你使用。 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) 將輸入呈現給用 # 戶 # 7.1.1 編寫清晰的程式 # 每當你使用函式input() 時,都應指定清晰而易於明白的提示,準確地指出你希望使用者提供什麼樣的資訊——指出使用者該輸入任何資訊的提示都行,如下所示 name = input("Please enter your name: ") print("Hello, " + name + "!") # 有時候,提示可能超過一行,例如,你可能需要指出獲取特定輸入的原因。在這種情況下,可將提示儲存在一個變數中,再將該變數傳遞給函式input() 。這樣,即便提示超過 # 一行,input() 語句也非常清晰。 # 7.1.2 使用int() 來獲取數值輸入 # 使用函式input() 時,Python將使用者輸入解讀為字串 age = input("how old are you?") # 使用者輸入的是數字21,但我們請求Python提供變數age 的值時,它返回的是'21' ——使用者輸入的數值的字串表示。我們怎麼知道Python將輸入解讀成了字串呢?因為這個數 # 字用引號括起了。如果我們只想列印輸入,這一點問題都沒有;但如果你試圖將輸入作為數字使用,就會引發錯誤: age = input("how old are you?") age >= 18 print('most recent call last' ) # 你試圖將輸入用於數值比較時(見❶),Python會引發錯誤,因為它無法將字串和整數進行比較:不能將儲存在age 中的字串'21' 與數值18 進行比較(見❷)。 # 為解決這個問題,可使用函式int() ,它讓Python將輸入視為數值。函式int() 將數字的字串表示轉換為數值表示,如下所示: age = input("how old are you?") age = int(age) age >= 18 print('most recent call last' ) # 7.1.3 求模運算子 # 處理數值資訊時,求模運算子 (%)是一個很有用的工具,它將兩個數相除並返回餘數: # 求模運算子不會指出一個數是另一個數的多少倍,而只指出餘數是多少。 # 如果一個數可被另一個數整除,餘數就為0,因此求模運算子將返回0。你可利用這一點來判斷一個數是奇數還是偶數: number = input('enter a number ') number = int(number) if number % 2 ==0: print('is even') else: print('is odd') # 7.2 while 迴圈簡介 # for 迴圈用於針對集合中的每個元素都一個程式碼塊,而while 迴圈不斷地執行,直到指定的條件不滿足為止。 # 7.2.1 使用while 迴圈 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,迴圈將停止,整個程式也將到此結束: # 7.2.2 讓使用者選擇何時退出 # 可使用while 迴圈讓程式在使用者願意時不斷地執行,如下面的程式parrot.py所示。我們在其中定義了一個退出值,只要使用者輸入的不是這個值,程式就接著執行: prompt = 'tell me something and i will repeat it back to you ' prompt += "enter 'quit' to 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 迴圈,而整個程式也到此結束: # 7.2.3 使用標誌 # 在要求很多條件都滿足才繼續執行的程式中,可定義一個變數,用於判斷整個程式是否處於活動狀態。這個變數被稱為標誌 ,充當了程式的交通訊號燈。你可讓程式在標誌 # 為True 時繼續執行,並在任何事件導致標誌的值為False 時讓程式停止執行。 prompt = 'tell me something and i will repeat it back to you ' prompt += "enter 'quit' to 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' (見❹),我們就將輸入作為一條訊息打印出來。 # 7.2.4 使用break 退出迴圈 # 要立即退出while 迴圈,不再執行迴圈中餘下的程式碼,也不管條件測試的結果如何,可使用break 語句。break 語句用於控制程式流程,可使用它來控制哪些程式碼行將執行, # 哪些程式碼行不執行,從而讓程式按你的要求執行你要執行的程式碼。 prompt = 'tell me something and i will repeat it back to you ' prompt += "enter 'quit' to the program" while True: city = input(prompt) if city =='quit': break else: print('love to go') # 以while True 打頭的迴圈(見❶)將不斷執行,直到遇到break 語句。這個程式中的迴圈不斷輸入使用者到過的城市的名字,直到他輸入'quit' 為止。使用者輸入'quit' # 後,將執行break 語句,導致Python退出迴圈: # 注意 在任何Python迴圈中都可使用break 語句。例如,可使用break 語句來退出遍歷列表或字典的for 迴圈 # 7.2.5 在迴圈中使用continue # 要返回到迴圈開頭,並根據條件測試結果決定是否繼續執行迴圈,可使用continue 語句,它不像break 語句那樣不再執行餘下的程式碼並退出整個迴圈。例如,來看一個從1數 # 到10,但只打印其中偶數的迴圈 number = 0 while number <10: number += 1 if number % 2 ==0: continue print(number) # 我們首先將current_number 設定成了0,由於它小於10,Python進入while 迴圈。進入迴圈後,我們以步長1的方式往上數(見❶),因此current_number 為1。接下 # 來,if 語句檢查current_number 與2的求模運算結果。如果結果為0(意味著current_number 可被2整除),就執行continue 語句,讓Python忽略餘下的程式碼,並返回 # 到迴圈的開頭。如果當前的數字不能被2整除,就執行迴圈中餘下的程式碼,Python將這個數字打印出來 # 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.title()) confirmed_users.append(current_user) print('The following users have been confirmed ') for confirmed_user in confirmed_users: print(confirmed_user.title()) # 我們首先建立了一個未驗證使用者列表(見❶),其中包含使用者Alice、Brian和Candace,還建立了一個空列表,用於儲存已驗證的使用者。❷處的while 迴圈將不斷地執行,直到列 # 表unconfirmed_users 變成空的。在這個迴圈中,❸處的函式pop() 以每次一個的方式從列表unconfirmed_users 末尾刪除未驗證的使用者。由於Candace位於列 # 表unconfirmed_users 末尾,因此其名字將首先被刪除、儲存到變數current_user 中並加入到列表confirmed_users 中(見❹) # 7.3.2 刪除包含特定值的所有列表元素 # 我們使用函式remove() 來刪除列表中的特定值,這之所以可行,是因為要刪除的值在列表中只出現了一次。如果要刪除列表中所有包含特定值的元素,該怎麼辦 # 假設你有一個寵物列表,其中包含多個值為'cat' 的元素。要刪除所有這些元素,可不斷執行一個while 迴圈,直到列表中不再包含值'cat' ,如下所示: 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' ,直到這個值不再包含在列表中,然後退出迴圈並再次打 # 印列表: # 7.3.3 使用使用者輸入來填充字典 # 可使用while迴圈提示使用者輸入任意數量的資訊。下面來建立一個調查程式,其中的迴圈每次執行時都提示輸入被調查者的名字和回答。我們將收集的資料儲存在一個字典中,以 # 便將回答同被調查者關聯起來: responses ={} polling_active =True while polling_active: name = input("\nwhat is your name") response =input("which nountain 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 迴圈將就此結束。最後一個程式碼塊(見❹)顯示調查結果。