24 個好用到爆的 Python 實用技巧!
大家好,我是云朵君!
在這里,我嘗試以 A - Z 開頭的格式分享這些技巧中的一些,并且在本文中簡單介紹這些方法,如果你對其中一個或多個感興趣,你可以通過文末參考資料查看官方文檔。希望對你能有所幫助。

A - Z?

all or any
Python 語言如此流行的眾多原因之一,是因為它具有很好的可讀性和表現(xiàn)力。
人們經(jīng)常開玩笑說 Python 是可執(zhí)行的偽代碼。當(dāng)你可以像這樣寫代碼時,就很難反駁。
x?=?[True,?True,?False]
if?any(x):
????print("至少有一個True")
if?all(x):
????print("全是True")
if?any(x)?and?not?all(x):
????print("至少一個True和一個False")
bashplotlib
你有沒有想過在控制臺中繪制圖形嗎?
Bashplotlib 是一個 Python 庫,他能夠幫助我們在命令行(粗曠的環(huán)境)中繪制數(shù)據(jù)。
#?模塊安裝
pip?install?bashplotlib
#?繪制實例
import?numpy?as?np
from?bashplotlib.histpgram?import?plot_hist
arr?=?np.ramdom.normal(size=1000,?loc=0,?scale=1)
plot_hist(arr,?bincount=50)
collections
Python 有一些很棒的默認(rèn)數(shù)據(jù)類型,但有時它們的行為并不完全符合你的期望。
幸運的是,Python 標(biāo)準(zhǔn)庫提供了?collections 模塊[1]。這個方便的附加組件為你提供了更多的數(shù)據(jù)類型。
from?collections?import?OrderedDict,?Counter
#?記住鍵的添加順序!
x?=?OrderedDict(a=1,?b=2,?c=3)
#?統(tǒng)計每個字符出現(xiàn)的頻率
y?=?Counter("Hello?World!")
dir
有沒有想過如何查看 Python 對象內(nèi)部并查看它具有哪些屬性?在命令行中輸入:
dir()?
dir("Hello?World")?
dir(dir)
當(dāng)以交互方式運行 Python 以及動態(tài)探索你正在使用的對象和模塊時,這可能是一個非常有用的功能。在這里閱讀更多functions[2]相關(guān)內(nèi)容。
emoji
emoji[3]?是日本在無線通信中所使用的視覺情感符號,繪指圖畫,文字指的則是字符,可用來代表多種表情,如笑臉表示笑、蛋糕表示食物等。在中國大陸,emoji通常叫做“小黃臉”,或者直稱emoji。
#?安裝模塊
pip?install?emoji
#?做個嘗試
from?emoji?import?emojize
print(emojize(":thumbs_up:"))
??
from __future__ import
Python 流行的結(jié)果之一,總是有新版本正在開發(fā)中。新版本意味著新功能 —— 除非你的版本已過時。
不過不要擔(dān)心。使用該__future__模塊[4]可以幫助你用Python的未來版本導(dǎo)入功能。從字面上看,這就像時間旅行、魔法或其他東西。
from?__future__?import?print_function
print("Hello?World!")
geogy
地理,對大多數(shù)程序員來說是一個具有挑戰(zhàn)性的領(lǐng)域。在獲取地理信息或者繪制地圖時,也會遇到不少問題。這個geopy 模塊[5]讓地理相關(guān)內(nèi)容變得非常容易。
pip?install?geopy
它通過抽象一系列不同地理編碼服務(wù)的 API 來工作。通過它,你能夠獲得一個地方的完整街道地址、緯度、經(jīng)度甚至海拔高度。
還有一個有用的距離類。它以你偏好的測量單位計算兩個位置之間的距離。
from?geopy?import?GoogleV3
place?=?"221b?Baker?Street,?London"
location?=?GoogleV3().geocode(place)
print(location.address)
print(location.location)
howdoi
當(dāng)你使用terminal終端編程時,通過在遇到問題后會在StackOverflow上搜索答案,完后會回到終端繼續(xù)編程,此時有時會不記得你之前查到的解決方案,此時需要重新查看StackOverflow,但又不想離開終端,那么此時你需要用到這個有用的命令行工具howdoi[6]。
pip?install?howdoi
無論你有什么問題,都可以問它,它會盡力回復(fù)。
howdoi?vertical?align?css
howdoi?for?loop?in?java
howdoi?undo?commits?in?git
但請注意——它會從 StackOverflow 的最佳答案中抓取代碼。它可能并不總是提供最有用的信息......
howdoi?exit?vim
inspect
Python 的inspect模塊[7]非常適合了解幕后發(fā)生的事情。你甚至可以調(diào)用它自己的方法!
下面的代碼示例inspect.getsource()?用于打印自己的源代碼。?inspect.getmodule()?還用于打印定義它的模塊。
最后一行代碼打印出它自己的行號。
import?inspect
print(inspect.getsource(inspect.getsource))
print(inspect.getmodule(inspect.getmodule))
print(inspect.currentframe().f_lineno)
當(dāng)然,除了這些微不足道的用途,inspect 模塊可以證明對理解你的代碼在做什么很有用。你還可以使用它來編寫自文檔化代碼。
Jedi
Jedi 庫是一個自動完成和代碼分析庫。它使編寫代碼更快、更高效。
除非你正在開發(fā)自己的 IDE,否則你可能對使用Jedi?[8]作為編輯器插件比較感興趣。幸運的是,這已經(jīng)有可用的負(fù)載!
**kwargs
在學(xué)習(xí)任何語言時,都會有許多里程碑。使用 Python 并理解神秘的**kwargs語法可能算作一個重要的里程碑。
字典對象前面的雙星號**kwargs[9]允許你將該字典的內(nèi)容作為命名參數(shù)傳遞給函數(shù)。
字典的鍵是參數(shù)名稱,值是傳遞給函數(shù)的值。你甚至不需要調(diào)用它kwargs!
dictionary?=?{"a":?1,?"b":?2}
def?someFunction(a,?b):
????print(a?+?b)
????return
#?這些做同樣的事情:
someFunction(**dictionary)
someFunction(a=1,?b=2)
當(dāng)你想編寫可以處理未預(yù)先定義的命名參數(shù)的函數(shù)時,這很有用。
列表(list)推導(dǎo)式
關(guān)于 Python 編程,我最喜歡的事情之一是它的列表推導(dǎo)式[10]。
這些表達式可以很容易地編寫非常順暢的代碼,幾乎與自然語言一樣。
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 通過許多內(nèi)置功能支持函數(shù)式編程。最有用的map()功能之一是函數(shù)——尤其是與lambda 函數(shù)[11]結(jié)合使用時。
x?=?[1,?2,?3]?
y?=?map(lambda?x?:?x?+?1,?x)
#?打印出?[2,3,4]
print(list(y))
在上面的示例中,map()將一個簡單的?lambda?函數(shù)應(yīng)用于x. 它返回一個映射對象,該對象可以轉(zhuǎn)換為一些可迭代對象,例如列表或元組。
newspaper3k
如果你還沒有看過它,那么準(zhǔn)備好被Python newspaper module?[12]模塊震撼到。它使你可以從一系列領(lǐng)先的國際出版物中檢索新聞文章和相關(guān)的元數(shù)據(jù)。你可以檢索圖像、文本和作者姓名。它甚至有一些內(nèi)置的 NLP 功能[13]。
因此,如果你正在考慮在下一個項目中使用?BeautifulSoup?或其他一些 DIY 網(wǎng)頁抓取庫,使用本模塊可以為你自己節(jié)省不少時間和精力。
pip?install?newspaper3k
Operator overloading
Python 提供對運算符重載的[14]支持,這是讓你聽起來像一個合法的計算機科學(xué)家的術(shù)語之一。
這實際上是一個簡單的概念。有沒有想過為什么 Python 允許你使用+運算符來添加數(shù)字以及連接字符串?這就是操作符重載的作用。
你可以定義以自己的特定方式使用 Python 的標(biāo)準(zhǔn)運算符符號的對象。并且你可以在與你正在使用的對象相關(guā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?something?=?Thing(100)
nothing?=?Thing(0)
#?True
something?>?nothing
#?False
something?#?Error
something?+?nothing
pprint
Python 的默認(rèn)print函數(shù)完成了它的工作。但是如果嘗試使用print函數(shù)打印出任何大的嵌套對象,其結(jié)果相當(dāng)難看。這個標(biāo)準(zhǔn)庫的漂亮打印模塊pprint[15]可以以易于閱讀的格式打印出復(fù)雜的結(jié)構(gòu)化對象。
這算是任何使用非平凡數(shù)據(jù)結(jié)構(gòu)的 Python 開發(fā)人員的必備品。
import?requests
import?pprint
url?=?'https://randomuser.me/api/?results=1'
users?=?requests.get(url).json()
pprint.pprint(users)
Queue
Python 標(biāo)準(zhǔn)庫的 Queue 模塊實現(xiàn)支持多線程。這個模塊讓你實現(xiàn)隊列數(shù)據(jù)結(jié)構(gòu)。這些是允許你根據(jù)特定規(guī)則添加和檢索條目的數(shù)據(jù)結(jié)構(gòu)。
“先進先出”(FIFO)隊列讓你可以按添加順序檢索對象?!昂筮M先出”(LIFO) 隊列讓你可以首先訪問最近添加的對象。
最后,優(yōu)先隊列讓你可以根據(jù)對象的排序順序檢索對象。
這是一個如何在 Python 中使用隊列Queue[16]進行多線程編程的示例。
__repr__
在 Python 中定義類或?qū)ο髸r,提供一種將該對象表示為字符串的“官方”方式很有用。例如:
>>>?file?=?open('file.txt',?'r')?
>>>?print(file)?
'file.txt',?mode?'r'?at?0x10d30aaf0>
這使得調(diào)試代碼更加容易。將其添加到你的類定義中,如下所示:
class?someClass:?
????def?__repr__(self):?
????????return?""
someInstance?=?someClass()
#?打印?
print(someInstance)
sh
Python 是一種很棒的腳本語言。有時使用標(biāo)準(zhǔn)的 os 和 subprocess 庫可能有點頭疼。
該SH庫[17]讓你可以像調(diào)用普通函數(shù)一樣調(diào)用任何程序——對于自動化工作流和任務(wù)非常有用。
import?sh
sh.pwd()
sh.mkdir('new_folder')
sh.touch('new_file.txt')
sh.whoami()
sh.echo('This?is?great!')
Type hints
Python 是一種動態(tài)類型語言。定義變量、函數(shù)、類等時不需要指定數(shù)據(jù)類型。這允許快速的開發(fā)時間。但是,沒有什么比由簡單的輸入問題引起的運行時錯誤更煩人的了。
從?Python 3.5[18]?開始,你可以選擇在定義函數(shù)時提供類型提示。
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)
盡管不是強制性的,但類型注釋可以使你的代碼更易于理解。
它們還允許你使用類型檢查工具,在運行前捕獲那些雜散的 TypeError。如果你正在處理大型、復(fù)雜的項目,這是很有用的!
uuid
通過Python 標(biāo)準(zhǔn)庫的?uuid 模塊[19]生成通用唯一 ID(或“UUID”)的一種快速簡便的方法。
import?uuid
user_id?=?uuid.uuid4()
print(user_id)
這將創(chuàng)建一個隨機的 128 位數(shù)字,該數(shù)字幾乎肯定是唯一的。事實上,可以生成超過 2122 種可能的 UUID。這超過了五個十進制 (或 5,000,000,000,000,000,000,000,000,000,000,000,000)。
在給定的集合中發(fā)現(xiàn)重復(fù)的概率極低。即使有一萬億個 UUID,重復(fù)存在的可能性也遠低于十億分之一。
Virtual environments
你可能同時在多個 Python 項目上工作。不幸的是,有時兩個項目將依賴于相同依賴項的不同版本。你在你的系統(tǒng)上安裝了什么?
幸運的是,Python支持對?虛擬環(huán)境[20]?的讓你可以兩全其美。從命令行:
python?-m?venv?my-project?
source?my-project/bin/activate?
pip?install?all-the-modules
現(xiàn)在,你可以在同一臺機器上運行 Python 的獨立版本和安裝。
wikipedia
維基百科有一個很棒的 API,它允許用戶以編程方式訪問無與倫比的完全免費的知識和信息。在wikipedia模塊[21]使訪問該API非常方便。
import?wikipedia
result?=?wikipedia.page('freeCodeCamp')
print(result.summary)
for?link?in?result.links:
????print(link)
和真實站點一樣,該模塊提供了多語言支持、頁面消歧、隨機頁面檢索,甚至還有一個donate()方法。
xkcd
幽默是 Python 語言的一個關(guān)鍵特征,它是以英國喜劇小品劇Python飛行馬戲團[22]命名的。Python 的許多官方文檔都引用了該節(jié)目最著名的草圖。不過,Python 的幽默并不僅限于文檔。試試運行下面的行:
import?antigravity
YAML
YAML[23]指的是 “ 非標(biāo)記語言” 。它是一種數(shù)據(jù)格式化語言,是 JSON 的超集。
與 JSON 不同,它可以存儲更復(fù)雜的對象并引用它自己的元素。你還可以編寫注釋,使其特別適合編寫配置文件。該PyYAML模塊[24]可讓你使用YAML使用Python。
安裝并然后導(dǎo)入到你的項目中:
pip?install?pyyaml
import?yaml
PyYAML 允許你存儲任何數(shù)據(jù)類型的 Python 對象,以及任何用戶定義類的實例。
zip
壓軸出場的也是很棒的一個模塊。你曾經(jīng)遇到過需要從兩個列表中形成字典嗎?
keys?=?['a',?'b',?'c']
vals?=?[1,?2,?3]
zipped?=?dict(zip(keys,?vals))
該zip()內(nèi)置函數(shù)需要一系列可迭代的對象,并返回一個元組列表中。每個元組按位置索引對輸入對象的元素進行分組。
你還可以通過調(diào)用對象來“解壓縮”對象*zip()。
寫在最后
Python 是一種非常多樣化且發(fā)展良好的語言,因此肯定會有許多我沒有考慮的功能。如果你想了解更多的python模塊,可以參考awesome-python[25]。
參考資料
collections 模塊:?https://docs.python.org/3/library/collections.html
[2]?functions:?https://docs.python.org/3/library/functions.html#dir
[3]?emoji:?https://pypi.org/project/emoji/
[4]?__future__模塊:?https://docs.python.org/2/library/future.html
[5]?geopy 模塊:?https://geopy.readthedocs.io/en/latest/
[6]?howdoi:?https://github.com/gleitz/howdoi
[7]?inspect模塊:?https://docs.python.org/3/library/inspect.html
[8]?Jedi :?https://jedi.readthedocs.io/en/latest/docs/usage.html
[9]?**kwargs:?https://docs.python.org/3/tutorial/controlflow.html#keyword-arguments
[10]?列表推導(dǎo)式:?https://docs.python.org/3/tutorial/datastructures.html#list-comprehensions
[11]?lambda 函數(shù):?https://docs.python.org/3/tutorial/controlflow.html#lambda-expressions
[12]?Python newspaper module :?https://pypi.org/project/newspaper3k/
[13]?內(nèi)置的 NLP 功能:?https://newspaper.readthedocs.io/en/latest/user_guide/quickstart.html#performing-nlp-on-an-article
[14]?運算符重載的:?https://docs.python.org/3/reference/datamodel.html#special-method-names
[15]?pprint:?https://docs.python.org/3/library/pprint.html
[16]?Queue:?https://www.tutorialspoint.com/python3/python_multithreading.htm
[17]?SH庫:?http://amoffat.github.io/sh/
[18]?Python 3.5:?https://docs.python.org/3/library/typing.html
[19]?uuid 模塊:?https://docs.python.org/3/library/uuid.html
[20]?虛擬環(huán)境:?https://docs.python.org/3/tutorial/venv.html
[21]?wikipedia模塊:?https://wikipedia.readthedocs.io/en/latest/quickstart.html
[22]?Python飛行馬戲團:?https://en.wikipedia.org/wiki/Monty_Python's_Flying_Circus
[23]?YAML:?http://yaml.org/
[24]?PyYAML模塊:?https://pyyaml.org/wiki/PyYAMLDocumentation
[25]?awesome-python:?https://awesome-python.com/
推薦閱讀
牛逼!Python常用數(shù)據(jù)類型的基本操作(長文系列第①篇)
牛逼!Python的判斷、循環(huán)和各種表達式(長文系列第②篇)
推薦閱讀
牛逼!Python常用數(shù)據(jù)類型的基本操作(長文系列第①篇)
牛逼!Python的判斷、循環(huán)和各種表達式(長文系列第②篇)
