你想要的 Python 編程技巧,我都給你整理好了
Python 是這個(gè)世界上***的按需編程語(yǔ)言之一。其中包含很多原因:
-
易學(xué)習(xí)
-
應(yīng)用范圍廣
-
具備非常多的模型和庫(kù)
Python 是我作為數(shù)據(jù)科學(xué)家日常生活中不可或缺的一部分。在學(xué)習(xí) Python 的過(guò)程中,我領(lǐng)悟到了很多的方法和技巧。
在這里,我嘗試用 A-Z 的格式來(lái)做一些分享。
大部分的技巧是我在日常工作中使用的或是偶然發(fā)現(xiàn)的。 其中一些是在瀏覽 Python Standard Library docs 找到的。其他的一些是我在 PyPi 中搜索找到的。
但事實(shí)上,還是應(yīng)該歸功于 awesome-python.com ,因?yàn)槲以谏厦嬲业搅怂膫€(gè)或五個(gè)實(shí)用的技巧。這是數(shù)百個(gè)有趣的 Python 工具和模塊。非常值得瀏覽以獲取靈感。
all or any
Python 受歡迎的眾多原因之一是它的可讀性和易表達(dá)性。
人們經(jīng)常笑稱(chēng) Python 是可執(zhí)行的偽代碼。但當(dāng)你寫(xiě)出下述代碼,很難去反駁這種言論。
- 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)中繪圖。
集合
Python 內(nèi)置默認(rèn)的數(shù)據(jù)類(lèi)型,但有時(shí)它們的使用效果會(huì)不盡如人意。
幸運(yùn)的是,Python 的標(biāo)準(zhǔn)庫(kù)提供了 collections 模塊,這個(gè)方便的附加庫(kù)提供了更多的數(shù)據(jù)類(lèi)型。
- from collections import OrderedDict, Counter x = OrderedDict(a=1, b=2, c=3) y = Counter("Hello World!")
dir
你是否曾經(jīng)有過(guò)深入 Python 對(duì)象內(nèi)部并且觀察它具備哪些屬性的想法呢?
輸入下述命令行:
- >>> dir() >>> dir("Hello World") >>> dir(dir)
以交互式運(yùn)行 Python 時(shí),這是一個(gè)非常實(shí)用的特征,并且可以動(dòng)態(tài)地搜索正在使用的對(duì)象和模塊。
emoji
Python 包含 emoji 模塊,在這里!
- $ pip install emoji
別以為我不知道你會(huì)偷偷下載...
- from emoji import emojize print(emojize(":thumbs_up:"))
from _future_import
Python 流行的一個(gè)結(jié)果是新版本總是在開(kāi)發(fā)中。新版本意味著新功能——除非版本已經(jīng)過(guò)時(shí)
不過(guò)別擔(dān)心。_future_module 允許用戶通過(guò)函數(shù)導(dǎo)入新版本 Python 的功能。這就像是時(shí)間旅行,或是奇異魔法之類(lèi)......
- from __future__ import print_function print("Hello World!")
為什么不導(dǎo)入花括號(hào)呢?
geopy
地理知識(shí)對(duì)于程序猿來(lái)說(shuō)是非常大的挑戰(zhàn)是,但是 geopy 模塊讓它變得更簡(jiǎn)單。
- $ pip install geopy
它通過(guò)提取不同的地理編碼服務(wù) API 進(jìn)行工作,以此能獲取一個(gè)地方的完整街道地址,經(jīng)度,緯度,甚至是海拔高度。
geopy 還提供一個(gè)非常有用的距離類(lèi)。它支持用戶喜歡的度量方式來(lái)計(jì)算兩個(gè)地點(diǎn)之間的距離。
- from geopy import GoogleV3 place = "221b Baker Street, London" location = GoogleV3().geocode(place) print(location.address) print(location.location)
howdoi
受困于編程問(wèn)題并且不記得之前看到過(guò)的解決方法?用戶需要使用 StackOverflow ,但是不想離開(kāi)終端?
那么需要使用這個(gè)非常使用的命令行工具 howdoi
- $ pip install howdoi
無(wú)論你有什么問(wèn)題,它都會(huì)幫你解答。
- $ howdoi vertical align css $ howdoi for loop in java $ howdoi undo commits in git
但是請(qǐng)注意,它會(huì)從 StackOverflow 的***票答案中抓取代碼,這意味著它的回答并不總是最有用的。
- $ howdoi exit vim
inspect
Python 的 inspects 模塊對(duì)于理解背后的原理是非常有幫助的。用戶甚至可以在 inspect 模塊上調(diào)用其方法!
下述代碼示例使用
inspect.getsource()
來(lái)打印它的源代碼。同時(shí)它也使用
inspect.getmodule()
來(lái)打印定義它的模塊。
***一行代碼打印出自身的行號(hào)。
- import inspect print(inspect.getsource(inspect.getsource)) print(inspect.getmodule(inspect.getmodule)) print(inspect.currentframe().f_lineno)
當(dāng)然,除了這些瑣碎的用途之外 , inspect 模塊還支持理解用戶代碼正在做什么。用戶還可以利用 Inspect 模塊編寫(xiě)自文檔化代碼。
Jedi
Jedi 是一個(gè)自動(dòng)完成以及代碼分析庫(kù)。它使得編寫(xiě)代碼更加快速以及更高產(chǎn)。
除非用戶正在自主開(kāi)發(fā) IDE,否則肯定會(huì)對(duì)使用 Jedi 作為編輯器插件非常感興趣。幸運(yùn)的是,已經(jīng)開(kāi)放下載。
用戶可能已經(jīng)在使用 Jedi。 IPython 項(xiàng)目基于 Jedi 實(shí)現(xiàn)了代碼自動(dòng)完成功能。
**kwargs
在學(xué)習(xí)任何編程語(yǔ)言時(shí),一路上會(huì)遇到很多里程碑。在學(xué)習(xí) Python 時(shí),理解神秘的 **kwargs 是其中一塊里程碑。
字典前面的雙星號(hào)支持把字典的內(nèi)容作為命名參數(shù)傳遞給函數(shù)。
字典的秘鑰是參數(shù)名,值是傳遞給函數(shù)的值,用戶甚至都不需要稱(chēng)它為 kwargs
- dictionary = {"a": 1, "b": 2} def someFunction(a, b): print(a + b) return someFunction(**dictionary) someFunction(a=1, b=2)
當(dāng)用戶編寫(xiě)處理事先未定義的命名參數(shù)的函數(shù)時(shí),這個(gè)很有用。
列表解析
在python編程中其中一個(gè)我喜歡的東西是它的列表解析
這些表達(dá)式可以很容易的寫(xiě)出非常簡(jiǎn)潔的代碼,使其讀起來(lái)就像自然語(yǔ)言一樣
你可以了解更多關(guān)于如何使用它
- 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()
特別是結(jié)合lambda函數(shù)使用時(shí)。
- x = [1, 2, 3] y = map(lambda x : x + 1 , x) print(list(y))
在上面的例子中 map() 對(duì)X中的每個(gè)元素應(yīng)用了簡(jiǎn)單的lambda函數(shù)
它返回一個(gè)map object類(lèi)型,可以被轉(zhuǎn)換成一些可迭代對(duì)象,例如列表或元組
newspaper3k
如果你之前沒(méi)有見(jiàn)過(guò)newspaper3k的話,那么請(qǐng)準(zhǔn)備好被這個(gè)Python的newspaper模塊所震撼吧
newspaper模塊允許你從一系列國(guó)際領(lǐng)先的出版物中檢索新聞文章和相關(guān)的元數(shù)據(jù)。你可以檢索圖像,文本和作者姓名。
newspaper模塊甚至有一些內(nèi)置的NLP功能。
因此,如果你想在下一個(gè)項(xiàng)目中使用BeautifulSoup或其他DIY網(wǎng)頁(yè)查詢(xún)庫(kù),節(jié)省自己的時(shí)間和精力,并改為
- $ pip install newspaper3k
Operator overloading
Python 支持操作符重載,這術(shù)語(yǔ)讓你聽(tīng)上去像是計(jì)算機(jī)科學(xué)家。
事實(shí)上這是個(gè)非常普通的概念。是否曾經(jīng)想過(guò)為什么 Python 支持使用 + 運(yùn)算符來(lái)對(duì)數(shù)值進(jìn)行相加以及連接字符串?這就是實(shí)際的操作符重載。
用戶可以按照自己特定的方式來(lái)定義使用 Python 標(biāo)準(zhǔn)運(yùn)算符符號(hào)對(duì)象,這使得用戶可以在對(duì)象相關(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 < other.__value something = Thing(100) nothing = Thing(0) something > nothing something < nothing something + nothing
pprint
Python 的默認(rèn)函數(shù) print 可以實(shí)現(xiàn)打印功能,但是如果打印的嵌套對(duì)象體量比較大,就會(huì)發(fā)現(xiàn)打印結(jié)果不太美觀。
這時(shí)就需要用到標(biāo)準(zhǔn)庫(kù)pretty-print 模塊。它能用可讀性強(qiáng)的方式打印出復(fù)雜結(jié)構(gòu)的對(duì)象。
Python 開(kāi)發(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 支持多線程,這可以通過(guò)標(biāo)準(zhǔn)庫(kù)的 Queue 模塊來(lái)實(shí)現(xiàn)。Queue 模塊讓用戶可以實(shí)現(xiàn)隊(duì)列數(shù)據(jù)結(jié)構(gòu),該數(shù)據(jù)結(jié)構(gòu)允許用戶通過(guò)特定的方法添加和檢索數(shù)據(jù)。
“First in ,first out ”(或 FIFO) 隊(duì)列數(shù)據(jù)結(jié)構(gòu)允許用戶依據(jù)對(duì)象添加的順序檢索對(duì)象,“Last in,first out”(LIFO)數(shù)據(jù)結(jié)構(gòu)允許用戶先連接到最近添加的對(duì)象。
***,優(yōu)先隊(duì)列允許用戶依據(jù)存儲(chǔ)順序檢索對(duì)象。
這是 Python 中針對(duì)多線程編程使用queues 的一個(gè)實(shí)例。
_rep r_
在 Python中定義類(lèi)或?qū)ο髸r(shí),提供一種字符串表示對(duì)象的“官方”方法很實(shí)用。舉個(gè)例子:
- >>> file = open('file.txt', 'r') >>> print(file) <open file 'file.txt', mode 'r' at 0x10d30aaf0>
這讓代碼調(diào)試變得更加簡(jiǎn)單。如下圖所示添加類(lèi)的定義:
- class someClass: def __repr__(self): return "<some description here>" someInstance = someClass() print(someInstance)
Sh
Python 是一種很棒的腳本語(yǔ)言。有時(shí)使用標(biāo)準(zhǔn)操作系統(tǒng)以及子進(jìn)程庫(kù)是很令人頭疼的一個(gè)問(wèn)題。
Sh 庫(kù)提供了一種簡(jiǎn)介的替代方案。
它允許用戶在調(diào)用程序時(shí)如同調(diào)用函數(shù)一般,這對(duì)自動(dòng)化工作流和任務(wù)非常有用。所有的都來(lái)自 Python 內(nèi)部。
- from sh import * sh.pwd() sh.mkdir('new_folder') sh.touch('new_file.txt') sh.whoami() sh.echo('This is great!')
類(lèi)型提示
Python 是動(dòng)態(tài)語(yǔ)言,在定義變量,函數(shù),類(lèi)別……時(shí)無(wú)需指定數(shù)據(jù)類(lèi)型。
這個(gè)設(shè)定允許快速開(kāi)發(fā),但是由于簡(jiǎn)單的類(lèi)型錯(cuò)誤比運(yùn)行錯(cuò)誤更煩人。
從Python3.5開(kāi)始,定義函數(shù)時(shí)用戶可以選擇開(kāi)啟類(lèi)型提示。
- def addTwo(x : Int) -> Int: return x + 2
用戶也可以定義類(lèi)型別名:
- 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)
盡管類(lèi)型注釋是非強(qiáng)制性的,但是這能讓代碼更具可讀性。
Python3.5+ 還允許用戶使用類(lèi)型提示工具在運(yùn)行前知曉類(lèi)型錯(cuò)誤,這在大型的復(fù)雜項(xiàng)目中是非常值得的。
uuid
生成通用唯一標(biāo)識(shí)符的快速簡(jiǎn)便方法是Python 標(biāo)準(zhǔn)庫(kù)中的 uuid 模塊。
- import uuid user_id = uuid.uuid4() print(user_id)
它隨機(jī)生成 128位唯一數(shù)字。
事實(shí)上一共有 個(gè)可能生成的UUID。 這個(gè)數(shù)值超過(guò)了
5,000,000,000,000,000,000,000,000,000,000,000,000,000。
在給定集合中找到重復(fù)數(shù)字的概率非常低。 即使有一萬(wàn)億個(gè)UUID,重復(fù)存在的可能性也遠(yuǎn)遠(yuǎn)低于十億分之一。
僅用兩行代碼即可生成通用唯一標(biāo)志符,非常棒!
虛擬環(huán)境
這是我最喜歡的 Python 部分。
用戶可能需要同時(shí)處理多個(gè) Python 項(xiàng)目。不幸的是,有時(shí)候兩個(gè)項(xiàng)目依賴(lài)于相同依賴(lài)項(xiàng)的不同版本。那么用戶應(yīng)該下載哪個(gè)版本的依賴(lài)庫(kù)呢?
幸運(yùn)的是,Python 支持虛擬環(huán)境,讓用戶能夠同時(shí)利用兩種環(huán)境。命令行如下:
- python -m venv my-project source my-project/bin/activate pip install all-the-modules
現(xiàn)在一臺(tái)機(jī)器上可以支持兩個(gè)版本的 Python 了。問(wèn)題解決!
Wikipedia
Wikipedia 具備非常棒的 API ,允許用戶以編程方式訪問(wèn)龐大的知識(shí)和信息。
Wikipedia 模塊使得訪問(wèn) Wikipedia API 非常地方便。
- import wikipedia result = wikipedia.page('freeCodeCamp') print(result.summary) for link in result.links: print(link)
和真實(shí)的 Wikipedia 類(lèi)似,模塊支持多種語(yǔ)言,頁(yè)面消歧,隨機(jī)頁(yè)面檢索,甚至還有donate()方法
Xkcd
Humour 是 Python的關(guān)鍵特征——畢竟它的名字來(lái)源于英國(guó)喜劇片《Monty Python 的飛行馬戲團(tuán)》,Python 的很多官方文檔引用了該片的情節(jié)。
Python 的幽默感并不局限于官方文檔 。運(yùn)行下述命令行:
- import antigravity
希望Python 不要改變它的幽默風(fēng)格
YAML
YAML ’t Markup Language。它是一種數(shù)據(jù)格式語(yǔ)言,是JSON 的超集
與 JSON不同的是,它可以存儲(chǔ)更復(fù)雜的對(duì)象并引用自己的元素。用戶可以編寫(xiě)注釋?zhuān)蛊溥m用于編寫(xiě)配置文件。
PyYAML模塊讓用戶在 Python 中使用 YAML 。安裝命令行如下:
- $ pip install pyyaml
然后導(dǎo)入到用戶的項(xiàng)目中:
- import yaml
PyYAML允許您存儲(chǔ)任何數(shù)據(jù)類(lèi)型的Python對(duì)象,以及任何用戶定義類(lèi)的實(shí)例。
Zip
***的一個(gè) Python 技巧,它真的很棒。還在用兩個(gè)列表來(lái)組成字典這樣的方法嗎?
- keys = ['a', 'b', 'c'] vals = [1, 2, 3] zipped = dict(zip(keys, vals))
Zip() 內(nèi)置函數(shù)使用多個(gè)可迭代對(duì)象作為輸入并返回元組列表。每個(gè)元組列表依據(jù)位置索引對(duì)輸入對(duì)象的元素進(jìn)行分組。
用戶也可以使用 *zip() 來(lái)解壓對(duì)象
感謝閱讀
以上就是 A-Z 的 Python 技巧——相信你已經(jīng)找到有用于下一個(gè)項(xiàng)目的技巧了。
Python 是一個(gè)非常多樣化并且發(fā)展良好的編程語(yǔ)言,所以我對(duì) Python 許多非常棒的特征會(huì)有疏漏。