利用你所知道的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
譯者:煙熏把里
![](https://pic.pimg.tw/zzuyanan/1488615166-1259157397.png)
![](https://pic.pimg.tw/zzuyanan/1482887990-2595557020.jpg)
※2017年5個不能錯過的Python庫
※搭建自己的Git伺服器
TAG:Python程序員 |