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