第七章
1淆两、函數(shù)input()的工作原理
函數(shù)input()讓程序暫停運(yùn)行师崎,等待用戶輸入一些文本铺敌。
message = input("Tell me something, and I will repeat it back to you: ")
print(message)
# 輸出:
Tell me something, and I will repeat it back to you: python
python
括號中接收的參數(shù)就是向用戶顯示的提示或者說明汇歹,讓用戶知道該如何做。
(1)編寫清晰的程序
使用input()函數(shù)時偿凭,最好指定清晰的提示产弹,便于用戶輸入準(zhǔn)確的信息。通常在提示的末尾再添加一個空格笔喉,以便區(qū)分提示與輸入。當(dāng)你需要指出獲取特定輸入的原因時硝皂,提示可能會很長常挚,這時就可以將提示存儲在一個變量中,然后再將變量傳遞給函數(shù)input()稽物。
prompt = "If you tell us who you are, we can personlize the messages you see."
prompt += "\nWhat is your first name? "
name = input(prompt)
print(name)
# 輸出:
If you tell us who you are, we can personlize the messages you see.
What is your first name? Jackson
Jackson
上述例子演示了一種創(chuàng)建多行字符串的方式奄毡,首先將前半部分字符串存儲在一個變量中,然后使用運(yùn)算符+=在原本字符串的末尾附加一個字符串贝或。
(2)使用int()來獲取數(shù)值輸入
使用函數(shù)input()時吼过,Python將用戶輸入解讀為字符串锐秦。
age = input("How old are you? ")
print(age)
print(type(age))
# 輸出:
How old are you? 18
18
<class 'str'>
通過使用type()函數(shù)可以得知所輸入的數(shù)值確實被當(dāng)成了字符串類型。當(dāng)你需要把它當(dāng)成數(shù)字來使用時盗忱,就可以使用函數(shù)int()酱床,它可以將數(shù)字字符串轉(zhuǎn)換成數(shù)值。將數(shù)值輸入用于計算和比較前趟佃,務(wù)必將其轉(zhuǎn)換為數(shù)值表示扇谣。
(3)求模運(yùn)算符
求模運(yùn)算符(%)可以將兩個數(shù)相除并返回余數(shù)。
print(10 % 3)
# 輸出:
1
(4)在Python 2.7 中獲取輸入
如果你使用的是Python 2.7闲昭,應(yīng)使用函數(shù)raw_input()來提示用戶輸入罐寨。這個函數(shù)與Python 3中的input()一樣,也將輸入解讀為字符串序矩。
Python 2.7也包含函數(shù)input()鸯绿,但它將用戶輸入解讀為Python代碼,并嘗試運(yùn)行它們簸淀。因此瓶蝴,最好的結(jié)果是出現(xiàn)錯誤,指出Python不明白輸入的代碼啃擦;而最糟糕的結(jié)果是囊蓝,將運(yùn)行你原本無意運(yùn)行的代碼。所以如果你正在使用Python 2.7令蛉,請使用raw_input()來獲取輸入聚霜。
2、while循環(huán)簡介
for循環(huán)用于針對集合中的每個元素的一個代碼塊珠叔,而while循環(huán)不斷地運(yùn)行蝎宇,直到指定的條件不滿足為止。
(1)使用while循環(huán)
current_number = 1
while current_number <= 5:
print(current_number)
current_number += 1
# 輸出:
1
2
3
4
5
上述的循環(huán)例子中祷安,表示當(dāng)current_number的值小于等于5時姥芥,循環(huán)繼續(xù)執(zhí)行;當(dāng)其大于5時汇鞭,循環(huán)終止凉唐。
(2)讓用戶選擇何時退出
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!
Hello!
Tell me something, and I will repeat it back to you:
Enter 'quit' to end the program. Python
Python
Tell me something, and I will repeat it back to you:
Enter 'quit' to end the program. quit
在上述的程序中,只有當(dāng)你輸入“quit”的時候霍骄,程序才會退出台囱,否則程序會一直循環(huán)下去。
(3)使用標(biāo)志
在要求很多條件都滿足才繼續(xù)運(yùn)行的程序中读整,可定義一個變量簿训,用于判斷整個程序是否處于活動狀態(tài)。這個變量被成為標(biāo)志,充當(dāng)了程序的交通信號燈膘侮。你可以讓程序在標(biāo)志為True時繼續(xù)運(yùn)行的榛,并在任何事件導(dǎo)致標(biāo)志的值為False時讓程序停止運(yùn)行。這樣困曙,在while語句中就只需要檢查一個條件——標(biāo)志的當(dāng)前值是否為True表伦,并將所有測試(是否發(fā)生了應(yīng)將標(biāo)志設(shè)置為False的事件)都放在其他地方蹦哼,從而讓程序變得更為整潔。
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標(biāo)志要糊,簡化了while語句纲熏,因為不需要在其中做任何的比較局劲,相關(guān)的邏輯由程序的其他部分處理奶赠。只要active的值為True,循環(huán)就會一直運(yùn)行苹丸;而當(dāng)程序運(yùn)行到某一刻時將active的值改為了False苇经,循環(huán)就終止扇单。使用標(biāo)志可以使得后期修改程序變得更簡單容易。
(4)使用break退出循環(huán)
要立即退出while循環(huán)施流,不再運(yùn)行循環(huán)中余下的代碼鄙信,也不管條件測試的結(jié)果如何扮碧,可使用break語句。它用于控制程序流程蚓土。
prompt = "\nTell me something, and I will repeat it back to you:"
prompt += "\nEnter 'quit' to end the program. "
while True:
message = input(prompt)
if message == 'quit':
break
else:
print(message)
# 輸出:
Tell me something, and I will repeat it back to you:
Enter 'quit' to end the program. Hello
Hello
Tell me something, and I will repeat it back to you:
Enter 'quit' to end the program. quit
以True作為條件測試的while循環(huán)將不斷運(yùn)行,直到遇到break語句蜀漆。在任何的Python循環(huán)中都可以使用break語句确丢。
(5)在循環(huán)中使用continue
要返回到循環(huán)的開頭吐限,并根據(jù)條件測試結(jié)果決定是否繼續(xù)執(zhí)行循環(huán),可使用continue語句诸典,它與break不一樣描函,它只是退出了當(dāng)次的循環(huán),然后繼續(xù)執(zhí)行下一次循環(huán)狐粱;而break是直接退出整個循環(huán)肌蜻。
current_number = 0
while current_number < 10:
current_number += 1
if current_number % 2 == 0:
continue
print(current_number)
# 輸出:
1
3
5
7
9
這里只輸出了1到10之間的奇數(shù),因為每當(dāng)遇到偶數(shù)時都碰到了continue語句篡撵,使其退出了那一次的循環(huán)酸休。
(6)避免無限循環(huán)
在while循環(huán)中斑司,其中自增自減的語句時必不可少的但汞,一旦寫漏了私蕾,就會出現(xiàn)無限循環(huán)。要避免編寫無限循環(huán)磕潮,務(wù)必對每個while循環(huán)進(jìn)行測試自脯,確保它按預(yù)期那樣結(jié)束膏潮。
3、使用while循環(huán)來處理列表和字典
for循環(huán)是一種遍歷列表的有效方式轻纪,但在for循環(huán)中不應(yīng)修改列表刻帚,否則將導(dǎo)致Python難以跟蹤其中的元素我擂。要在遍歷列表的同時對其進(jìn)行修改缓艳,可使用while循環(huán)阶淘。
(1)在列表之間移動元素
使用一個while循環(huán)溪窒,在驗證用戶的同時將其從未驗證用戶用戶列表中提取出來,再將其加入到另一個已驗證用戶列表中摹芙。
unconfirm_users = ['alice', 'brian', 'candace']
confirm_users = []
while unconfirm_users:
current_user = unconfirm_users.pop()
print("Verifying user: " + current_user.title())
confirm_users.append(current_user)
print("\nThe following users have been confirmed: ")
for confirm_user in confirm_users:
print(confirm_user.title())
# 輸出:
Verifying user: Candace
Verifying user: Brian
Verifying user: Alice
The following users have been confirmed:
Candace
Brian
Alice
(2)刪除包含特定值的所有列表元素
我們已經(jīng)知道remove()可以刪除列表中與之匹配的第一個元素浮禾,而當(dāng)有多個相同的元素出項在列表中時盈电,可以使用while循環(huán)來刪除所有特定的值匆帚。
pets = ['dog', 'cat', 'dog', 'goldfish', 'cat', 'rabbit', 'cat']
print(pets)
while 'cat' in pets:
pets.remove('cat')
print(pets)
# 輸出:
['dog', 'cat', 'dog', 'goldfish', 'cat', 'rabbit', 'cat']
['dog', 'dog', 'goldfish', 'rabbit']
(3)使用用戶輸入來填充字典
使用while循環(huán)來創(chuàng)建一個調(diào)查程序吸重,并將收集的數(shù)據(jù)存儲在一個字典中,用戶的名字就是鍵摩幔,用戶的回答就是值。最后打印調(diào)查結(jié)果车遂。
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 Result ---")
for name, response in responses.items():
print(name + " would like to climb " + response + ".")
# 輸出:
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 Result ---
Eric would like to climb Denali.
Lynn would like to climb Devil's Thumb.