當前位置:
首頁 > 知識 > 利用你所知道的Python技巧寫出更加Pythonic的代碼

利用你所知道的Python技巧寫出更加Pythonic的代碼


Python部落(python.freelycode.com)組織翻譯,禁止轉載,歡迎轉發。




我經常在了解到Python的一些新特性和用法時犯一個錯誤... 我這篇文章講的就是讓你如何避免這個坑的同時也進一步了解enumerate這個函數。



當我學到一個Python新技巧的時候我總會馬上感覺到這東西是對我有幫助的,這種感覺差不多就像是我內心很確定地知道它有用處。然而當我坐下來仔細思量一番,我又很難立馬找到一個場景去真正的使用這個新技巧。




所以這裡的問題就是,

你如何將你學到,了解到的新的函數或者模塊寫成最Pythonic的代碼,然後讓code reviewer給你點一個大大的贊呢?





有一天我的博客文章訂閱者保羅問了我一個問題,這個問題是關於我的另外一篇文章中關於Python的enumerate函數的部分的。





昨天我碰到了一個場景需要我寫出一個將enumerate的下標變成哈希表中的值,迭代的元素變成鍵的字典(差不多類似於{"Bob": 0}這種情況). 我當時是用的列表長度結合zip函數的方式通過字典解析式完成的。

有其他更加Pythonic的方式去解決這個問題嗎?



為了讓你們更了解當時的具體情況,下面用代碼告訴你們保羅究竟想幹啥:



其實說白了就是從輸入的數組裡得到一個以元素->元素下標為格式的鍵值對的字典,這樣就可以通過元素本身去查找它在數組中的位置。




下面是保羅實現這個需求的方法:



看起來還行是吧,不過保羅覺得應該有辦法寫的更簡潔。這跟我經常遇到的情況幾乎一模一樣。保羅的直覺意識到有辦法利用enumerate函數讓他的代碼更加Pythonic。但是他應該如何實現他這個想法呢?我首先想到的是我們可以通過避免字典解析來縮短一點代碼:


稍微簡潔了一點(視覺上更清晰了一些),不過正像保羅一樣,我對range(len(...))這種結構還是不太滿意的。讓我們嘗試一下使用enumerate():



好了,所以這裡我可以利用enumerate對數組中的元素和下標進行一一配對。讓我們把上面這個表達轉換成字典:



我們已經非常接近最後答案了!上面這種表達可以說基本上就是我們最終想要的結果,唯一不同在於鍵值的位置反了。所以我們能如何將鍵值對反過來呢?讓我們從新回到字典解析的方法:



哎嘿!就是這樣,完美!




我們能從中學到什麼?




其實通過上面這樣的一個思考過程,在一步步推導和咀嚼後,對於你的進步是很有幫助的。




你看,從始至終保羅的思維都是對的。確實是有通過利用enumerate函數的方法來使代碼更簡潔的。只是說這種方法的具體原理稍微有點不清晰。




所以當你發現自己也身處這種情況時,請沉下去探索吧!




Python在處理這種類似隨手一測的小問題時是非常優秀的語言。就像我在回復保羅的郵件時,我做的第一件事就是打開Python解釋器然後自己做一些小實驗。




你很難在類似C++這樣的編譯語言中做到這樣的事。這也是Python中你最應該著重利用的特性之一。做到這些,那聲"漂亮"就是為你的代碼而歡呼的。




英文原文:https://dbader.org/blog/writing-pythonic-code?utm_source=mybridge&utm_medium=web&utm_campaign=read_more


譯者:煙熏把里



喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 Python程序員 的精彩文章:

2017年5個不能錯過的Python庫
搭建自己的Git伺服器

TAG:Python程序員 |