提高你的Python編碼效率

前言
我用Python編程有幾年了, 并且我仍然經(jīng)常驚訝于Python代碼可以如何的簡潔,如何的 DRY。我學(xué)到了很多小貼士和技巧,大多數(shù)來自于閱讀開源項目的源代碼,像 Django, Flask, Requests 等。
這里我挑出了幾個有時被大家忽略的幾條,但是它們在日常工作中會有很大幫助。
感謝各友的鼓勵與支持??????,往期文章都在最后梳理出來了(●'?'●)
??????????????????????????????????????????????????????????????????
字典和集合推導(dǎo)式
大多數(shù)Python開發(fā)者知道使用列表推導(dǎo)式。你不熟悉這一點(diǎn)?一個列表推導(dǎo)式是一個創(chuàng)造列表的簡短方式:
> some_list = [1, 2, 3, 4, 5]> another_list = [ x + 1 for x in some_list ]> another_list[2, 3, 4, 5, 6]
從Python 3.1開始(也反向地移植到了Python 2.7),我們可以用同樣的方式創(chuàng)建集合和字典:
# Set Comprehensionssome_list = [1, 2, 3, 4, 5, 2, 5, 1, 4, 8]even_set = { x for x in some_list if x % 2 == 0 }even_setset([8, 2, 4])# Dict Comprehensionsd = { x: x % 2 == 0 for x in range(1, 11) }d{1: False, 2: True, 3: False, 4: True, 5: False, 6: True, 7: False, 8: True, 9: False, 10: True}
第一個例子中,我們用 some_list 建立了一個元素不重復(fù)的集合,但只有偶數(shù)。第二個字典的例子中展示了一個字典的創(chuàng)建,這個字典的鍵是1到10(包括10),值是布爾值,指明該鍵是不是一個偶數(shù)。
另一個值得注意的地方是集合的文法,我們可以這么簡單的創(chuàng)建一個集合:
> my_set = {1, 2, 1, 2, 3, 4}> my_setset([1, 2, 3, 4])
而沒有使用到內(nèi)建的 set 方法
使用計數(shù)器對象計數(shù)
很明顯,但很容易遺忘。計數(shù)是一個尋常不過的編程任務(wù),而且大多數(shù)情形下這不是個難事。不過計數(shù)可以更簡單。
Python的 collections 庫包含一個 dict 的子類,專門解決計數(shù)任務(wù):
> from collections import Counter> c = Counter('hello world')> cCounter({'l': 3, 'o': 2, ' ': 1, 'e': 1, 'd': 1, 'h': 1, 'r': 1, 'w': 1})> c.most_common(2)[('l', 3), ('o', 2)]
漂亮地打印JSON
JSON是一個很棒的序列格式,如今廣泛應(yīng)用在API和web服務(wù)中,但是很難用裸眼來看大數(shù)據(jù)量的JSON,它們很長,還在一行里。
可以用參數(shù) indent 來更好地打印JSON數(shù)據(jù),這在跟 REPL或是日志打交道的時候很有用??
> import json> print(json.dumps(data)) # No indention{"status": "OK", "count": 2, "results": [{"age": 27, "name": "Oz", "lactose_intolerant": true}, {"age": 29, "name": "Joe", "lactose_intolerant": false}]}> print(json.dumps(data, indent=2)) # With indention{"status": "OK","count": 2,"results": [{"age": 27,"name": "Oz","lactose_intolerant": true},{"age": 29,"name": "Joe","lactose_intolerant": false}]}
另外,去看看內(nèi)建模塊 pprint , 它可以幫助你漂亮地輸出其它的東西。
快速建立一個web服務(wù)
有時我們需要一個建立RPC服務(wù)簡單而快速的方法。我們需要的只是讓程序B去調(diào)用程序A(可能在另一個機(jī)器上)的方法。
我們不用了解關(guān)于這個的任何技術(shù),但是我們只是需要這么個簡單的東西,我們可以使用一個叫做 XML-RPC 的協(xié)議(對應(yīng)的Python庫實現(xiàn) SimpleXMLRPCServer )來處理這種事。
這里是一個簡單粗糙的文件閱讀服務(wù)器??
from SimpleXMLRPCServer import SimpleXMLRPCServerdef file_reader(file_name):with open(file_name, 'r') as f:return f.read()server = SimpleXMLRPCServer(('localhost', 8000))server.register_introspection_functions()server.register_function(file_reader)server.serve_forever()
響應(yīng)它的客戶端??
import xmlrpclibproxy = xmlrpclib.ServerProxy('http://localhost:8000/')proxy.file_reader('/tmp/secret.txt')
現(xiàn)在我們就有了一個遠(yuǎn)程的文件閱讀器,除了一點(diǎn)代碼,沒有外部依賴。(當(dāng)然,不安全,所以只在"家"用這個吧)
Python的開源社區(qū)
剛我一直在說Python的標(biāo)準(zhǔn)庫了,這些庫只要你安裝Python就會包含在你的Python中。對于大多數(shù)的其他任務(wù),這里有大量的社區(qū)維護(hù)的第三方庫來滿足我們的需求。
這是一個我挑選Python庫的辦法:
包含一個明確的協(xié)議,以便我們使用
積極活躍的開發(fā)和維護(hù)
可以用
pip來安裝,可以輕易地重復(fù)部署擁有一個合適覆蓋率的測試集
如果你發(fā)現(xiàn)了一個適合你需求的Python庫,不要害羞,大多數(shù)開源項目歡迎我們貢獻(xiàn)代碼和協(xié)助,即使你不是一個Python老將。幫助之手隨時受歡迎!
追加的技巧
快速在一個目錄建立HTTP服務(wù)器
python -m SimpleHTTPServer命令行上漂亮地打印JSON
echo '{"json":"obj"}' | python -mjson.tool而且,如果你安裝了 Pygments 模塊,可以高亮地打印JSON
echo '{"json":"obj"}' | python -mjson.tool | pygmentize -l json注意
{}是一個空的字典,而不是空的集合
「?? 感謝大家」
如果你覺得這篇內(nèi)容對你挺有有幫助的話:
點(diǎn)贊支持下吧,讓更多的人也能看到這篇內(nèi)容(收藏不點(diǎn)贊,都是耍流氓 -_-) 歡迎在留言區(qū)與我分享你的想法,也歡迎你在留言區(qū)記錄你的思考過程。 覺得不錯的話,也可以閱讀近期梳理的文章(感謝鼓勵與支持??????): 編程中的惰性思想 小程序云開發(fā)資源的管理 教你用python進(jìn)行數(shù)字化妝,可愛至極 加速Python列表和字典,讓你代碼更加高效 匯總超全的Matplotlib可視化最有價值的 50 個圖表(附完整 Python 源代碼)(三) 匯總超全的Matplotlib可視化最有價值的 50 個圖表(附完整 Python 源代碼)(二) 匯總超全的Matplotlib可視化最有價值的 50 個圖表(附完整 Python 源代碼)(一) 教你用Python制作實現(xiàn)自定義字符大小的簡易小說閱讀器 「查缺補(bǔ)漏」鞏固你對算法復(fù)雜度的理解 匯總了32個為開發(fā)者提供的免費(fèi)工具 教你通過python利用近鄰法實現(xiàn)圖片縮小后變成另一張圖(類似幻影坦克) 30 行代碼實現(xiàn)螞蟻森林自動收能量
老鐵,三連支持一下,好嗎?↓↓↓


點(diǎn)分享

點(diǎn)點(diǎn)贊

點(diǎn)在

