編程時經常需要檢查一系列條件,並據此決定採取什麼措施。在Python中,if語句讓我們能夠檢查程式的當前狀態,並據此採取相應的措施。 5.1 一個簡單的示例 下麵是一個簡短的示例,演示瞭如何使用if語句來正確地處理特殊情形。假設我們有一個汽車列表,並想將其中每輛汽車的名稱列印出來。對於大多數汽車,都 ...
編程時經常需要檢查一系列條件,並據此決定採取什麼措施。在Python中,if語句讓我們能夠檢查程式的當前狀態,並據此採取相應的措施。
5.1 一個簡單的示例
下麵是一個簡短的示例,演示瞭如何使用if語句來正確地處理特殊情形。假設我們有一個汽車列表,並想將其中每輛汽車的名稱列印出來。對於大多數汽車,都應以首字母大寫的方式列印其名稱,但對於汽車名為“bmw",應以全大寫的方式列印。下麵的代碼遍歷一個列表,並以首字母大寫的方式列印其中的汽車名,但對於汽車名為“bmw”,以全大寫的方式列印:
cars = ['audi','bmw','subaru','toyota']
for car in cars:
if car == "bmw":
print(car.upper())
else:
print(car.title())
這個示例中的迴圈首先檢查當前的汽車名是否是“bmw".如果是,就以全大寫的方式列印它;否則就以首字母大寫的方式列印:
Audi
BMW
Subaru
Toyota
這個示例涵蓋了本章將介紹的很多概念。下麵先來介紹可用來在程式中檢查條件的測試。
5.2 條件測試
每條if語句的核心都是一個值True或False的表達式,這種表達式被稱為條件測試。Python根據條件測試的值為True或False來決定執行是否執行if語
句中的代碼。如果條件測試的值為True,Python就執行緊跟在if語句後面的代碼;如果為False,Python就忽略這些代碼。
5.2.1 檢查是否相等
大多數條件測試都將一個變數的當前值同特定值進行比較。最簡單的條件測試檢查變數的值是否與特定值相等:
>>> a = "bmw"
>>> a == "bmw"
True
我們首先使用一個等號將car的值設置為"bmw",這種做法我們已經看過很多次。接下來,使用兩個等號(==)檢查car的值是否為"bmw".這個相等運算
符在它兩邊的值相等時返回True,否則返回False。在這個示例中,兩邊的值相等,因此Python返回True。
如果變數car的值不是'bmw',上述測試將返回False:
>>> a = 'bmw'
>>> a == 'audi'
False
一個等號是陳述;對於一個等號處的代碼,可解讀為”將變數car的值設置為'audi'.兩個等號是發問;對於兩個等號處的代碼,可解讀為"變數car的值
是"bmw"嗎?".大多數編程語言使用等號的方式都與這裡演示的相同。
總結:在Python中,if語句判斷的時候,返回的是True或False,如果條件滿足的話就返回True;否則不滿足,則返回False;並且,兩個等號(==)是
發問,問Python是否相等,如果相等怎樣,不等怎樣。
5.2.2 檢查是否相等時不考慮大小寫
在Python中檢查是否相等時區分大小寫,例如,兩個大小寫不同的值會被視為不相等:
>>> car = 'Audi'
>>> car == 'audi'
False
如果大小寫很重要,這種行為有其優點。但如果大小寫無關緊要,而只想檢查變數的值,可將變數的值轉換為小寫,再進行比較:
>>> car = "Audi"
>>> car.lower() == 'audi'
True
無論值'Audi'的大小寫如何,上述測試都將返回True,因為該測試不區分大小寫。函數lower不會修改存儲在變數car中的值,因此進行這樣的比較時不會
影響原來的變數:
(1)>>> car = "Audi"
(2)>>> car.lower() == "audi"
True
(3)>>> car
'Audi'
在(1)處,我們將首字母大寫的字元串"Audi"存儲在變數car中;在(2)處,我們獲取變數car的值並將其轉換為小寫,在將結果與字元串'audi'進行比較。
這兩個字元串相同,因此Python返回True。從(3)處的輸出可知,這個條件測試並沒有影響存儲在變數car中的值。
下麵來模擬一個網站註冊的情況:
首先,我們註冊網站的時候,網站會先讓我們輸入用戶名,然後會提示我們這個用戶名是否可用;如可用戶名不可用的話,就提示我們這個用戶名已經註冊了,請重新輸入用戶名;如果用戶名沒有註冊,就能夠按照註冊流程一步一步往下走,用戶註冊成功之後,要把註冊的用戶名放到之前的已經註冊的用戶名中,以便提示下個用戶註冊的時候,相同的用戶名不能夠註冊,讓註冊賬號不會出現重覆的情況。
但是要註意的是,在註冊的過程中,我們要對用戶名統一進行判斷,我們輸入的用戶名可能有大寫有小寫,但是同一個用戶名不管大小寫的各種狀態,下一個用戶是不能夠使用的,因此要統一進行轉化,如何轉化呢,思路是直接把所有註冊的用戶統一轉化為小寫,現在要註冊的用戶的名字也統一轉化為小寫,然後進行判斷,如果不在已經註冊了的用戶裡面則可以使用,否則,就要重新輸入註冊。
這是上面流程圖註冊的思路,代碼如下:
#register = input("Please input your username: ")
#首先定義一個空的列表,用戶存儲小寫轉化後的用戶
transformation_registered_names = []
#已經註冊的用戶
registered_users = ["Zengmingzhu","zhagnqq","jIangxb","gZd","loujq","liuxs","cDq"]
#使用True迴圈,當用戶名相同的時候,可以讓用戶一直輸入,不至於退出
while True:
register = input("Please input your username: ")
#使用for迴圈,將已經註冊的用戶列表進行統一的轉化
for user_name in registered_users:
transformation_registered_names.append(user_name.title())
#使用if進行判斷,判斷輸入的用戶名(小寫轉化)是否存在已經註冊的里列表中
if register.title() in transformation_registered_names:
print("Sorry, the name you entered is registered! Please enter again")
else:
print("Successful!")
registered_users.append(register)
break
print(registered_users)
運行結果如下:
Please input your username: zengmignzhu
Successful!
['Zengmingzhu', 'zhagnqq', 'jIangxb', 'gZd', 'loujq', 'liuxs', 'cDq', 'zengmignzhu']
思路:首先我們都知道網站後天都有我們的註冊信息的列表,這個列表名為registered_users,然後定義一個空的列表,用於存放轉化後的已註冊的用戶,命
名為transformation_registered_names,然後使用while迴圈,以便用戶輸入已註冊的用戶的時候能夠再次輸入,以便輸入不相同的用戶名為止;在while中
,我們使用for迴圈就行轉換,然後使用if語句進行判斷,當判斷用戶名已經使用的時候,讓用戶重新輸入;當用戶名不存在的時候,提示用戶可以使用這個用
戶名,並且要把這個註冊的用戶名存儲到網站後臺的註冊用戶名列表,以便下一個註冊的人用戶名跟當前的用戶名是唯一的。
網站採取類似的方式讓用戶輸入的數據符合特定的格式。例如,網站可能使用類似的測試來確保用戶名是獨一無二的,而並非只是與另一個用戶名的大小
寫不同。用戶提交新的用戶名時,將它轉換為小寫,並與所有既有用戶名的小寫版本進行比較。執行這種檢查時,如果已經有用戶名'join'(不管大小寫如何),
則用戶提交用戶名'Join'時將遭到拒絕。
5.2.3 檢查是否不相等
要判斷兩個值是否不等,可結合使用驚嘆號和等號(!=),其中的驚嘆號表示不,在很多編程語言中都如此。
下麵再使用一條if語句來演示如何使用不等運算符。我們將把要求的比薩配料存儲在一個變數中,在列印一條消息,指出顧客要求的配料是否是意式小銀魚
(anchovies):
requested_topping = 'mushrooms'
if requested_topping != 'anchovies':
print("Hold the anchovies!")
代碼將requested_topping的值與'anchovies'進行比較,如果它們不相等,Python將返回True,進而執行緊跟在if語句後面的代碼;如果這兩個值相等
,Python將返回False,因此不執行緊跟在if語句後面的代碼。
由於requested_topping的值不是'anchovies',因此執行print語句:
Hold the anchovies!
我們編寫的大多數條件表達式都檢查兩個值是否相等,但有時候檢查兩個值是否不等的效率更高。
5.2.4 比較數字
檢查數值非常簡單,例如,下麵檢查一個人是否18歲:
>>> age = 18
>>> age == 18
True
我們還可以檢查兩個數字是否不等,例如,下麵的代碼在提供的答案不正確時列印一條消息:
answer = 17
if answer != 42:
print("That is not the correct answer. Please try again!")
answer(17)不是42,條件得到滿足,因此縮進的代碼塊得以執行:
That is not the correct answer. Please try again!
條件語句中可包含各種數學比較,如小於、小於等於、大於、大於等於:
>>> age = 19
>>> age < 21
True
>>> age<=21
True
>>> age>21
False
>>> age>=21
False
在if語句中可使用各種數學比較,這讓我們能夠直接檢查關心的條件。
5.2.5 檢查多個條件
我們可能想同時檢查多個條件,例如,有時候我們需要在兩個條件都為True時才執行相應的操作,而有時候我們只要求一個條件為True時就執行相應的操
作。在這些情況下,關鍵字and和or可幫助我們一臂之力。
1、使用and檢查多個條件
要檢查是否兩個條件都為True,可使用關鍵字and將兩個條件測試合而為一;如果每個測試都通過了,整個表達式就為True;如果至少有一個測試沒有通過
,真個表達式就為False。
例如,要檢查兩個人都小於21歲,可使用下麵的測試:
>>> age_0 = 22
>>> age_1 = 18
>>> age_0 >= 21 and age_1 >= 21
False
>>> age_1 = 22
>>> age_0 >=21 and age_1 >= 21
True
為改善可讀性,可將每個測試都分別放在一個括弧內,但並非必須這樣做。如果我們使用括弧,測試將類似於下麵這樣:
(age_0 >= 21) and (age_1 >= 21)
2、使用or檢查多個條件
>>> age_0 = 18
>>> age_1 = 22
>>> (age_0 >= 21) or (age_1 >= 21)
True
>>> age_1 = 18
>>> (age_0 >= 18) or (age_1 >= 18)
True
>>> (age_0 >= 21) or (age_1 >= 21)
False
同樣,我們首先定義了兩個用於存儲年齡的變數。只要有一個條件滿足,結果就是True,只有兩個條件都不滿足的時候,結果才為False。
banned_users = ['andrew','carolina','david']
user = 'marie'
if user not in banned_users:
print(user.title() + ", you can post a response if you wish.")
代碼明白易懂:如果user的值未包含在列表banned_users中,Python將返回True,進而執行縮進的代碼行。
用戶"marie"未包含在列表banned_users中,因此他將看到一條邀請他發表評論的消息:
Marie, you can post a response if you wish.
5.2.8 布爾表達式
隨著我們對編程的瞭解越來越深入,將遇到術語布爾表達式,它不過是條件測試的別名。與條件表達式一樣,布爾表達式的結果要麼是True,要麼為False
。
布爾值通常用於記錄條件,如游戲是否正在運行,或用戶是否可以編輯網站的特定內容:
game_active = True
can_edit = False
在跟蹤程式狀態或程式中重要的條件方面,布爾值提供了一種高效的方式。
5.3 if語句
理解條件測試後,就可以開始編寫if語句了。if語句有很多種,選擇使用哪種取決於要測試的條件數。前面討論條件測試時,列舉了多個if語句示例,下麵
更深入地討論這個主題。
5.3.1 簡單的if語句
最簡單的if語句只有一個測試和一個操作:
if conditional_test:
do something
在第1行中,可包含任何條件測試,而在緊跟在測試後面的縮進代碼塊中,可執行任何操作。如果條件測試的結果為True,Python就會執行緊跟在if語句後
面的代碼;否則Python將忽略這些代碼。
假設有一個表示某人年齡的變數,而你想知道這個人是否夠投票的年齡,可使用如下代碼:
age = 19
if age >= 18:
print("You are old enough to vote!")
Python檢查變數age的值是否大於或等於18;答案是肯定的,因此Python執行縮進的print語句:
You are old enough to vote!
在if語句中,縮進的作用與for迴圈中相同。如果測試通過了,將執行if語句後面所有縮進的代碼行,否則將忽略它們。
在緊跟if語句後面的代碼塊中國,可根據需要包含任意數量的代碼行。下麵在一個人夠投票的年齡時在列印一行輸出,問他是否登記了:
age = 19
if age >= 18:
print("You are old enough to vote!")
print("Have you registered to vote yet?")
條件測試通過了,而兩條print語句都縮進了,因此它們都將執行:
You are old enough to vote!
Have you registered to vote yet?
如果age的值小於18,這個程式將不會有任何輸出。
5.3.2 if-else 語句
經常需要在條件測試通過了時執行一個操作,併在沒有通過時執行另一個操作;在這種情況下,可使用Python提供的if-else語句塊類似於簡單的if語句,
但其中的else語句讓我們能夠制定條件測試未通過時要執行的操作。
下麵的代碼在一個人夠投票的年齡時顯示u前面相同的信息,同時在這個人不夠投票的年齡時也顯示一條信息:
age = 17
if age >= 18:
print("You are old enough to vote!")
print("Have you registered to vote yet?")
else:
print("You are too young to vote.")
print("Please register to vote as soon as you turn 18!")
如果條件測試通過了,就執行第一個縮進的print語句塊;如果測試結果為False,就執行else代碼塊。這次age小於18,條件測試未通過,因此執行else
代碼塊中的代碼:
You are too young to vote.
Please register to vote as soon as you turn 18!
上述代碼之所以可行,是因為值存在兩種情形;要麼夠投票的年齡,要麼不夠。if-else結構非常適合於要讓Python執行兩種操作之一的情形。在這種簡單
的if-else結構中,總是會執行兩個操作中的一個。
5.3.3 if-elif-else結構
經常需要檢查超過兩個的情形,為此可使用Python提供的if-elif-else結構。Python只執行if-elif-else結構中的一個代碼塊,它以此檢查每個條件測
試,直到遇到通過了的條件測試。測試通過後,Python將執行緊跟在它後面的代碼,並跳過餘下的測試。
在現實世界中,很多情況下需要考慮的情形都超過兩個。例如,來看一個根據年齡段收費的游樂場:
1、四歲以下免費;
2、4~18歲收費5美元;
3、18歲(含)以上收費10美元。
如果只使用一條if語句,如何確定門票價格呢?下麵的代碼確定一個人所屬的年齡段,並列印一條包含門票價格的消息:
def your_age(age):
if age < 4:
print("Your admission cost is $0.")
elif age >= 4 and age < 18:
print("Your admission cost is $5.")
else:
print("Your admission cost is $10.")
#我在考慮,如何結果讓用戶自己輸入名字,在編程中,我們程式員自己肯定知道如何調用函數,但是用戶不知道
your_age(18)
your_age(10)
your_age(2)
#年齡的問題可以結果,我們直接重新定義一個年齡變數,讓用戶輸入即可,但是如何解決自動調用函數的問題,不可能讓用戶自己調用函數
my_age = int(input("Please input your age: "))
your_age(my_age)
if檢測檢查一個人是否滿4歲,如果是這樣,Python就列印一條合適的消息,並跳過餘下的測試。elif代碼行其實是另一個if測試,它僅在前面的測試未
通過時才會運行。在這裡,我們知道這個人的年齡不小於4歲,因為第一個測試未通過。如果這個人未滿18歲,Python將列印相應的消息,並跳過else代碼塊,
如果if測試和elif測試都未通過,Python將運行else代碼塊中的代碼。
為讓代碼更簡潔,可不在if-elif-else代碼塊中列印門票價格,而只在其中設置門票價格,併在後面添加一條簡單的print語句:
def your_age(age):
if age < 4:
price = 0
elif age >= 4 and age < 18:
price = 5
else:
price = 10
print("Your admission cost is $" + str(price) + ".")
#我在考慮,如何結果讓用戶自己輸入名字,在編程中,我們程式員自己肯定知道如何調用函數,但是用戶不知道
your_age(18)
your_age(10)
your_age(2)
#年齡的問題可以結果,我們直接重新定義一個年齡變數,讓用戶輸入即可,但是如何解決自動調用函數的問題,不可能讓用戶自己調用函數
my_age = int(input("Please input your age: "))
your_age(my_age)
代碼行還是像前一個示例那樣,根據人的年齡設置變數price的值。在if-elif-else結構中設置price的值後,一條未縮進的print語句會根據這個變數的值列印
一條消息,指出門票的價格。
這些代碼的輸出與前一個示例相同,但if-elif-else結構的作用更小,它只確定門票的價格,而不是在確定門票價格的同時列印一條消息。處效率更高外,這些
修改後的代碼還更容易修改:要調整輸出消息的內容,只需修改一條而不是三條print語句。
註意:Python代碼以簡潔為美,一個函數的功能越少越好,儘量要簡潔,避免重覆性的工作,把重覆性的工作放到最後一個模塊即可,所以在工作中,遇到重覆性的
代碼塊的時候,要嘗試去優化代碼,儘量讓代碼的功能簡單最好。
5.3.4 使用多個elif代碼塊
可根據需要使用任意數量的elif代碼塊,例如,假設前述游樂場要給老年人打折,可再添加一個條件測試,判斷顧客是否符合打折條件。下麵假設對於65歲(含)
以上的老人,可以半價(即5美元)購買門票:
def your_age(age):
if age < 4:
price = 0
elif age >= 4 and age < 18:
price = 5
elif age < 65:
price = 10
elif age >= 65:
price = 5
print("Your admission cost is $" + str(price) + ".")
#我在考慮,如何結果讓用戶自己輸入名字,在編程中,我們程式員自己肯定知道如何調用函數,但是用戶不知道
your_age(18)
your_age(10)
your_age(2)
#年齡的問題可以結果,我們直接重新定義一個年齡變數,讓用戶輸入即可,但是如何解決自動調用函數的問題,不可能讓用戶自己調用函數
my_age = int(input("Please input your age: "))
your_age(my_age)
這些代碼大都未變。第二個elif代碼塊通過檢查確定年齡不到65歲後,才將門票價格設置為全票價格——10美元。請註意,在else代碼塊中,必須將所賦
的值改為5,因為僅當年齡超過65(含)時,才會執行這個代碼塊。
5.3.5 省略else代碼塊
Python並不要求if-elif結構後面必須有else代碼塊。在有些情況下,else代碼塊很有用;而在其他一些情況下,使用一條elif語句來處理特定的情形更
清晰:
elif代碼塊在顧客的年齡超過65(含)時,將價格設置為5美元,這筆使用else代碼塊更清晰些。經過這樣的修改後,每個代碼塊都僅在通過了相應的測試時
才會執行。
else是一條包羅萬象的語句,只要不滿足任何if或elif中的條件測試,其中的代碼就會執行,這可能會引入無效甚至惡意的數據。如果知道最終要測試的條
件,應考慮使用一個elif代碼塊代替else。這樣,我們就可以肯定,僅當滿足相應的條件時,我們的代碼才會執行。
5.3.6 測試多個條件
if-elif-else結構功能強大,但僅適合用於只有一個條件滿足的情況:遇到通過了測試後,Python就跳過餘下的測試。這種行為很好,效率很高,讓我
們能夠測試一個特定的條件。
然而,有時候必須檢查我們關心的所有條件。在這種情況下,應使用一系列不包含elif和else代碼塊的簡單if語句。有可能有多個條件為True,且我們需要
在每個條件為True時都採取相應措施時,適合使用這種方法。
toppings.py
requested_toppings = ['mushrooms','extra cheese']
if 'mushrooms' in requested_toppings:
print("Adding mushrooms.")
if 'pepperoni' in requested_toppings:
print("Adding pepperoni")
if 'extra cheese' in requested_toppings:
print("Adding extra cheese")
print('\nFinished making your pizza!')
我們首先創建了一個列表,其中包含顧客點的配料。if語句檢查顧客是否點了配料蘑菇('mushrooms').如果點了,就列印一條確認消息。檢查配料臘香腸
('pepperoni'),這個程式不管前一個測試是否通過,都將進行下一個測試。每當這個程式運行時,都會進行這三個獨立的測試。
在這個示例中,會檢查每個條件,因此將在披薩中添加蘑菇並多加芝士:
Adding mushrooms.
Adding extra cheese
Finished making your pizza!
如果像下麵這樣轉而使用if-elif-else結構,代碼將不能正確地運行,因為有一個測試通過後,就會跳過餘下的測試:
requested_toppings = ['mushrooms','extra cheese']
if 'mushrooms' in requested_toppings:
print("Adding mushrooms.")
elif 'pepperoni' in requested_toppings:
print("Adding pepperoni")
elif 'extra cheese' in requested_toppings:
print("Adding extra cheese")
print('\nFinished making your pizza!')
第一個測試檢查列表中是否包含'mushrooms',它通過了,因此將在比薩中添加蘑菇。然而,Python將跳過if-elif-else結構中餘下的測試,不在檢查列
表中是否包含'extra cheese'和'pepperoni'.其結果是,將添加顧客點的第一種配料,但不會添加其他的配料:
Adding mushrooms.
Finished making your pizza!
總之,如果我們只想之星一個代碼塊,就使用if-elif-else結構;如果要運行多個代碼塊,就使用一系列獨立的if語句。
動手試一試
5-3
alien_color = 'yellow'
if alien_color == 'yellow':
print("You get 5 score.")
if alien_color != 'yellow':
print("The other color.")
5-4
alien_color = 'red'
if alien_color == 'yellow':
score = 5
else:
score = 10
print("You get " + str(score) + " score.")
5.4 使用if語句處理列表
通過結合使用if語句和列表,可完成一些有趣的任務:對列表中特定的值做特殊處理;高效地管理不斷變化的情形,如餐館是否還有特定的食材;證明代碼
在各種情形下都能按預期那樣運行。
5.4.1 檢查特殊元素
本章開頭通過一個簡單示例演示瞭如何處理特殊值'bmw'——它需要採取不同的格式進行列印。既然我們對條件測試和if語句有了大致的認識,下麵來進一
步研究如何檢查列表中的特殊值,並對其做合適的處理。
繼續使用前面的比薩店示例。這家比薩店在製作比薩時,每添加一種配料都列印一條消息。通過創建一個列表,在其中包含顧客點的配料,並使用一個迴圈
來指出添加到比薩中的配料,可以以極高的效率編寫這樣的代碼:
requested_toppings = ['mushrooms','extra cheese','pepperoni']
for requested_topping in requested_toppings:
print("Adding " + requested_topping + '.')
print("\nFinished making your pizza.")
輸出很簡單,因為上述代碼不過是一個簡單的for迴圈:
Adding mushrooms.
Adding extra cheese.
Adding pepperoni.
Finished making your pizza.
然而,如果比薩店的青椒用完了,該如何處理呢?為妥善地處理這種情況,可在for迴圈中包含一條if語句:
requested_toppings = ['mushrooms','extra cheese','pepperoni']
for requested_topping in requested_toppings:
#加入if條件進行判斷,如果pepperoni使用完了,就告訴用戶,已經用完了
if requested_topping == 'pepperoni':
print("Sorry, we are out of pepperoni right now.")
else:
print("Adding " + requested_topping + '.')
print("\nFinished making your pizza.")
這裡在比薩中添加每種配料前都進行檢查。代碼檢查顧客點的是否是青椒,如果是,就顯示一條信息,指出不能點青椒的原因。else處代碼塊確保其他配料
都將添加到比薩中。
輸出表明,妥善地處理了顧客點的每種配料:
Adding mushrooms.
Adding extra cheese.
Sorry, we are out of pepperoni right now.
Finished making your pizza.
5.4.2 確定列表不是空的
到目前為止,對於處理的每個列表都做了一個簡單的假設,即假設它們都至少包含一個元素。我們馬上就要讓用戶來提供存儲在列表中的信息,因此不能再
假設迴圈運行時列表不是空的。有鑒於此,在運行for迴圈前確定列表是否為空很重要。
下麵在製作比薩前檢查顧客點的配料列表是否為空。如果列表是空的,就向顧客確認她是否要點普通披薩;如果列表不是空的,就像前面示例那樣製作比薩:
requested_toppings = []
#判斷列表是否是空的,如果是空的沒有判斷,就會出現錯誤,所以要事先判斷列表是不是空列表
if requested_toppings:
for requested_topping in requested_toppings:
if requested_topping == 'pepperoni':
print("Sorry, we are out of pepperoni right now.")
else:
print("Adding " + requested_topping + '.')
print("\nFinished making your pizza.")
else:
print("Are you sure you want a plain pizza?")
在這裡,我們首先創建了一個空列表,其中不包含任何配料。第一個if語句進行簡單檢查,而不是直接執行for迴圈。在if語句中將列表名用在條件表達式
中時,Python將在列表中至少包含一個元素返回True,併在列表為空是返回False。如果requested_toppings不為空,就運行與前一個示例相同的for迴圈;
否則,就列印一條消息,詢問顧客是否確實要點不加任何配料的普通比薩。
在這裡,這個列表為空,因此輸出如下——詢問顧客是否確實要點普通披薩:
Are you sure you want a plain pizza?
如果這個列表不為空,將顯示在比薩中添加的各種配料的輸出。
5.4.3 使用多個列表
顧客的要求往往五花八門,在比薩配料方面尤其如此。如果顧客要在比薩中添加炸薯條,該怎麼辦呢?可使用列表和if語句來確定能否滿足顧客的要求。
來看看在製作比薩前如何拒絕怪異的配料要求。下麵的示例定義了兩個列表,其中第一個列表包含比薩店供應的配料,而第二個列表包含顧客點的配料。
這次對於requested_toppings中的每個元素,都檢查它是否是比薩店供應的配料,在決定是否在比薩中添加它:
available_toppings = ['mushrooms','olives','green peppers','pepperoni','pineapple','extra cheese']
requested_toppings = ['mushrooms','french fries','extra cheese']
for requested_topping in requested_toppings:
if requested_topping in available_toppings:
print("Adding " + requested_topping + '.')
else:
print("Sorry, we don't have " + requested_topping + '.')
print("\nFinished making your pizza.")
首先我們定義了一個比薩店能夠提供配料的列表。請註意,如果比薩店供應的配料是固定的,也可以使用一個元組來存儲它們。接著,我們有定義了一個
列表,其中包含顧客點的配料,請註意那個不同尋常的配料——'french fries'.接著我們遍歷顧客點的配料列表。在這個迴圈中,對於顧客點的每種配料,
我們都檢查它是否包含在供應的配料里誒保重;如果答案是肯定的,就將其加入到比薩中,否則將運行False代碼塊:列印一條消息,告訴顧客不供應這種配料
這些代碼的輸出整潔而詳實:
Adding mushrooms.
Sorry, we don't have french fries.
Adding extra cheese.
Finished making your pizza.
動手試一試
5-8 以特殊方式跟管理員打招呼:本題考察的是for迴圈和if語句的使用,在用戶登錄網站的時候,會根據用戶的性質進行判斷
login_users = ['admin','zhangxx','loujq','xiaoaj','liuxs']
for login_user in login_users:
if login_user == 'admin':
print("Hello admin,would you like to see a status report?")
else:
print("Hello Eric,thank you for logging in again.")
5-9 處理沒有用戶的情形:本題首先判斷用戶列表是否是空,如果是空,執行什麼操作,如果不是空,則執行另外的操作:
login_users = []
#判斷列表是否為空,如果為空,則執行空對應的語句
if login_users:
for login_user in login_users:
if login_user == 'admin':
print("Hello admin,would you like to see a status report?")
else:
print("Hello Eric,thank you for logging in again.")
else:
print("We need to find some users!")
5-10 檢查用戶名
current_users = ['admin','zqq','lXs','ljq','dls','gw','sC']
new_users = ['gcx','zmz','lxs','gjz','sc']
transfor_current_users = []
#進行列表轉換,把用戶名都轉化為小寫,以確保用戶名的唯一性
for current_user in current_users:
transfor_current_users.append(current_user.title())
for new_user in new_users:
if new_user.title() in transfor_current_users:
print("The user name of " + new_user + " has been registered,please enter another user name.")
else:
print("This user name is not used .")
5-11 序數 本題考察對列表的時候,表示方法,然後就是if-elif-else的使用,還有for迴圈遍歷列表的特性,要知道,for迴圈是遍歷列表的每一個
元素,從列表的第一個元素開始遍歷,運行整個程式。
ordinal_numbers = list(range(1,10))
for ordinal_number in ordinal_numbers:
if ordinal_number == 1:
print(str(ordinal_number) + 'st')
elif ordinal_number == 2:
print(str(ordinal_number) + 'nd')
else:
print(str(ordinal_number) + 'th')
5.5 設置if語句的格式
本章的每個示例都展示了良好的格式設置習慣。在條件測試的格式設置方面,PEP 8提供的唯一建議是,在諸如==,>=和<=等比較運算符兩邊各添加一個空
格,例如,if age < 4 ;要比if age <4:好。
這樣的空格不會影響Python對代碼的解讀,而只是讓代碼閱讀起來更容易。