Perl 語言的原作者 Larry Wall 曾經說過,偉大的程式設計師都有三個優點:懶惰、暴躁和自負。乍一看這三個詞語沒有一個是褒義詞,但在程式設計師的世界裡,這三個詞有不同的意義。首先,懶惰會促使程式設計師去寫一些省事兒的程式來輔助自己或別人更好的完成工作,這樣我們就無需做那些重複和繁瑣的勞動;同理能夠用 3 行程式碼解決的事情,我們也絕不會寫出 10 行程式碼來。其次,暴躁會讓程式設計師主動的去完成一些你還沒有提出的工作,去優化自己的程式碼讓它更有效率,能夠 3 秒鐘完成的任務,我們絕不能容忍1分鐘的等待。最後,自負會促使程式設計師寫出可靠無誤的程式碼,我們寫程式碼不是為了接受批評和指責,而是為了讓其他人來膜拜。
那麼接下來就有一個很有意思的問題值得探討一下,我們需要一個程式從輸入的三個數中找出最大的那個數。這個程式對任何會程式設計的人來說都是小菜一碟,甚至不會程式設計的人經過 10 分鐘的學習也能搞定。下面是用來解決這個問題的 Python 程式碼。
a = int(input('a = '))
b = int(input('b = '))
c = int(input('c = '))
if a > b:
the_max = a
else:
the_max = b
if c > the_max:
the_max = c
print('The max is:', the_max)
但是我們剛才說了,程式設計師都是懶惰的,很多程式設計師都會使用三元條件運算子來改寫上面的程式碼。
a = int(input('a = '))
b = int(input('b = '))
c = int(input('c = '))
the_max = a if a > b else b
the_max = c if c > the_max else the_max
print('The max is:', the_max)
需要說明的是,Python 在 2.5 版本以前是沒有上面程式碼第4行和第5行中使用的三元條件運算子的,究其原因是 Guido van Rossum(Python 之父)認為三元條件運算子並不能幫助 Python 變得更加簡潔,於是那些習慣了在 C/C++ 或 Java 中使用三元條件運算子(在這些語言中,三元條件運算子也稱為「Elvis運算子」,因為?:
放在一起很像著名搖滾歌手貓王 Elvis 的大背頭)的程式設計師試著用and
和or
運算子的短路特性來模擬出三元操作符,於是在那個年代,上面的程式碼是這樣寫的。
a = int(input('a = '))
b = int(input('b = '))
c = int(input('c = '))
the_max = a > b and a or b
the_max = c > the_max and c or the_max
print('The max is:', the_max)
但是這種做法在某些場景下是不能成立的,且看下面的程式碼。
a = 0
b = -100
# 下面的程式碼本來預期輸出a的值,結果卻得到了b的值
# 因為a的值0在進行邏輯運算時會被視為False來處理
print(True and a or b)
# print(a if True else b)
所以在 Python 2.5 以後引入了三元條件運算子來避免上面的風險(上面程式碼被註釋掉的最後一句話)。那麼,問題又來了,上面的程式碼還可以寫得更簡短嗎?答案是肯定的。
a = int(input('a = '))
b = int(input('b = '))
c = int(input('c = '))
print('The max is:', (a if a > b else b) if (a if a > b else b) > c else c)
但是,這樣做真的好嗎?如此複雜的表示式是不是讓程式碼變得晦澀了很多呢?我們發現,在實際開發中很多開發者都喜歡過度的使用某種語言的特性或語法糖,於是簡單的多行程式碼變成了複雜的單行表示式,這樣做真的好嗎?這個問題我也不止一次的問過自己,現在我能給出的答案是下面的程式碼,使用輔助函式。
def the_max(x, y):
return x if x > y else y
a = int(input('a = '))
b = int(input('b = '))
c = int(input('c = '))
print('The max is:', the_max(the_max(a, b), c))
上面的程式碼中,我定義了一個輔助函式the_max
用來找出引數傳入的兩個值中較大的那一個,於是下面的輸出語句可以通過兩次呼叫the_max
函式來找出三個數中的最大值,現在程式碼的可讀性是不是好了很多。用輔助函式來替代複雜的表示式真的是一個不錯的選擇,關鍵是比較大小的邏輯轉移到這個輔助函式後不僅可以反覆呼叫它,而且還可以進行級聯操作。
當然,很多語言中比較大小的函式根本沒有必要自己來實現(通常都是內建函式),Python 也是如此。Python 內建的 max 函式利用了 Python 對可變引數的支援,允許一次性傳入多個值或者一個迭代器並找出那個最大值,所以上面討論的問題在 Python 中也就是一句話的事,但是從複雜表示式到使用輔助函式簡化複雜表示式這個思想是非常值得玩味的,所以分享出來跟大家做一個交流。
a = int(input('a = '))
b = int(input('b = '))
c = int(input('c = '))
print('The max is:', max(a, b, c))