用巢狀 if 簡化你的擇偶條件式

施威銘研究室
6 min readJul 7, 2023

--

if 敘述相信大家都會用,你也可以把 if 敘述套在另一個 if 敘述裡,建立複雜的分支選項結構,這種層層加疊的 if 敘述就是巢狀 if 敘述。很多程式設計準則都會提醒,避免使用太多巢狀 if 敘述,但有時就是很難避免,該怎麼辦?

Photo by Ryan Quintal on Unsplash

試想這樣的場景。朋友有兩個心儀對象,不知道選哪個比較好,於是你提出建議,要朋友客觀的比較最在意的兩個條件。

假設你的朋友有點膚淺,想要找富二代也喜歡小鮮肉男友,因此你挑了年收入和出生年兩個因素,幫朋友比較一下哪個對象的條件更勝一籌:

●如果是比年收入,那數字代表年薪幾萬,高的人勝出。

●如果是比年紀,那數字代表幾歲,低的人勝出。

●不論哪一種條件,如果數字相等,就算平分秋色。

身為程式人,我們可以把上述的條件寫成巢狀 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 種還是很多,你能想出別的簡化方式嗎?

這裡還有一種思路。一號對象只要滿足以下其中一個條件,就可以勝出:

  1. factor 是 “ 年收入 “ 而且 p1_score 大於 p2_score。
  2. 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 人氣站長教你動手寫程式 — 不說教也能心領神會的引導式實作課》一書。

--

--

施威銘研究室
施威銘研究室

Written by 施威銘研究室

致力開發AI領域的圖書、創客、教具,希望培養更多的AI人才。整合各種人才,投入創客產品的開發,推廣「實作學習」,希望實踐學以致用的理想。

No responses yet