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


















































 
 
 











 
 
 
 