編程時經常需要檢查一系列條件,并據此決定采取什么措施。在Python中,if 語句讓你能夠檢查程序的當前狀態,并據此采取相應的措施。
5.1 一個簡單示例
cars = ['audi', 'bmw', 'subaru', 'toyota']
for car in cars:
if car == 'bmw':
print(car.upper()) #對于汽車名'bmw' ,以全大寫的方式打印
else:
print(car.title()) #其他的汽車以首字母大寫的方式打印
Audi
BMW
Subaru
Toyota
5.2 條件測試
每條if語句的核心都是一個值為True或False的表達式,這種表達式被稱為條件測試
。
Python根據條件測試的值為True還是False來決定是否執行if語句中的代碼。如果條件測試的值為True,Python就執行緊跟在if語句后面的代碼;如果為False,Python就忽略這些代碼。
5.2.1 檢查是否相等
首先使用一個等號將car 的值設置為'bmw'。接下來,使用兩個等號(==)檢查car 的值是否為'bmw'。這個相等運算符在它兩邊的值相等時返回True ,否則返回False 。兩邊的值相等,因此Python返回True 。如果變量car的值不是'audi',測試將返回False。
car = 'bmw'
print(car == 'bmw')
True
print(car == 'audi')
False
5.2.2 檢查是否相等時不考慮大小寫
在Python中檢查是否相等時區分大小寫,如果大小寫很重要,這種行為有其優點;但如果大小寫無關緊要,而只想檢查變量的值,可將變量的值轉換為小寫或大寫,再進行比較。
函數lower() 不會修改存儲在變量car 中的值,因此進行這樣的比較時不會影響原來的變量。
car = 'Audi'
print(car == 'audi')
print(car.lower() == 'audi'.lower())
print(car.upper() == 'audi'.upper())
False
True
True
5.2.3 檢查是否不相等
要判斷兩個值是否不等,可結合使用驚嘆號和等號(!= ),其中的驚嘆號表示不,在很多編程語言中都如此。
requested_topping = 'mushrooms'
if requested_topping != 'anchovies':
print("Hold the anchovies!")
Hold the anchovies!
5.2.4 比較數字
條件語句中可包含各種數學比較,如小于(<)、小于等于(<=)、大于(>)、大于等于(>=)。
age = 18
print(age == 18)
True
answer = 17
if answer != 42:
print("That is not the correct answer. Please try again!")
That is not the correct answer. Please try again!
age = 21
print(age < 21)
print(age <= 21)
print(age > 21)
print(age >= 21)
False
True
False
True
5.2.5 檢查多個條件
- 使用and 檢查多個條件
要檢查是否兩個條件都為True,可使用關鍵字and將兩個條件測試合而為一;如果每個測試都通過了,整個表達式就為True;如果至少有一個測試沒有通過,整個表達式就為False。
為改善可讀性,可將每個測試都分別放在一對括號內,但并非必須這樣做。
age_0 = 22
age_1 = 18
print(age_0 >= 21and age_1 >= 21)
print((age_0 >= 21) & (age_1 >= 21))
age_1 = 22
print(age_0 >= 21and age_1 >= 21)
print((age_0 >= 21) and (age_1 >= 21))
False
False
True
True
- 使用or 檢查多個條件
關鍵字or也能夠檢查多個條件,但只要至少有一個條件滿足,就能通過整個測試。僅當兩個測試都沒有通過時,使用or的表達式才為False 。
另注意,類似與C,|和&分別表示or和and。但是尤其要注意運算的優先級。
age_0 = 22
age_1 = 18
print(age_0 >= 21or age_1 >= 21)
print((age_0 >= 21) | (age_1 >= 21))
print(age_0 >= 21 | age_1 >= 21)
age_0 = 18
print(age_0 >= 21or age_1 >= 21)
print((age_0 >= 21) | (age_1 >= 21))
True
True
False
False
False
5.2.6 檢查特定值是否包含在列表中
要判斷特定的值是否已包含在列表中,可使用關鍵字in。
requested_toppings = ['mushrooms', 'onions', 'pineapple']
print('mushrooms'in requested_toppings)
print('pepperoni'in requested_toppings)
True
False
5.2.7 檢查特定值是否不包含在列表中
確定特定的值未包含在列表中很重要;在這種情況下,可使用關鍵字not in。
banned_users = ['andrew', 'carolina', 'david']
user = 'marie'
if user notin banned_users:
print(user.title() + ", you can post a response if you wish.")
Marie, you can post a response if you wish.
5.2.8 布爾表達式
布爾表達式不過是條件測試的別名。與條件表達式一樣,布爾表達式的結果要么為True,要么為False。布爾值通常用于記錄條件。
game_active = True
can_edit = False
print(game_active, can_edit)
True False
練習: 5-1 條件測試 :編寫一系列條件測試;將每個測試以及你對其結果的預測和實際結果都打印出來。
詳細研究實際結果,直到你明白了它為何為True 或False 。
創建至少10個測試,且其中結果分別為True 和False 的測試都至少有5個。
5-2 更多的條件測試 :你并非只能創建10個測試。如果你想嘗試做更多的比較,可再編寫一些測試,并將它們加入到conditional_tests.py中。對于下面列出的各種測試,至少編寫一個結果為True 和False 的測試。
檢查兩個字符串相等和不等。
使用函數lower()的測試。
檢查兩個數字相等、不等、大于、小于、大于等于和小于等于。
使用關鍵字and 和or 的測試。
測試特定的值是否包含在列表中。
測試特定的值是否未包含在列表中。
# 5-1
print('-----5-1-----')
car = 'subaru'
print("Is car == 'subaru'? I predict True. Actually it's {}".format(car == 'subaru'))
print("Is car == 'audi'? I predict False. Actually it's {}".format(car == 'audi'))
number = 55
print("Is number == 44? I predict True. Actually it's {}".format(number == 44))
print("Is number == 55? I predict False. Actually it's {}".format(number == 55))
# 5-2
print('-----5-2-----')
string_1 = 'string_1'
string_2 = 'String_1'
print(string_1 == string_2, string_1 != string_2)
print(string_1.lower() == string_2.lower(), string_1.lower() != string_2.lower())
number_1 = 55
number_2 = 66
print(number_1 == number_2, number_1 != number_2, number_1 > number_2, number_1 < number_2,
number_1 <= number_2, number_1 >= number_2)
print(string_1 == string_2 and number_1 != number_2)
print(string_1 != string_2 or number_1 <= number_2)
numbers = [1,2,3,4,5,6,7,8,10]
print(9in numbers)
print(8notin numbers)
-----5-1-----
Is car == 'subaru'? I predict True. Actually it's True
Is car == 'audi'? I predict False. Actually it's False
Is number == 44? I predict True. Actually it's False
Is number == 55? I predict False. Actually it's True
-----5-2-----
False True
True False
False True False True True False
False
True
False
False
5.3 if 語句
5.3.1 簡單的if 語句
最簡單的if語句只有一個測試和一個操作。
age = 19
if age >= 18:
print("You are old enough to vote!")
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?")
You are old enough to vote!
Have you registered to vote yet?
5.3.2 if-else 語句
經常需要在條件測試通過了時執行一個操作,并在沒有通過時執行另一個操作;在這種情況下,可使用Python提供的if-else語句。
if-else語句塊類似于簡單的if語句,但其中的else 語句讓你能夠指定條件測試未通過時要執行的操作。
if-else 結構非常適合用于要讓Python執行兩種操作之一的情形。在這種簡單的if-else 結構中,總是會執行兩個操作中的一個。
age = 17
if age >= 18:
print("You are old enough to vote!")
print("Have you registered to vote yet?")
else:
print("Sorry, you are too young to vote.")
print("Please register to vote as soon as you turn 18!")
Sorry, you are too young to vote.
Please register to vote as soon as you turn 18!
5.3.3 if-elif-else 結構
經常需要檢查超過兩個的情形,為此可使用Python提供的if-elif-else 結構。
Python只執行if-elif-else 結構中的一個代碼塊,它依次檢查每個條件測試,直到遇到通過了的條件測試。測試通過后,Python將執行緊跟在它后面的代碼,并跳過余下的測試。
age = 12
if age < 4:
print("Your admission cost is $0.")
elif age < 18:
print("Your admission cost is $5.")
else:
print("Your admission cost is $10.")
Your admission cost is $5.
age = 12
if age < 4:
price = 0
elif age < 18:
price = 5
else:
price = 10
print("Your admission cost is ${}.".format(price))
Your admission cost is $5.
5.3.4 使用多個elif 代碼塊
可根據需要使用任意數量的elif代碼塊。
age = 66
if age < 4:
price = 0
elif age < 18:
price = 5
elif age < 65:
price = 10
else:
price = 3
print("Your admission cost is ${}.".format(price))
Your admission cost is $3.
5.3.5 省略else 代碼塊
Python并不要求if-elif結構后面必須有else代碼塊。在有些情況下,else代碼塊很有用;而在其他一些情況下,使用一條elif語句來處理特定的情形更清晰。
else 是一條包羅萬象的語句,只要不滿足任何if或elif中的條件測試,其中的代碼就會執行,這可能會引入無效甚至惡意的數據。如果知道最終要測試的條件,應考慮使用一個elif代碼塊來代替else代碼塊。這樣就可以肯定,僅當滿足相應的條件時,代碼才會執行。
age = 12
if age < 4:
price = 0
elif age < 18:
price = 5
elif age < 65:
price = 10
elif age >= 65:
price = 3
print("Your admission cost is ${}.".format(price))
Your admission cost is $5.
5.3.6 測試多個條件
if-elif-else 結構功能強大,但僅適合用于只有一個條件滿足的情況:遇到通過了的測試后,Python就跳過余下的測試。這種行為很好,效率很高,讓你能夠測試一個特定的條件。
然而,有時候必須檢查你關心的所有條件。在這種情況下,應使用一系列不包含elif和else代碼塊的簡單if語句。在可能有多個條件為True,且你需要在每個條件為True時都采取相應措施時,適合使用這種方法。
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!")
Adding mushrooms.
Adding extra cheese.
Finished making your pizza!
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!")
Adding mushrooms.
Finished making your pizza!
如果你只想執行一個代碼塊,就使用if-elif-else 結構;如果要運行多個代碼塊,就使用一系列獨立的if 語句。
練習: 5-3 外星人顏色#1 :假設在游戲中剛射殺了一個外星人,請創建一個名為alien_color 的變量,并將其設置為'green' 、'yellow' 或'red' 。
編寫一條if 語句,檢查外星人是否是綠色的;如果是,就打印一條消息,指出玩家獲得了5個點。
編寫這個程序的兩個版本,在一個版本中上述測試通過了,而在另一個版本中未通過(未通過測試時沒有輸出)。
5-4 外星人顏色#2 :像練習5-3那樣設置外星人的顏色,并編寫一個if-else 結構。
如果外星人是綠色的,就打印一條消息,指出玩家因射殺該外星人獲得了5個點。
如果外星人不是綠色的,就打印一條消息,指出玩家獲得了10個點。
編寫這個程序的兩個版本,在一個版本中執行if 代碼塊,而在另一個版本中執行else 代碼塊。
5-5 外星人顏色#3 :將練習5-4中的if-else 結構改為if-elif-else 結構。
如果外星人是綠色的,就打印一條消息,指出玩家獲得了5個點。
如果外星人是黃色的,就打印一條消息,指出玩家獲得了10個點。
如果外星人是紅色的,就打印一條消息,指出玩家獲得了15個點。
編寫這個程序的三個版本,它們分別在外星人為綠色、黃色和紅色時打印一條消息。
5-6 人生的不同階段 :設置變量age 的值,再編寫一個if-elif-else 結構,根據age 的值判斷處于人生的哪個階段。
如果一個人的年齡小于2歲,就打印一條消息,指出他是嬰兒。
如果一個人的年齡為2(含)~4歲,就打印一條消息,指出他正蹣跚學步。
如果一個人的年齡為4(含)~13歲,就打印一條消息,指出他是兒童。
如果一個人的年齡為13(含)~20歲,就打印一條消息,指出他是青少年。
如果一個人的年齡為20(含)~65歲,就打印一條消息,指出他是成年人。
如果一個人的年齡超過65(含)歲,就打印一條消息,指出他是老年人。
5-7 喜歡的水果 :創建一個列表,其中包含你喜歡的水果,再編寫一系列獨立的if 語句,檢查列表中是否包含特定的水果。
將該列表命名為favorite_fruits ,并在其中包含三種水果。
編寫5條if 語句,每條都檢查某種水果是否包含在列表中,如果包含在列表中,就打印一條消息,如“You really like bananas!”。
# 5-3
print("-----5-3-----")
alien_color = 'green'
if alien_color == 'green':
print("Player gets 5 points.")
alien_color = 'red'
if alien_color == 'green':
print("Player gets 5 points.")
# 5-4
print("-----5-4-----")
if alien_color == 'green':
score = 5
else:
score = 10
print("Player gets {} points.".format(score))
# 5-5
print("-----5-5-----")
if alien_color == "green":
score = 5
elif alien_color == "yellow":
score = 10
else:
score = 15
print("Player gets {} points.".format(score))
# 5-6
print("-----5-6-----")
age = 38
if age < 2:
status = "infant"
elif age < 4:
status = "baby"
elif age < 13:
status = "child"
elif age < 20:
status = "teenage"
elif age < 65:
status = "adult"
elif age >= 65:
status = "aged"
print("{} years old is {}".format(age, status))
# 5-7
print("-----5-7-----")
favorite_fruits = ["bananas", "apples", "cherries", "oranges"]
fruit = "bananas"
if fruit in favorite_fruits:
print("You really like {}!".format(fruit))
-----5-3-----
Player gets 5 points.
-----5-4-----
Player gets 10 points.
-----5-5-----
Player gets 15 points.
-----5-6-----
38 years old is adult
-----5-7-----
You really like bananas!
5.4 使用if 語句處理列表
5.4.1 檢查特殊元素
requested_toppings = ['mushrooms', 'green peppers', 'extra cheese']
for requested_topping in requested_toppings:
print("Adding {}.".format(requested_topping))
print("nFinished making your pizza!")
Adding mushrooms.
Adding green peppers.
Adding extra cheese.
Finished making your pizza!
requested_toppings = ['mushrooms', 'green peppers', 'extra cheese']
for requested_topping in requested_toppings:
if requested_topping == 'green peppers':
print("Sorry, we are out of green peppers right now.")
else:
print("Adding " + requested_topping + ".")
print("nFinished making your pizza!")
Adding mushrooms.
Sorry, we are out of green peppers right now.
Adding extra cheese.
Finished making your pizza!
5.4.2 確定列表不是空的
到目前為止,對于處理的每個列表都做了一個簡單的假設,即假設它們都至少包含一個元素。我們馬上就要讓用戶來提供存儲在列表中的信息,因此不能再假設循環運行時列表不是空的。有鑒于此,在運行for 循環前確定列表是否為空很重要。
requested_toppings = []
if requested_toppings:
for requested_topping in requested_toppings:
print("Adding " + requested_topping + ".")
print("nFinished making your pizza!")
else:
print("Are you sure you want a plain pizza?")
Are you sure you want a plain pizza?
首先創建了一個空列表,其中不包含元素。然后進行了簡單檢查,而不是直接執行for循環。在if語句中將列表名用在條件表達式中時,Python將在列表至少包含一個元素時返回True,并在列表為空時返回False。
5.4.3 使用多個列表
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!")
Adding mushrooms.
Sorry, we don't have french fries.
Adding extra cheese.
Finished making your pizza!
練習: 5-8 以特殊方式跟管理員打招呼 :創建一個至少包含5個用戶名的列表,且其中一個用戶名為'admin' 。想象你要編寫代碼,在每位用戶登錄網站后都打印一條問候消息。遍歷用戶名列表,并向每位用戶打印一條問候消息。
如果用戶名為'admin' ,就打印一條特殊的問候消息,如“Hello admin, would you like to see a status report?”。
否則,打印一條普通的問候消息,如“Hello Eric, thank you for logging in again”。
5-9 處理沒有用戶的情形 :在為完成練習5-8編寫的程序中,添加一條if 語句,檢查用戶名列表是否為空。
如果為空,就打印消息“We need to find some users!”。
刪除列表中的所有用戶名,確定將打印正確的消息。
5-10 檢查用戶名 :按下面的說明編寫一個程序,模擬網站確保每位用戶的用戶名都獨一無二的方式。
創建一個至少包含5個用戶名的列表,并將其命名為current_users 。
再創建一個包含5個用戶名的列表,將其命名為new_users ,并確保其中有一兩個用戶名也包含在列表current_users 中。
遍歷列表new_users ,對于其中的每個用戶名,都檢查它是否已被使用。如果是這樣,就打印一條消息,指出需要輸入別的用戶名;否則,打印一條消息,指出這個用戶名未被使用。
確保比較時不區分大消息;換句話說,如果用戶名'John' 已被使用,應拒絕用戶名'JOHN' 。
5-11 序數 :序數表示位置,如1st和2nd。大多數序數都以th結尾,只有1、2和3例外。
在一個列表中存儲數字1~9。
遍歷這個列表。
在循環中使用一個if-elif-else 結構,以打印每個數字對應的序數。輸出內容應為1st 、2nd 、3rd 、4th 、5th 、6th 、7th 、8th 和9th ,但每個序數都獨占一行。
# 5-8
print("-----5-8-----")
#users = ['admin', 'mike', 'john', 'alice', 'helen']
users = []
for user in users:
if user == 'admin':
print("Hello {}, would you like to see a status report?".format(user))
else:
print("Hello {}, thank you for logging in again.".format(user))
# 5-9
print("-----5-9-----")
if users:
for user in users:
if user == 'admin':
print("Hello {}, would you like to see a status report?".format(user))
else:
print("Hello {}, thank you for logging in again.".format(user))
else:
print("We need to find some users!")
# 5-10
print("-----5-10-----")
current_users = ['frank', 'mike', 'john', 'alice', 'helen']
new_users = ['trump', 'Mike', 'Biden', 'ALice', 'Clinton']
for user in new_users:
if user.lower() in [current_user.lower() for current_user in current_users]:
print("{} is used.".format(user))
else:
print("{} can be used.".format(user))
# 5-11
print("-----5-11-----")
numbers = list(range(1,10))
for number in numbers:
if number == 1:
print("{}st".format(number),end="t")
elif number == 2:
print("{}nd".format(number),end="t")
elif number == 3:
print("{}rd".format(number),end="t")
else:
print("{}th".format(number),end="t")
-----5-8-----
-----5-9-----
We need to find some users!
-----5-10-----
trump can be used.
Mike is used.
Biden can be used.
ALice is used.
Clinton can be used.
-----5-11-----
1st 2nd 3rd 4th 5th 6th 7th 8th 9th
5.5 設置if 語句的格式 本章的每個示例都展示了良好的格式設置習慣。在條件測試的格式設置方面,PEP 8提供的唯一建議是,在諸如== 、>= 和<= 等比較運算符兩邊各添加一個空格,例如,if age < 4:
要比if age<4:
好。
這樣的空格不會影響Python對代碼的解讀,而只是讓代碼閱讀起來更容易。
練習:
5-12 設置if 語句的格式 :審核你在本章編寫的程序,確保正確地設置了條件測試的格式。
5-13 自己的想法 :與剛拿起本書時相比,現在你是一名能力更強的程序員了。鑒于你對如何在程序中模擬現實情形有了更深入的認識,你可以考慮使用程序來解決一些問題。隨著編程技能不斷提高,你可能想解決一些問題,請將這方面的想法記錄下來。想想你可能想編寫的游戲、想研究的數據集以及想創建的Web應用程序。
評論
查看更多