#49403: 分享 python 不用寫一堆 if 的方法


sam851015@gmail.com (多挖鼻孔有益身心健康)


這題沒什麼難度,最大的難度是知道公式長怎樣,有人提供了那這邊就不補充(公式連結)

然後根據未知數的位置進行不同的計算

 

直覺寫法是根據 -1 的位置寫一大堆 if,例如這樣

idx = expr.index(-1)
if idx == 0:
    # 算式1

elif idx == 1:
    # 算式2

elif idx == 2:
  # 算式3

...(下略)

 

但這寫起來也太囉嗦了,每一個分支條件都只是在比較 -1 的位置,寫一堆長相差不多的表達式

至少對我來說是很囉唆

 

--

 

在比較新的 python 版本中(3.10後),可以使用 match...case... 語句,作用類似 c++ 的 switch...case...

像這樣

idx = expr.index(-1)
match idx:
  case 0:
        # 算式1

  case 1:
        # 算式2

  case 2:
        # 算式3

    ...(下略)

 

這樣寫起來就會好看很多,增加一點可讀性

 

--

But

ZeroJudge 的 python 版本只有到 3.6,沒有 match...case... 這種語法,該怎麼辦呢?

這時候就可以利用到另一個特性: list 的元素可以放置任意類型的物件

 

什麼意思?

我們都知道 list 裡面可以...

放數字,例如: [1, 1, 4, 5, 1, 4]

放字串,例如: ["你是一個", "一個一個一個", "嗯", "哼", "啊啊啊啊啊"]

list ,例如: [[1, "(確信)"], [2, "困惑"]]

 

若你不知道,那你現在知道了。

 

只要是物件,無論什麼類型都可以放進去

這時候再引入一個觀念: python 的一切都是物件

 

int 是物件

str 是物件

list 是物件

...

 

那函數呢?

函數也是物件,當然也可以放在 list 裡面

可以寫成像這樣的形式:  [函數1, 函數2, 函數3, ..., 函數n]

實際使用時直接抓位置就好,例如一個簡單的加減乘除

clac = [
  lambda a, b: a + b,
  lambda a, b: a - b,
  lambda a, b: a * b,
  lambda a, b: a / b
]


foo, bar = 10, 5
print(calc[0](foo, bar))    # 加法
print(calc[1](foo, bar))    # 減法
print(calc[2](foo, bar))    # 乘法
print(calc[3](foo, bar))    # 除法

 

使用時就像範例那樣,在後面補括號,把要傳入的參數放進去即可

這樣就可以不寫任何 if 處理各種狀況了

 

參考答案: gist(python)