在很多場景下,我們可能需要寫大量的if else分支來進行判斷,然後根據結果再進入下一步的業務邏輯。這樣可能導致一個方法的行數會大大增加,增加閱讀的難度,並且健壯性變差。
目前只想到了2種場景下,代替if else 的方案。
以優化下面代碼爲例,下面是原代碼:
def slove():
number = input("please input a number, limit 0-5")
if number == "1":
time.sleep(1)
print("the number that you input is: ",1)
if number == "2":
time.sleep(1)
print("the number that you input is: ",2)
if number == "3":
time.sleep(1)
print("the number that you input is: ",3)
if number == "4":
time.sleep(1)
print("the number that you input is: ",4)
if number == "5":
time.sleep(1)
print("the number that you input is: ",5)
else:
print("a error occur ,check")
time.sleep(1)
print("program exit...")
exit(0)
第一種優化場景,判斷條件爲數字類型:
將每個分支拆分爲一個函數。
def test1(number):
if number == "1":
print("the number that you input is: ",1)
def test2(number):
if number == "2":
print("the number that you input is: ", 2)
def test3(number):
if number == "3":
print("the number that you input is: ", 3)
def test4(number):
if number == "4":
print("the number that you input is: ", 4)
def test5(number):
if number == "5":
print("the number that you input is: ", 5)
# else:
# return
再循環這個函數列表
def slove():
number = input("please input a number, limit 0-5")
solve_list = [test1, test2, test3, test4, test5]
for func in solve_list:
func(number)
if __name__ == '__main__':
slove()
第二種場景,也是比較常見的,判斷條件爲字符串類型
拆分出來的函數不變,修改slove函數。
def slove2():
number = input("please input testN")
solve_list = [test1, test2, test3, test4, test5]
for func in solve_list:
# func.__name__取函數的名字
if number == func.__name__:
func(number)
if __name__ == '__main__':
slove2()
根據傳入的字符串,執行對應的分支函數。
最後解釋一下,拆分if else並不能提升代碼的執行效率,如果業務很複雜的話,可能還會比直接寫if else要低一些(因爲怎麼拆分還要考慮一下)。但拆分出來後,每一個分支的業務會更直觀,代碼整體可讀性會更好。
python lambda函數