1. 程式人生 > >Class - 7 用戶輸入和while循環

Class - 7 用戶輸入和while循環

fis module app err stdin 邏輯 hello python2.7 strong

7.1 函數input()的工作原理

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

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)將輸入呈現給用戶。

註意:Sublime Text不能運行提示用戶輸入的程序。可以Sublime Text來編寫提示用戶輸入的程序,但必須沖終端運行。

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中國的字符串末尾附件一個字符串。最終的提示跨兩行,並在問號後面包含一個空格,也是出於清晰考慮。

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

使用函數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循環就此結束。最後一個代碼塊顯示調查結果。

Class - 7 用戶輸入和while循環