這些Python代碼技巧,你肯定還不知道
Python 是世界上***、熱門的編程語(yǔ)言之一,原因很多,比如:
- 易于學(xué)習(xí)
- 超高的通用性
- 具備大量模塊和庫(kù)
本文將分享一些使用 Python 的技巧,順序按照 A-Z 排列。
all or any
Python 非常受歡迎的原因之一是其可讀性和表達(dá)性。
人們還經(jīng)常把 Python 笑稱為「可執(zhí)行偽碼(executable pseudocode)」。但是,當(dāng)你可以編寫這樣的代碼時(shí),很難去反駁這種言論:
- 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")
bashplotlib
想在控制臺(tái)中繪圖嗎?
- $ pip install bashplotlib
使用上面的行,即可在控制臺(tái)中繪圖。
collections
Python 有一些很棒的默認(rèn)數(shù)據(jù)類型,但有時(shí)候它們可能不會(huì)盡如你意。
不過(guò),Python 標(biāo)準(zhǔn)庫(kù)提供了 collections 模塊。這個(gè)方便的附加組件可以為你提供更多數(shù)據(jù)類型。
collections 模塊:https://docs.python.org/3/library/collections.html
- 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
你是否想過(guò)如何查看 Python 對(duì)象內(nèi)部及其具有哪些屬性?
輸入以下命令行:
- >>> dir()
- >>> dir("Hello World")
- >>> dir(dir)
當(dāng)以交互方式運(yùn)行 Python 時(shí),這可能是一個(gè)非常有用的功能,并且可以動(dòng)態(tài)地探索你正在使用的對(duì)象和模塊。
想要了解更多,點(diǎn)這里:https://docs.python.org/3/library/functions.html#dir
emoji
是的,真的有。請(qǐng)點(diǎn)擊這里:https://pypi.org/project/emoji/
- $ pip install emoji
別以為我不知道你會(huì)偷偷試它→→
from emoji import emojizeprint(emojize(":thumbs_up:"))
from __future__ import
Python 流行的一個(gè)結(jié)果是,總有新版本正在開發(fā)中。新版本意味著新功能——除非你的版本已經(jīng)過(guò)時(shí)。
不過(guò),別擔(dān)心。__ future__模塊允許用戶導(dǎo)入新版 Python 的功能。這簡(jiǎn)直就像時(shí)間旅行,或者魔法什么的。
__ future__模塊:https://docs.python.org/2/library/*future*.html
- from __future__ import print_function
- print("Hello World!")
geopy
地理(Geography)對(duì)于程序員來(lái)說(shuō)可能是一個(gè)具有挑戰(zhàn)性的領(lǐng)域。但是 geopy 模塊讓它變得異常簡(jiǎn)單。
geopy 模塊:https://geopy.readthedocs.io/en/latest/
- $ pip install geopy
它通過(guò)抽取一系列不同地理編碼服務(wù)的 API 來(lái)工作,使用戶獲取一個(gè)地方的完整街道地址、緯度、經(jīng)度,甚至海拔高度。
另外一個(gè)有用的功能是距離:它可以用你喜歡的度量單位計(jì)算出兩個(gè)位置之間的距離。
- from geopy import GoogleV3
- place = "221b Baker Street, London"
- location = GoogleV3().geocode(place)
- print(location.address)
- print(location.location)
howdoi
陷入編碼問(wèn)題,卻不記得以前見(jiàn)過(guò)的解決方案?需要檢查 StackOverflow,但不想離開終端?
那么你需要這個(gè)有用的命令行工具:https://github.com/gleitz/howdoi。
- $ pip install howdoi
無(wú)論你有什么問(wèn)題都可以問(wèn)它,它會(huì)盡力回答。
- $ howdoi vertical align css
- $ howdoi for loop in java
- $ howdoi undo commits in git
但是請(qǐng)注意——它會(huì)從 StackOverflow 的***票答案中抓取代碼。也就是說(shuō)它提供的信息并非總是有用……
- $ howdoi exit vim
inspect
Python 的 inspect 模塊非常有助于理解問(wèn)題背后的詳情。你甚至可以在 inspect 模塊上調(diào)用其方法!
inspect 模塊:https://docs.python.org/3/library/inspect.html
下面的代碼示例使用 inspect.getsource() 打印自己的源代碼。它還使用 inspect.getmodule() 打印定義它的模塊。
***一行代碼打印出自己的行號(hào)。
- import inspect
- print(inspect.getsource(inspect.getsource))
- print(inspect.getmodule(inspect.getmodule))
- print(inspect.currentframe().f_lineno)
當(dāng)然,除了這些瑣碎的用途之外,inspect 模塊還能幫助你理解代碼正在做的事。你還可以用它編寫自文檔化代碼。
Jedi
Jedi 庫(kù)是一個(gè)自動(dòng)完成和代碼分析的庫(kù)。它使代碼編寫變得更快、效果更高。
除非你正在開發(fā)自己的 IDE,否則你肯定會(huì)對(duì)使用 Jedi 庫(kù)作為編輯插件很感興趣。
Jedi:https://jedi.readthedocs.io/en/latest/docs/usage.html
你可能已經(jīng)在使用 Jedi 了。IPython 項(xiàng)目就使用 Jedi 實(shí)現(xiàn)代碼自動(dòng)完成功能。
**kwargs
學(xué)習(xí)任何語(yǔ)言時(shí)都會(huì)遇到很多里程碑。對(duì)于 Python 來(lái)說(shuō),理解神秘的**kwargs 語(yǔ)法可能算是其中之一。
詞典對(duì)象前面的雙星號(hào)可以讓你把該詞典的內(nèi)容作為命名參數(shù)輸入到函數(shù)中。
詞典的秘鑰是參數(shù)名,值是傳遞給函數(shù)的值。你甚至不需要稱它為 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)
當(dāng)你想編寫能夠處理事先未定義的命名參數(shù)的函數(shù)時(shí),這個(gè)很有用。
列表推導(dǎo)式(List comprehensions)
我最喜歡 Python 編程的原因之一是它的列表推導(dǎo)式
(https://docs.python.org/3/tutorial/datastructures.html#list-comprehensions)。
這些表達(dá)式使得編寫干凈易讀的代碼變得很容易,那些代碼讀起來(lái)幾乎像自然語(yǔ)言一樣。
關(guān)于它們的更多使用信息請(qǐng)查看:
https://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 通過(guò)許多內(nèi)置功能支持函數(shù)式編程。map() 函數(shù)是最有用的函數(shù)之一——特別是當(dāng)它與 lambda 函數(shù)結(jié)合使用時(shí)。
lambda 函數(shù):
https://docs.python.org/3/tutorial/controlflow.html#lambda-expressions
- x = [1, 2, 3]
- y = map(lambda x : x + 1 , x)
- # prints out [2,3,4]
- print(list(y))
在上面的例子中,map() 將一個(gè)簡(jiǎn)單的 lambda 函數(shù)應(yīng)用于 x 中的每個(gè)元素。它返回一個(gè) map 對(duì)象,該對(duì)象可以被轉(zhuǎn)換成可迭代的對(duì)象,如列表或元組。
newspaper3k
如果你之前沒(méi)有見(jiàn)過(guò)它,那么我建議你先查看:https://pypi.org/project/newspaper3k/。
它可以幫助你從大量***國(guó)際出版物中檢索到新聞文章和相關(guān)元數(shù)據(jù)。你可以檢索圖像、文本和作者名。
它還有一些內(nèi)置的 NLP 功能。
地址:
https://newspaper.readthedocs.io/en/latest/user_guide/quickstart.html#performing-nlp-on-an-article
如果你想在下一個(gè)項(xiàng)目中使用 BeautifulSoup 或其它 DIY 網(wǎng)頁(yè)抓取庫(kù),那么不如使用$ pip install newspaper3k,既省時(shí)又省事,何樂(lè)而不為呢?
運(yùn)算符重載(Operator overloading)
Python 支持運(yùn)算符重載。
它實(shí)際上是一個(gè)簡(jiǎn)單的概念。你有沒(méi)有想過(guò)為什么 Python 允許用戶使用 + 運(yùn)算符來(lái)將數(shù)字相加,并級(jí)聯(lián)字符串?這就是運(yùn)算符重載在發(fā)揮作用。
你可以使用 Python 的標(biāo)準(zhǔn)運(yùn)算符號(hào)來(lái)定義對(duì)象,這樣你可以在與這些對(duì)象相關(guān)的語(yǔ)境中使用它們。
- 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 < other.__value
- something = Thing(100)
- nothing = Thing(0)
- # True
- something > nothing
- # False
- something < nothing
- # Error
- something + nothing
pprint
Python 的默認(rèn) print 函數(shù)就可以實(shí)現(xiàn)打印功能。但如果嘗試打印較大的嵌套對(duì)象,就會(huì)發(fā)現(xiàn)打印結(jié)果很丑。
這時(shí) Python 標(biāo)準(zhǔn)庫(kù)的 pretty printer 模塊就可以發(fā)揮作用了。該模塊可以將復(fù)雜的結(jié)構(gòu)化對(duì)象以一種易讀的格式打印出來(lái)。
pretty printer 模塊:https://docs.python.org/3/library/pprint.html
Python 開發(fā)者的必備技能之一就是處理復(fù)雜的數(shù)據(jù)結(jié)構(gòu)。
- import requests
- import pprint
- url = 'https://randomuser.me/api/?results=1'
- users = requests.get(url).json()
- pprint.pprint(users)
Queue
Python 支持多線程,而這是由 Python 標(biāo)準(zhǔn)庫(kù)的 Queue 模塊支持的。
該模塊允許用戶實(shí)現(xiàn)隊(duì)列(queue)數(shù)據(jù)結(jié)構(gòu)。隊(duì)列數(shù)據(jù)結(jié)構(gòu)允許用戶根據(jù)特定的規(guī)則添加和檢索條目。
『First in, first out』 (FIFO) 隊(duì)列允許用戶按照對(duì)象被添加的順序來(lái)檢索對(duì)象?!篖ast in, first out』 (LIFO) 隊(duì)列允許用戶首先訪問(wèn)***添加的對(duì)象。
***,優(yōu)先級(jí)隊(duì)列(priority queue)允許用戶根據(jù)對(duì)象對(duì)應(yīng)的優(yōu)先級(jí)類別來(lái)檢索對(duì)象。
如何使用 queue 在 Python 中實(shí)現(xiàn)多線程編程,示例詳見(jiàn):
https://www.tutorialspoint.com/python3/python_multithreading.htm。
__repr__
在 Python 中定義一個(gè)類別或?qū)ο髸r(shí),以「官方」方式將對(duì)象表示為字符串很有用。例如:
- >>> file = open('file.txt', 'r')
- >>> print(file)
- <open file 'file.txt', mode 'r' at 0x10d30aaf0>
這使代碼 debug 變得簡(jiǎn)單很多。將字符串添加到類別定義,如下所示:
- class someClass:
- def __repr__(self):
- return "<some description here>"
- someInstance = someClass()
- # prints <some description here>
- print(someInstance)
sh
Python 是一種偉大的腳本語(yǔ)言,不過(guò)有時(shí)使用標(biāo)準(zhǔn) os 和 subprocess 庫(kù)會(huì)有點(diǎn)棘手。
sh 庫(kù)提供了一種不錯(cuò)的替代方案。
sh 庫(kù):http://amoffat.github.io/sh/
該庫(kù)允許用戶像使用普通函數(shù)一樣調(diào)用任意程序,這對(duì)自動(dòng)化工作流和任務(wù)非常有用。
- from sh import *
- sh.pwd()
- sh.mkdir('new_folder')
- sh.touch('new_file.txt')
- sh.whoami()
- sh.echo('This is great!')
類型提示(Type hints)
Python 是動(dòng)態(tài)語(yǔ)言。在定義變量、函數(shù)、類別等時(shí)無(wú)需指定數(shù)據(jù)類型。
這有利于縮短開發(fā)周期。但是,簡(jiǎn)單的類型錯(cuò)誤(typing issue)導(dǎo)致的運(yùn)行時(shí)錯(cuò)誤真的太煩了。
從 Python 3.5 版本開始,用戶可以選擇在定義函數(shù)時(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)
盡管非強(qiáng)制,但類型注釋可以使代碼更易理解。
它們還允許你在運(yùn)行之前使用類型檢查工具捕捉 TypeError。在進(jìn)行大型復(fù)雜項(xiàng)目時(shí)執(zhí)行此類操作是值得的。
uuid
生成通用唯一標(biāo)識(shí)符(Universally Unique ID,UUID)的一種快速簡(jiǎn)單方法就是使用 Python 標(biāo)準(zhǔn)庫(kù)的 uuid 模塊。
uuid 模塊:https://docs.python.org/3/library/uuid.html
- import uuid
- user_id = uuid.uuid4()
- print(user_id)
這創(chuàng)建了一個(gè)隨機(jī)化后的 128 比特?cái)?shù)字,該數(shù)字幾乎必然是唯一的。
事實(shí)上,可以生成 2¹²²可能的 UUID。這個(gè)數(shù)字超過(guò)了
5,000,000,000,000,000,000,000,000,000,000,000,000。
在給定集合中找出重復(fù)數(shù)字的可能性極低。即使有一萬(wàn)億 UUID,重復(fù)數(shù)字存在的概率也遠(yuǎn)遠(yuǎn)低于十億分之一。
虛擬環(huán)境(Virtual environment)
這可能是 Python 中我最喜歡的事物了。
你可能同時(shí)處理多個(gè) Python 項(xiàng)目。不幸的是,有時(shí)候兩個(gè)項(xiàng)目依賴于相同依賴項(xiàng)的不同版本。那你要安裝哪個(gè)版本呢?
幸運(yùn)的是,Python 支持虛擬環(huán)境,這使得用戶能夠充分利用兩種環(huán)境。見(jiàn)下列行:
- python -m venv my-project
- source my-project/bin/activate
- pip install all-the-modules
現(xiàn)在你在一臺(tái)機(jī)器上具備獨(dú)立的多個(gè) Python 版本了。問(wèn)題解決!
wikipedia
Wikipedia 擁有一個(gè)很棒的 API,允許用戶以編程方式訪問(wèn)巨大體量的免費(fèi)知識(shí)和信息。
wikipedia 模塊使得訪問(wèn)該 API 非常便捷。
Wikipedia 模塊:https://wikipedia.readthedocs.io/en/latest/quickstart.html
- import wikipedia
- result = wikipedia.page('freeCodeCamp')
- print(result.summary)
- for link in result.links:
- print(link)
和真實(shí)的維基百科網(wǎng)站類似,該模塊支持多種語(yǔ)言、頁(yè)面消歧、隨機(jī)頁(yè)面檢索,甚至還具備 donate() 方法。
xkcd
humour 是 Python 語(yǔ)言的一個(gè)關(guān)鍵特征,其名稱來(lái)自英國(guó)喜劇片《蒙提·派森的飛行馬戲團(tuán)》(Monty Python and the Flying Circus)。Python 的很多官方文檔引用了該喜劇片***的劇情。
幽默感并不限于文檔。試著運(yùn)行下列行:
- import antigravity
將打開 xkcd 畫的 Python 漫畫。不要改變這一點(diǎn),Python。不要改變。
YAML
YAML 代表 『YAML Ain』t Markup Language』。它是一種數(shù)據(jù)格式語(yǔ)言,是 JSON 的超集。
與 JSON 不同,它可以存儲(chǔ)更復(fù)雜的對(duì)象并引用自己的元素。你還可以編寫注釋,使其尤其適用于編寫配置文件。
PyYAML 模塊(https://pyyaml.org/wiki/PyYAMLDocumentation)可以讓你在 Python 中使用 YAML。安裝:
- $ pip install pyyaml
然后導(dǎo)入到項(xiàng)目中:
- import yaml
PyYAML 使你能夠存儲(chǔ)任何數(shù)據(jù)類型的 Python 對(duì)象,以及任何用戶定義類別的實(shí)例。
zip
給你支***一招,非??帷_€在用兩個(gè)列表來(lái)組成一部詞典嗎?
- keys = ['a', 'b', 'c']
- vals = [1, 2, 3]
- zipped = dict(zip(keys, vals))
zip() 內(nèi)置函數(shù)使用多個(gè)可迭代對(duì)象作為輸入并返回元組列表。每個(gè)元組按位置索引對(duì)輸入對(duì)象的元素進(jìn)行分組。
你也可以通過(guò)調(diào)用*zip() 來(lái)「解壓」對(duì)象。
原文鏈接:https://medium.freecodecamp.org/an-a-z-of-useful-python-tricks-b467524ee747
【本文是51CTO專欄機(jī)構(gòu)“機(jī)器之心”的原創(chuàng)文章,微信公眾號(hào)“機(jī)器之心( id: almosthuman2014)”】