原文:https://medium.freecodecamp.org/an-a-z-of-useful-python-tricks-b467524ee747
作者 Peter Gleeson 是一名數據科學家,日常工作幾乎離不 python。一路走來,他積累了不少有用的技巧和 tips,現在就將這些技巧分享給大家。這些技巧將根據其首字母按 A-Z 的順序進行展示。
ALL OR ANY
Python 之所以成為這么一門受歡迎的語言一個原因是它的可讀性和表達能力非常強。Python 也因此經常被調侃為“可執(zhí)行的偽代碼”。不信你看:
x?=?[True,?True,?False] if?any(x): ????print("At?least?one?True") if?all(x): ????print("Not?one?False") if?any(x)?and?not?all(x): ????print("At?least?one?True?and?one?False")
BASHPLOTIB
你想要在控制臺繪圖嘛?
$?pip?install?bashplotlib
現在,你的控制臺中就可以有圖了
COLLECTIONS
Python 有一些很棒的默認數據類型,但是有時候他們并不會像你所希望的那樣發(fā)揮作用。
幸運的是,Python 標準庫提供了 collection 模塊。它讓你可以使用更為多樣數據類型。
from?collections?import?OrderedDict,?Counter #?Remembers?the?order?the?keys?are?added! x?=?OrderedDict(a=1,?b=2,?c=3) #?Counts?the?frequency?of?each?character y?=?Counter("Hello?World!")
DIR
面對一個 Python 對象,你是否曾想過可以直接看到其屬性?你也許可以試試以下的代碼:
>>>?dir() >>>?dir("Hello?World") >>>?dir(dir)
這是運行 Python 的時候一個非常有用的功能,用于動態(tài)探索你所使用的對象和模塊。更多詳情,可以查看這里:https://docs.python.org/3/library/functions.html#dir
EMOJI
對的,你沒看錯!
$?pip?install?emoji
用 python 來創(chuàng)建表情包,你也可以。
from?emoji?import?emojize print(emojize(""))
FROM_FUTURE_IMPORT
Python 非常受歡迎,這也就導致了它的版本更新非??欤碌陌姹就鶗泻芏嘈绿匦?。你不更新,就無法使用。
然而,不要害怕。future 模塊可以讓你導入未來版本的功能。有點像時空穿梭有木有!
from?__future__?import?print_function print("Hello?World!")
GEOPY
對于程序猿來說地理可能是一個非常有挑戰(zhàn)性的領域。但是,geopy 模塊則讓它變得非常簡單。
$?pip?install?geopy
它通過提取一系列不同地理編碼服務的 api 來工作,讓你能夠獲得一個地方的完整街道地址、緯度、經度,甚至海拔。
這里面同時還包含一個有用的“距離”類別。它能使用你選定的度量去計算了兩個地點之間的距離。
from?geopy?import?GoogleV3 place?=?"221b?Baker?Street,?London" location?=?GoogleV3().geocode(place) print(location.address) print(location.location)
HOWDOI
有時候你碰到了一個編程問題,覺得自己之前明明見過它的解決方法,但是卻記不起來具體是怎么樣的了。于是你想要去 StackOverflow 上找,但又不想離開這個終端。這個時候,你需要下面這個工具——howdoi
$?pip?install?howdoi
你所遇到的任何問題都可以問它,它會盡他所能給你返回一個答案。
$?howdoi?vertical?align?css $?howdoi?for?loop?in?java $?howdoi?undo?commits?in?git
需要注意的是——它只從 StackOverflow 最頂端的答案中抓取代碼。所以它給你返回的不總是最有用的信息…
$?howdoi?exit?vim
INSPECT
Python 的 inspect 模塊用于收集 Python 對象的信息,可以獲取類或函數的參數的信息,源碼,解析堆棧等等
下方的代碼樣例使用了 inspect.getsource() 來打印它自身的源碼。同樣還使用了 inspect.getmodule() 來打印定義了 inspect.getmodule() 的模塊。最后一行代碼則是打印了本行代碼所在的行號。在本例中,就是 4 。
import?inspect print(inspect.getsource(inspect.getsource)) print(inspect.getmodule(inspect.getmodule)) print(inspect.currentframe().f_lineno)
inspect 模塊可以有效地讓你知道你的代碼是如何工作的,你也可以利用它來完成一些個人的源碼。
JEDI
Jedi 庫是一個代碼自動補齊和靜態(tài)分析的庫。它可以使你更快更高效地書寫代碼。
除非你在開發(fā)自己的編輯器,否則你可能會非常喜歡將 Jedi 作為自己的編輯插件。
你可能已經正在使用 Jedi 而只是沒發(fā)現。IPython 項目就是利用 Jedi 來實現其自動補全功能。
**KWARGS
無論你學習那種語言,在這條學習之路上總有那么一些里程碑。在 Python 的編程學習中,理解神秘的 **kwargs 語法應該算是一個重要的里程碑。
雙星“**”放在字典的前面可以讓你將字典的內容作為命名參數傳遞給函數。字典的鍵是參數的名字,鍵的值作為參數的值傳遞給函數。如下所示:
dictionary?=?{"a":?1,?"b":?2} def?someFunction(a,?b): ????print(a?+?b) ????return #?these?do?the?same?thing: someFunction(**dictionary) someFunction(a=1,?b=2)
當你想要創(chuàng)建一個函數,它需要能處理事先沒有定義過的參數,那么就要用到前面提到的技巧了。
LIST COMPREHENSIONS
List comprehensions(列表推導式)
列表推導式可以說是我最喜歡的 Python 技巧之一。這種表達式可以讓你寫出像自然語言一樣易于理解并且還很簡潔的代碼。
你可以通過這個鏈接了解更多關于列表推導式的用法。地址//www.learnpython.org/en/List_Comprehensions
numbers?=?[1,2,3,4,5,6,7] evens?=?[x?for?x?in?numbers?if?x?%?2?is?0] odds?=?[y?for?y?in?numbers?if?y?not?in?evens] cities?=?['London',?'Dublin',?'Oslo'] def?visit(city): ????print("Welcome?to?"+city) for?city?in?cities: ????visit(city)
MAP
Python 有許多非常有用的內置函數。其中一個就是 map()——特別是和 lambda 函數相結合的時候。
x?=?[1,?2,?3] y?=?map(lambda?x?:?x?+?1?,?x) #?prints?out?[2,3,4] print(list(y))
在這個例子中,map() 對 x 中的每一個元素都應用了一個簡單的 lambda 函數。它會返回一個 map 對象,這個對象可以被轉化成可迭代對象,如列表或者元組。
NEWSPAPER3K
newspaper3k, 如果你還沒有見過它,那么你可能會被這個 Python newspaper 模塊所驚艷到。
它可以讓你檢索到一系列國際領先出版物中的新聞和相關的元數據。你可以檢索圖片、文本和作者名。它甚至有一些內置的自然語言處理功能。所以,如果你正在考慮使用 BeautifulSoup 或其他自制的爬蟲庫來應用于你的下一個項目。那么,省省時間和精力吧,你其實只需要 $ pip install newspaper3k。
OPERATOR OVERLOADING(操作符重載)
Python 支持操作符重載?!安僮鞣剌d”其實是個簡單的概念,你是否曾經想過為什么 Python 可以讓你使用“+”操作符來同時實現加法和連接字符串?這就是操作符重載在發(fā)揮作用。
你可以定義使用 Python 標準操作符符號的對象,這可以讓你在特定的環(huán)境中使用特定的對象,就像下方的例子一樣。
class?Thing: ????def?__init__(self,?value): ????????self.__value?=?value ????def?__gt__(self,?other): ????????return?self.__value?>?other.__value ????def?__lt__(self,?other): ????????return?self.__value??nothing #?False something?PPRINT
Python 的默認 print 函數可以滿足日常的輸出任務,但如果要打印更大的、嵌套式的對象,那么使用默認的 print 函數打印出來的內容會很丑陋。
這個時候我們就需要 pprint 了,它可以讓復雜的結構型對象以可讀性更強的格式顯示。這對于經常要面對非普通數據結構的 Python 開發(fā)者來說是必不可少的工具。
import?requests import?pprint url?=?'https://randomuser.me/api/?results=1' users?=?requests.get(url).json() pprint.pprint(users)QUEUE(隊列)
Python 支持多線程,它是通過標準庫中的 Queue 模塊來實現的。這個模塊可以讓你實現隊列數據結構。這種數據結構可以讓你根據特定的規(guī)則添加和檢索條目。
“先進先出”(FIFO)隊列可以讓你按照添加對象的順序來檢索他們?!昂筮M先出”(LIFO)隊列可以讓你首先訪問最近添加的對象。最后,優(yōu)先隊列可以讓你根據他們排序的順序進行檢索。
__repr__
當你定義一個類的時候,提供一個方法可以返回用來表示該類對象的可打印字符串會非常有用。例如:
>>>?file?=?open('file.txt',?'r') >>>?print(file)這使得 debug 更加方便,具體的定義方式如下:
class?someClass: ????def?__repr__(self): ????????return?"" someInstance?=?someClass() #?prints? print(someInstance) sh
sh 庫讓你像調用方法那樣調用系統(tǒng)中的命令。
import?sh sh.pwd() sh.mkdir('new_folder') sh.touch('new_file.txt') sh.whoami() sh.echo('This?is?great!')TYPE HINT(類型提示)
Python 是一種動態(tài)類型語言。當你定義變量、函數、類別的時候,你不需要指定數據的類型。這可以大大提升你的開發(fā)速度,但也是有代價的。你可能會因為一個簡單的輸入問題而導致運行出錯。
在 Python3.5 之后,這就不是問題了,在定義函數的時候你可以自主選擇要不要提供類型提示。
def?addTwo(x?:?Int)?->?Int: ????return?x?+?2你還可以定義類型的別名:
from?typing?import?List Vector?=?List[float] Matrix?=?List[Vector] def?addMatrix(a?:?Matrix,?b?:?Matrix)?->?Matrix: ??result?=?[] ??for?i,row?in?enumerate(a): ????result_row?=[] ????for?j,?col?in?enumerate(row): ??????result_row?+=?[a[i][j]?+?b[i][j]] ????result?+=?[result_row] ??return?result x?=?[[1.0,?0.0],?[0.0,?1.0]] y?=?[[2.0,?1.0],?[0.0,?-2.0]] z?=?addMatrix(x,?y)雖然不是強制性的,類型注釋可以讓你的代碼理解起來更加簡單。它們也允許你使用類型檢測工具在運行之前捕獲這些零散的類型錯誤。如果你正在從事大型、復雜的項目,那么類型注釋也許會非常有幫助
UUID
通過 Python 標準庫中的 uuid 模塊,可以快速并簡單地生成統(tǒng)一的唯一ID(又稱UUID).
import?uuid user_id?=?uuid.uuid4() print(user_id)UUID 是128位的全局唯一標識符,通常由32字節(jié)的字符串表示。它可以保證時間和空間的唯一性,也稱為 GUID,全稱為:UUID —— Universally Unique IDentifier,Python 中叫 UUID。它通過 MAC 地址、時間戳、命名空間、隨機數、偽隨機數來保證生成ID的唯一性。
VRITUAL ENVIRONMENTS
這可能是我最喜歡的 Python技巧 了。你可能經常要處理不止一個 Python 項目,不幸的是,有時候不同項目會依賴不同的Python版本。這個時候,你應該在系統(tǒng)里安裝哪個 Python 版本呢?
幸運的是,Python 可以支持建立不同的虛擬環(huán)境來滿足不同的版本需求。
python?-m?venv?my-project source?my-project/bin/activate pip?install?all-the-modules?現在你可以在一臺機器上安裝和運行各個獨立版本的 Python。太棒了!
WIKIPEDIA
Wikipedia 有一個很棒的 API,它可以讓用戶通過編程訪問到維基的詞條內容。使用 Python 中的 wikipedia 模塊可以讓你以最便捷的方式訪問該 API。
import?wikipedia result?=?wikipedia.page('freeCodeCamp') print(result.summary) for?link?in?result.links: ????print(link)與真實站點一樣,該模塊支持多種語言、頁面消除歧義、隨機頁面檢索,甚至還有 donate() 方法。
YAML
YAML 是 “YAML 不是一種標記語言”的外語縮寫。它是一個數據格式語言,是 JSON 的父集。和 JSON 不同的是,它可以存儲更復雜的對象,并且可以引用自身的元素。你還可以寫注釋,這讓 YAML 特別適合于書寫配置文件。
PyYAML 模塊可以讓你使用 Python 調用 YAML。使用下列語句安裝:
$?pip?install?pyyaml然后導入到項目中:
import?yamlPyYAML 使你能夠儲存任何數據類型的 Python 對象,以及任何用戶定義類的實例。
ZIP
最后一個技巧也非常酷。你是否曾想要讓兩個列表中的元素逐個映射,組合成字典?那么你應該使用 zip。
keys?=?['a',?'b',?'c'] vals?=?[1,?2,?3] zipped?=?dict(zip(keys,?vals))內置函數 zip() 接收若干可迭代對象,然后返回一個由多個元組組成的列表。每個元組根據輸入對象的位置索引對其元素進行分組。還可以使用 *zip() 來“解壓”對象。
python 大法好,掌握這些小的技巧,助你在 python 大神的道路上,披荊斬棘,所向披靡。
編輯:黃飛
?
評論
查看更多