如何讓自己的 python 代碼更有逼格?

感覺自己的python代碼很挫,被人吐槽長得像C++。我看別人的python都是酷炫到爆,逼格滿滿。如何讓我的python看起來更有逼格?╮(╯▽╰)╭


代碼是寫給人讀的,一味的追求逼格是應該被唾棄的。如果你能夠在保證可讀性的前提下,把相同的功能用更少的代碼實現,那將會是有逼格的

鏈接:Python 有哪些優雅的代碼實現?讓自己的代碼更pythonic - 知乎用戶的回答現在有一個需求,需要統計一個文件中,每個單詞出現的次數。很多新同學拿到這個題目,首先想到的是使用字典,所以,寫出來下面這樣的代碼:

d = {}
with open("/etc/passwd") as f:
for line in f:
for word in line.strip().split(":"):
if word not in d:
d[word] = 1
else:
d[word] += 1

如果我們使用defaultdict,代碼能夠減少3行,會被認為更加Pythonic。如下所示:

d = defaultdict(int)
with open("/etc/passwd") as f:
for line in f:
for word in line.strip().split(":"):
d[word] += 1

對於這個問題,其實還有一個更好的解決辦法,使用collections中的Counter。如下:

word_counts = Counter()
with open("/etc/passwd") as f:
for line in f:
word_counts.update(line.strip().split(":"))

可以看到,使用Counter以後,我們的代碼更加短小了。我們先把代碼重8行重構到5行,然後又重構到4行。要想把代碼寫得優美,在保證可讀性的前提下,代碼越短越好。對於這個問題,使用Counter還有其他的一些理由,那就是其他相關的需求。比如,現在還有第二個需求,列印出現次數最多的三個單詞。如果我們使用字典,那麼,我們需要這樣:

result = sorted(zip(d.values(), d.keys()), reverse=True)[:3]
for val, key in result:
print(key, ":", val)

使用Counter就簡單了,因為Counter直接就為我們提供了相應的函數,如下所示:

for key, val in (word_counts.most_common(3)):
print(key, ":", val)

是不是代碼更短,看起來更加清晰呢。而且,統計每個單詞出現的次數和出現次數最多的單詞,這兩個需求相關性實在是太強了,幾乎會同時出現。所以,我們使用了Counter模塊和該模塊的most_common方法。如果Counter沒有提供這個方法,那才是要被吐槽的!

對這個回答感興趣的同學可以看這裡:Python 有哪些優雅的代碼實現?讓自己的代碼更pythonic - 知乎用戶的回答


今年(2014)杭州PyCon有個topic叫&,你看演示文稿第一頁的副標題就知道是你要找的:

感謝講師@施遠敏,演示文稿idiomatic.py,貌似要翻

其實你在搜索引擎直接檢索idiomatic python,會得到很多相關主題,多看多用,肯定能摘掉「長得像C++」這頂大帽子


- 能用map絕不用list comprehension

- 能用lambda絕不定義函數名

- 能用yield絕不append到list再返回

- 不管用不用得上都在函數簽名里加上*args和**kwargs

- 定義一個空class命名成XXXMixin,然後不管用得上用不上都先在繼承列表裡加上這個Mixin

- 多用super調用父類的函數,配合上一條,讓看代碼的人來回跳轉

UPDATE: 點贊多到心虛…大家明白我在joking的對吧…


先寫一段時間 LISP,然後再去寫 Python。


瀉藥

注釋量充足,符合編碼規範,提交主要代碼同時提交完善的測試代碼,然後各種覆蓋率檢測均到100%. 先亮瞎懶惰的人們,體現出業界良心和節操.

然後供起來,跑個N年後,始終沒有BUG,沒有人改,也無需修改.

這樣有逼格嗎.


看題目詳細介紹,題主說的逼格指的是更Pythonic吧,就是代碼看起來更Python化,而不是像C/C++。這個跟逼格什麼的關係不大,不同語言的規範不同,Python有它自己的一套規範,符合這套規範的代碼看起來確實會更加漂亮。

如果之前是C/C++入門的,剛上手Python的時候,很容易把代碼寫的像C/C++。代碼寫多了,就會逐漸了解PEP8這樣的編碼規範,同時也會逐漸找到寫Python的感覺。實話說除了多寫代碼之外,沒有什麼捷徑而言。像樓上提到的idiomatic python這樣的教程可以學習。不過只單純地學習這些編碼技巧,對於使用Python能力並沒有太大幫助,就像只學到花拳繡腿,卻沒有深厚的內功做支撐,終究還是不夠的。


既然樓上提到 PEP8,那提下:Pylint - code analysis for Python

沒事給代碼打個分,嚇尿他們,沒有比這個評分更逼格了吧


首先,最基本的代碼規範還是要遵循的,正所謂無規矩不成方圓,良好的縮進風格和命名方式都讓你的代碼更加簡明;

其次,做好抽象,無論是數據抽象還是過程抽象都要做,最近在看SICP,書中一再強調抽象,提取出公共的邏輯,站在更高、更普遍的角度去審視代碼,符合這個要求的代碼無疑就像是深度提煉過的礦石,含量更高;

再次,代碼越遠離C風格,越接近Lisp就越顯逼格,那麼函數式編程是你必須嘗試的部分;

最後,少而精的注釋絕對是點睛之筆。


去寫Ruby,逼格立馬就能提升


沒事多看看標準庫或第三方模塊里的寫法,照著模仿,提升逼格


我看別人的python都是酷炫到爆,逼格滿滿

你自己都說別人的python酷炫到爆了,想必你肯定有自己的一套衡量標準,那不就等於你已經知道了該怎麼寫才算是有逼格了么?多此一問【逃


多寫 docstring,順便在裡面寫幾個 test case

多用 decorator

能查表千萬不要用 if else


找我做code view


Python是用來快速解決問題的,語法太簡單、直白,沒法體現逼格,,

想要逼格還是換個語言吧,比如LISP逼格應更挺高。


pep8


用ruby吧,這種魔幻一樣的語言才能創造出逼格滿滿又不會像lisp那樣誰都看不懂的代碼


為什麼大家都不覺得長得像C++是褒義詞呢。。。。C++高級程序員的工資遠比python高級程序員的工資要高吧。。。python能有C++的效率么


用hy寫Python

Learn hy in Y Minutes

(defn simple-conversation []
(print "Hello! I"d like to get to know you. Tell me about yourself!")
(setv name (raw-input "What is your name? "))
(setv age (raw-input "What is your age? "))
(print (+ "Hello " name "! I see you are "
age " years old.")))

(simple-conversation)


推薦閱讀:

使用Python建站對於日流量20w的pv你會採用什麼樣的架構?
windows8 64位python 安裝theano報錯?

TAG:編程語言 | Python | 編程 | 代碼風格 |