'Python學習教程:用函數還是用複雜的表達式,值得優秀的你思考'

"

今天這期的Python學習教程,值得每一個優秀的你思考,你用函數還是寧願用複雜的表達式?

"

今天這期的Python學習教程,值得每一個優秀的你思考,你用函數還是寧願用複雜的表達式?

Python學習教程:用函數還是用複雜的表達式,值得優秀的你思考

要不要使用複雜表達式

Perl語言的原作者Larry Wall曾經說過,偉大的程序員都有三個優點:懶惰、暴躁和自負。乍一看這三個詞語沒有一個是褒義詞,但在程序員的世界裡,這三個詞有不同的意義。首先,懶惰會促使程序員去寫一些省事兒的程序來輔助自己或別人更好的完成工作,這樣我們就無需做那些重複和繁瑣的勞動;同理能夠用3行代碼解決的事情,我們也絕不會寫出10行代碼來。其次,暴躁會讓程序員主動的去完成一些你還沒有提出的工作,去優化自己的代碼讓它更有效率,能夠3秒鐘完成的任務,我們絕不能容忍1分鐘的等待。最後,自負會促使程序員寫出可靠無誤的代碼,我們寫代碼不是為了接受批評和指責,而是為了讓其他人來膜拜。

那麼接下來就有一個很有意思的問題值得探討一下,我們需要一個程序從輸入的三個數中找出最大的那個數。這個程序對任何會編程的人來說都是小菜一碟,甚至不會編程的人經過10分鐘的學習也能搞定。下面是用來解決這個問題的Python代碼。

a = int(input('a = '))
b = int(input('b = '))
c = int(input('c = '))
if a > b:
\tthe_max = a
else:
\tthe_max = b
if c > the_max:
\tthe_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):
\treturn 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))

對於此,你是怎麼看的呢?更多的Python學習教程也會繼續跟大家分享

關注並留言:Python,可以免費領取全套視頻版Python學習教程!先到先得,不食言!

"

相關推薦

推薦中...