if 敘述相信大家都會用,你也可以把 if 敘述套在另一個 if 敘述裡,建立複雜的分支選項結構,這種層層加疊的 if 敘述就是巢狀 if 敘述。很多程式設計準則都會提醒,避免使用太多巢狀 if 敘述,但有時就是很難避免,該怎麼辦?
試想這樣的場景。朋友有兩個心儀對象,不知道選哪個比較好,於是你提出建議,要朋友客觀的比較最在意的兩個條件。
假設你的朋友有點膚淺,想要找富二代也喜歡小鮮肉男友,因此你挑了年收入和出生年兩個因素,幫朋友比較一下哪個對象的條件更勝一籌:
●如果是比年收入,那數字代表年薪幾萬,高的人勝出。
●如果是比年紀,那數字代表幾歲,低的人勝出。
●不論哪一種條件,如果數字相等,就算平分秋色。
身為程式人,我們可以把上述的條件寫成巢狀 if 敘述:
factor = input(" 輸入比較條件:")
p1_score = int(input(" 輸入一號對象的分數:"))
p2_score = int(input(" 輸入二號對象的分數:"))
#1
if factor == " 年收入 ":
if p1_score == p2_score:
print(" 雙方平手。")
elif p1_score > p2_score:
print(" 一號對象獲勝。")
else:
print(" 二號對象獲勝。")
#2
elif factor == " 年紀":
if p1_score == p2_score:
print(" 雙方平手。")
elif p1_score < p2_score:
print(" 一號對象獲勝。")
else:
print(" 二號對象獲勝。")
#3
else:
print(" 請輸入年收入或年紀。")
這個程式會先要求輸入比較條件和兩人的分數。
#1 的 if 敘述會在 factor 等於 “ 年收入“ 時執行。根據條件設定,分數較高的對象勝出,如果雙方分數相同就是平分秋色。
#2 的 elif 敘述會在 factor 等於 “ 年紀“ 的時候執行,分數低的對象較具優勢,如果雙方分數相同就算難分軒輊。
#3 的 else 敘述在 factor 不等於 “ 年收入“ 也不等於 “ 年紀 “ 的時候執行,代表目前輸入的不是朋友在意的條件,這時候會顯示 “ 請輸入年收入或年紀 ”。
這個程式的輸出會隨輸入的值改變。以輸入 “ 年收入 “ 的條件來說:
輸入條件類型 : 年收入
輸入一號對象的分數 : 75
輸入二號對象的分數:64
一號對象獲勝
假設條件變成 “ 年紀 “ ,來看看輸出結果:
輸入條件類型 : 年紀
輸入一號對象的分數 : 25
輸入二號對象的分數:34
一號對象獲勝
以上兩種條件類型,都會有一號勝、二號勝、平手狀況,再加上一開始若輸入兩個條件以外的任何內容,會顯示提示訊息,所以程式運行總共有 7 種判斷結果:
條件類型 判斷結果
年收入 p1_score == p2_score
年收入 p1_score > p2_score
年收入 p1_score < p2_score
年紀 p1_score == p2_score
年紀 p1_score > p2_score
年紀 p1_score < p2_score
其他 暫不比較
我們來看看怎麼簡化前面程式的巢狀 if 敘述。
首先,無論是哪一種條件,如果 p1_score 等於 p2_score 就會平手。所以我們可以從兩個條件的巢狀 if 敘述裡,把相等的檢查移到外面,做成一個 if 敘述:
if p1_score == p2_score:
print(" 雙方平手。")
elif factor == " 年收入 ":
if p1_score > p2_score:
print(" 一號選手獲勝。")
else:
print(" 二號選手獲勝。")
elif factor == " 年紀 ":
if p1_score < p2_score:
print(" 一號選手獲勝。")
else:
print(" 二號選手獲勝。")
else:
print(" 請輸入年收入或年紀。")
現在程式只剩 6 種執行路徑了。但6 種還是很多,你能想出別的簡化方式嗎?
這裡還有一種思路。一號對象只要滿足以下其中一個條件,就可以勝出:
- factor 是 “ 年收入 “ 而且 p1_score 大於 p2_score。
- factor 是 “ 年紀 “ 而且 p1_score 小於 p2_score。
我們可以用複合條件運算式來描述這兩個條件:
p1_wins_income = (factor == " 年收入 ") and (p1_score > p2_score)
p1_wins_age = (factor == " 年紀 ") and (p1_score < p2_score)
p1_wins = p1_wins_income or p1_wins_age
這段程式碼寫得有點擁擠,我們把各個部份分開來仔細查看一下。
第一行的結構看起來可能有點奇怪。先是有一個賦值算符(=),之後是一個複合條件式。這行程式碼會計算這個複合條件式,再把計算結果指派給 p1_wins_basketball 變數:
(factor == " 年收入 ") and (p1_score > p2_score)
如果 factor 是 “ 年收入 “ 而且 p1_score 的分數大於 p2_score,那 p1_wins_income 就會是 True。
接下來對 p1_wins_age 那一行進行類似的運算。如果 factor 是 “ 年紀 “ 而且 p1_score 小於 p2_score,那 p1_wins_age 就是 True。
最後,如果一號對象從其中一個條件比較勝出,那 p1_wins 就是 True,要不然就是 False。
這樣的程式碼大大簡化了流程:
if p1_score == p2_score:
print("雙方平分秋色、難分軒輊")
elif (factor == " 年收入 ") or (factor == " 年紀 "):
p1_wins_income = (factor == " 年收入 ") and (p1_score > p2_score)
p1_wins_age = (factor == " 年紀 ") and (p1_score < p2_score)
p1_wins = p1_wins_income or p1_wins_age
if p1_wins:
print(" 一號對象獲勝。")
else:
print(" 二號對象獲勝。")
else:
print(" 請輸入年收入或年紀 ")
這個修訂版程式的執行路徑只有 4 種,而且程式碼也更好理解。
巢狀 if 敘述有時候還是有必要的,但是如果你發現自己已經寫了大量的巢狀 if 敘述,那麼建議還是停下來思考一下怎麼簡化程式碼比較好。
有時人生也是需要回歸原點思考,對兩性問題也略懂的小編要提醒:在擇偶這件事上,可以量化的條件通常比較不重要,「內在」往往才是決定你們是否能走得長久的關鍵,祝福大家早日找到真愛。
如果想先厚實自己的「內在」,可以從深入研究 Python 程式的細節開始,推薦你參考旗標科技《Real Python 人氣站長教你動手寫程式 — 不說教也能心領神會的引導式實作課》一書。