某同學應聘Python崗位被錄用,上班第一天,Leader吩咐他寫一個獲取次日日期資訊的函式,該同學信心滿滿地寫下了這樣一段代碼, 然后就沒有然后了,
import time
def get_next_date():
time.sleep(24*60*60)
return time.strftime('%Y-%m-%d')
當然,這只是一個段子,相信沒有Python程式員真的會寫出這樣的代碼,不過,很多時候,我們寫出來的代碼盡管功能滿足需求,效率也還說得過去,但可讀性較差,且難以維護,和人們通常所說的簡潔優美相去甚遠,
那么,怎樣才能寫出傳說中的簡潔優美的Python代碼呢?前幾天,我在Python學習群里征集一個Python小題目的答案,借以了解程式員的編程習慣,分析影響程式員寫出Pythonic代碼的主要原因,最終總結出三條秘訣,題目如下:二維串列轉置,
嚴格講,Python的串列并沒有維度的概念,這里說的二維串列是指類似下面這樣的串列,
[ [1, 2, 3],
[4, 5, 6],
[7, 8, 9] ]
請實作二維串列的轉置(行列互換,首行變首列,尾行變尾列,如下所示),
[ [1, 4, 7],
[2, 5, 8],
[3, 6, 9] ]
這個活動得到了同學們的熱情支持,甚至有同學們使用Java語言提交了自己的答案,對于這些同學,除了表示感謝,我無法回報更多,只能在能力所及的范圍內,為每人提供30分鐘的一對一服務,比如,代寫作業、答疑等,
這是我收到的眾多答案中的一個,并且很有代表性,
>>> a = [[1,2,3], [4,5,6], [7,8,9]]
>>> a_copy = []
>>> a_temp = []
>>> a_size = len(a)
>>> a_item_size = len(a[0])
>>> for i in range(a_item_size):
for j in range(a_size):
a_temp.append(a[j][i])
a_copy.append(a_temp)
a_temp = []
>>> a_copy
[[1, 4, 7], [2, 5, 8], [3, 6, 9]]
閱讀這段代碼的時候,最感吃力的是我需要記住a_copy、a_temp 、a_size、a_item_size等中間變數,否則讀不懂后面的代碼,在適當的位置合理地使用中間變數或臨時變數,會提高效率,增強代碼地可讀性,但是,不加限制地使用,則會降低代碼的可讀性,同時也會帶來更多的風險,
對上面的代碼稍加修改,并封裝成函式,感覺順眼了很多,
>>> def transpose(arr):
result, arr_len = list(), len(arr)
for j in range(len(arr[0])):
result.append(list())
for i in range(arr_len):
result[-1].append(arr[i][j])
return result
>>> transpose([[1,2,3], [4,5,6], [7,8,9]])
[[1, 4, 7], [2, 5, 8], [3, 6, 9]]
在我收到的答案中,大約有70%和修改后的這段代碼類似,不過,這段代碼看起來還是有點啰嗦,不夠簡潔,如果使用串列推導式,則可以在一行之內完成轉置,
>>> def transpose(arr):
return [[arr[i][j] for i in range(len(arr))] for j in range(len(arr[0]))]
>>> transpose([[1,2,3], [4,5,6], [7,8,9]])
[[1, 4, 7], [2, 5, 8], [3, 6, 9]]
使用串列推導式,可以讓代碼更加緊湊,但會降低可讀性,因此應限制使用,在所有收集到的答案中,有幾位同學使用了串列推導式,還有兩位同學使用了NumPy的陣列轉置,遺憾的是,沒有一位同學寫出下面這個我認為的最佳答案,
>>> def transpose(arr):
return list(zip(*arr))
>>> transpose([[1,2,3], [4,5,6], [7,8,9]])
[(1, 4, 7), (2, 5, 8), (3, 6, 9)]
這個答案,用到了內置函式zip()和一顆星(*)解包魔法,代碼簡潔高效,想要寫出這樣經典的答案,有一個前提條件就是對Python的內置函式能夠信手拈來,Python內置了七十多個常用函式,配合不同的引數,可以實作非常精妙的功能,比如,從包含重復元素的串列中找出重復次數最多的元素,可以用一行代碼高效實作,
>>> arr = [7,3,5,3,6,7,3,5,6,3,5]
>>> max(set(arr), key=lambda x:arr.count(x))
3
最后,總結一下寫出簡潔優美的Python代碼的三條秘訣:
秘訣第1條:合理使用中間變數或臨時變數
秘訣第2條:適度使用串列推導式等語法特性
秘訣第3條:盡量使用Python的內置函式
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/256878.html
標籤:python
下一篇:CB茶館也蕭條了
