1. 程式人生 > >使用者輸入和while 迴圈

使用者輸入和while 迴圈

# 使用者輸入和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 迴圈將就此結束。最後一個程式碼塊(見❹)顯示調查結果。