Python的26個小技巧
Python是世界上***的編程語言之一。
這有許多原因:
- 容易學習
- 可跨平臺
- 擁有大量的模塊和庫
我把使用Python作為數據科學家日常工作的一部分。一路上,我學會了一些有用的技巧和要點。
在這里,我嘗試以A - Z格式分享其中的一些。這些“技巧”大部分是我在日常工作中使用或偶然發現的。我在瀏覽Python標準庫文檔時發現了一些。另一些是我在搜索PyPi時發現的。
然而,值得稱贊的是其中的四五個是我在awesome-python.com發現的。這是數百個有趣的Python工具和模塊的精選列表。值得瀏覽尋找靈感!
all or any
python之所以如此受歡迎的原因之一是因為它可讀性和表現力強。人們經常開玩笑說Python是“可執行偽代碼”。但是,當你可以編寫這樣的代碼時,很難用其他方式反駁:
bashplotlib
你想在控制臺中繪制圖表嗎?
你就可以在控制臺中畫出圖表了。
collections
python有一些很好的默認數據類型,但有時它們表現的不如你期望的哪樣。幸運的是,Python標準庫提供了collections模塊。這個方便的附加組件為您提供了更多的數據類型。
dir
你有沒有想過如何在Python對象內部查看它的屬性?這當然可以??纯聪旅孢@條命令行:
當以交互方式運行Python時,這可能是一個非常有用的功能,可以動態地查看您正在使用的對象和模塊。
emoji
是的,這是真的!
不要假裝你不想去嘗試......
from __future__ import
Python的流行導致是總是有新版本在開發中。新版本意味著新功能——除非你的版本已經過時。
然而,不要害怕。__future__模塊允許你從Python的未來的版本導入功能。這簡直就像時間旅行,或者魔法什么的。
為什么不開始導入花括號?
geopy
地理可能是程序員難以挑戰的領域,時常讓人找不清方向。但是geopy模塊讓這變得異常簡單。
它通過抽取一系列不同的地理編碼服務APIs來工作。使你能夠獲得一個地方的完整街道地址、緯度、經度和海拔。還有一個有用的distance類。以你喜歡的單位計算兩個位置之間的距離。
howdoi
遇到編碼問題,但不記得你以前見過的解決方案了?需要檢索StackOverflow,但不想離開終端?
那么你需要這個有用的命令行工具。
無論你有什么問題,都要問它,它會盡***努力回答你的問題
但是請注意——它從StackOverflow的置頂答案中抓取代碼。因此可能不總是提供最有用的信息...
inspect
python的inspect模塊非常有助于理解幕后發生的事情。你甚至可以用它調用它自己的方法!
下面的代碼示例使用inspect.getsource輸出它自己的源代碼。它還使用inspect.getmodule輸出由它定義的模塊。
***一行代碼打印出自己的行號。
當然,除了這些瑣碎的用途之外,inspect模塊對于理解代碼正在做什么可能會很有用。你也可以用它來編寫自我記錄的代碼。
Jedi
Jedi庫是一個自動補全和代碼分析庫。它使編寫代碼更快、更有成效。
除非你正在開發自己的IDE,否則你可能會對使用Jedi作為編輯器插件最感興趣。幸運的是,這已經成為現實了!然而,你可能已經在使用Jedi。IPython項目正利用Jedi的代碼自動補全功能。
**kwargs
學習任何語言時,都會有許多里程碑。對于Python來說,理解神秘的**kwargs語法可能算一個。
字典對象前面的雙星號允許您將該字典的內容作為命名參數傳遞給函數。
字典的鍵是參數名,值是傳遞給函數的值。你甚至不需要用kwargs命名字典!、
當您想要編寫能夠處理事先未定義的命名參數的函數時,這很有用。
List comprehensions
關于Python編程,我最喜歡的事情之一是它的列表生成。
這些表達式使得容易編寫非常干凈的代碼,讀起來幾乎像自然語言。
你可以在這里閱讀更多關于如何使用它們的信息。
map
python通過許多內置特性支持功能編程。map函數是最有用的函數之一——特別是與lambda函數結合使用。
在上面的例子中,map將一個簡單的lambda函數應用于x中的每個元素。它返回一個map對象,該對象可以轉換為一些可迭代的對象,如列表或元組。
newspaper3k
如果你還沒有見過它,那么準備好讓Python的newspaper3k模塊震撼你。
它允許你從一系列領先的國際出版物中檢索新聞文章和相關元數據。您可以檢索圖像、文本和作者姓名。
它甚至有一些內置的NLP功能。
因此,如果你想在下一個項目中使用BeautifulSoup或其他自制的網頁爬蟲庫,那么省下你的時間和精力,用代替。
Operator overloading
python為運算符重載提供了支持,這是一個讓你聽起來像個合法的計算機科學家的術語。
這實際上是一個簡單的概念。有沒有想過python為什么允許你使用"+"運算符來相加數字以及連接字符串?這就是運算符重載。
你可以用特殊的方法定義使用Python標準運算符符號的對象。這允許你在與你正在處理的對象相關的上下文中使用它們
pprint
python的默認print函數的確可以完成它的工作。但是嘗試輸出出任何大的嵌套對象時,結果會很難看。
這里有pretty-print標準庫。可以以易于閱讀的格式輸出出復雜的結構化對象。
對于任何處理non-trivial數據類型的Python開發人員來說都是必不可少的。
queue
python支持多線程,標準庫的queue模塊有助于實現這一點。
此模塊允許你實現隊列數據結構。這些數據結構允許您根據特定規則添加和檢索條目。
先進先出(FIFO)隊列允許你按對象添加的順序檢索對象。后進先出(LIFO)隊列允許你先訪問最近添加的對象。
***,優先級隊列允許你根據對象的排序順序檢索對象。
這里有如何在Python中使用隊列進行多線程編程的示例。
__repr__
在Python中定義類或對象時,提供一種很有用的官方支持的方式將對象呈現為字符串。例如:
這使得調試代碼更加容易??梢蕴砑拥侥愕念惗x中,如下所示:
sh
python是一種很棒的腳本語言。有時使用標準的os和sbprocess庫會有點令人頭疼。
sh庫提供了一個簡潔的替代方案。
它允許你調用任何程序,就好像它是一個普通的函數一樣——對于自動化工作流和任務非常有用,所有這些都可以用Python完成。
Type hints
Python是一種動態類型語言。定義變量、函數、類等時,不需要指定數據類型。
這有助于縮短開發時間。然而,沒有什么比簡單的類型問題導致的運行錯誤更令人討厭的了。
自Python 3.5以來,你可以選擇在定義函數時提供類型提示。
你也可以定義類型別名:
雖然這不是強制性的,但是類型注釋可以讓你的代碼更容易被理解。
它們還允許你在運行之前使用類型檢查工具來捕獲這些雜散的類型錯誤。如果你正在進行大型復雜的項目,這很值得的使用!
uuid
生成通用唯一標識(UUID)的一種快速簡單的方法是使用Python標準庫的UUID模塊。
這可以產生一個隨機的128位數字,幾乎可以肯定這個數字是唯一的。
事實上,可以生成超過2112個可能的UUID。超過5x1036(或5,000,000,000,000,000,000,000,000,000,000,000,000)。
在給定的集合中找到重復的概率非常低。即使有萬億個UUID,重復存在的概率也遠低于十億分之一。非常有用的兩行代碼。
Virtual environments
這可能是我最喜歡的關于Python的東西。
你很可能在同一時間處理多個Python項目。不幸的是,有時兩個項目將依賴于同一依賴關系的不同版本。你選擇在你的系統上安裝什么?
幸運的是,Python對虛擬環境的支持讓你可以兼顧兩者。在命令行中:
現在,你可以在同一臺機器上分別存在Python的獨立版本和安裝環境。
wikipedia
維基百科有一個很好的API,允許用戶編程訪問***的完全免費的知識和信息。
維基百科模塊使得訪問這個API變得非常方便。
像真實的網站一樣,該模塊支持多語言、頁面消除歧義、隨機頁面檢索,甚至還有一個donate方法.
xkcd
幽默是Python語言的一個重要特征——畢竟,它是以英國喜劇《巨蟒飛行馬戲團》命名的。
Python的許多官方文檔都引用了該喜劇出名的獨幕。
盡管如此,幽默感并不局限于官方文檔。試試下面的代碼:
永遠不要改變,Python。永不改變。
YAML
YAML代表“YAML Ain’t Markup Language”,它是一種數據格式化語言,是JSON的超集。
與JSON不同,它可以存儲更復雜的對象并引用自己的元素。你也可以寫注釋,使其特別適合于編寫配置文件。
PyYAML模塊允許你將YAML與Python一起使用。這樣安裝它:
然后導入到項目中:
PyYaML允許你存儲任何數據類型的Python對象,以及任何用戶定義類的實例。
zip
對你來說,這是***一招,真的很酷。曾經需要將兩個列表合成一個字典?
zip內置函數接受多個可重復對象,并返回元組列表。每個元組按位置索引對輸入對象的元素進行分組。
您也可以通過對對象調用*zip來“解壓縮”對象。
感謝閱讀!
到這里你已經讀完全文,Python的26個小技巧——希望你從中得到了對下一個項目有用的東西。
Python是一種非常多樣且適合開發的語言,所以我肯定有很多東西沒有包括在內。
請在下面留言,分享你自己最喜歡的Python技巧!