第五章 if語句

来源:http://www.cnblogs.com/gengcx/archive/2017/03/25/6619006.html
-Advertisement-
Play Games

編程時經常需要檢查一系列條件,並據此決定採取什麼措施。在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根據條件測試的值為TrueFalse來決定執行是否執行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對代碼的解讀,而只是讓代碼閱讀起來更容易。




 


 
 
 
 


 
 
 
 












 
















您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • using System.Threading; using System; namespace ConsoleApplication4 { public class Program { static void Main(string[] args) { try { St... ...
  • (一)泛型概述 泛型不僅是C#編程語言的一部分,而且與程式集中的IL代碼緊密地集成。泛型不僅是C#語言的一種結構,而且是CLR定義的。有了泛型就可以創建獨立於被包含類型的類和方法了。 1、性能 泛型的一個主要優點就是性能。對值類型使用非泛型集合類,在把值類型轉化為引用類型,和把引用類型轉換為值類型時 ...
  • 1 var orders = from o in context.Orders 2 join a in context.Accounts on 3 // 使用匿名類型來構造一個複合的查詢表達式 4 new { Id = o.AccountId, City = o.ShipCity, State = ... ...
  • 1 ((IObjectContextAdapter)dbcontext).ObjectContext.CreateQuery<object>(esql, new ObjectParameter("name", value)) ...
  • ASP.NET MVC中,是依靠某些文件夾以及類的固定命名規則去組織model實體層,views視圖層和控制層的。如果是大規模的應用程式,經常會由不同功能的模塊組成,而每個功能模塊都由MVC中的三層所構成,因此,隨著應用程式規模的增大,如何組織這些不同功能模塊中的MVC三層的目錄結構,有時對開發者來 ...
  • efwplusUI開發框架 這是一個簡單Web框架,前臺採用amaze UI +requireJS+handlebarsJS,後臺採用WebApi+MongoDB,用Nginx做Http伺服器,隨著.Net Core的跨平臺,所以此框架也是可以在Liunx下運行。 為了保持WebApi介面訪問安全, ...
  • 作為一個學習NHibernate的新手,經常會遇到各種各樣的奇葩問題,其實這些問題的出現恰恰說明瞭我們技術的不足,將這些問題記錄下來加以總結相信對我們進一步的學習有很大的幫助。 在將封裝好的數據插入到資料庫里,運行到提交事務的時候,出現了“OracleParameterCollection 的 Co ...
  • svn 鎖的處理: 問題: 1:當用戶在work copy1 中把某個文件或者文件夾鎖住後,刪除了這個工作區,重新取下來work copy2,再操作該文件的時候就報錯說,該文件已經被鎖住,必須先解鎖,但是之前的工作區已經被刪除,無法解鎖; 2:當某用戶 鎖了一個文件或文件夾後,離職了,機器上交了,後... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...