一份超級實用的 Python ”技巧“清單
Python是世界上最受歡迎,最流行的程式語言之一。這有很多原因:
- 它很容易學習
- 它是超級多用途的
- 它有大量的模組和庫
每天使用Python是我內在工作的一部分。在這個過程中,我學會了一些有用的技巧和心得。
在這裡,我嘗試以A~Z順序共享其中一些。
大多數這些“技巧”是我在日常工作中使用或偶然發現的事情。一些是我在瀏覽Python標準庫文件時發現的。另外一些是通過PyPi搜尋到的。
但是,應該歸功於它 - 我在awesome-python.com上發現了其中的四個或五個。這是數百個有趣的Python工具和模組的精選列表。這是值得瀏覽的靈感!
大家在學python的時候肯定會遇到很多難題,以及對於新技術的追求,這裡推薦一下我們的Python學習扣qun:784758214,這裡是python學習者聚集地!!同時,自己是一名高階python開發工程師,從基礎的python指令碼到web開發、爬蟲、django、資料探勘等,零基礎到專案實戰的資料都有整理。送給每一位python的小夥伴!每日分享一些學習的方法和需要注意的小細節

all or any
Python是如此流行的程式語言的原因之一是因為具有可讀性和表現力。
人們經常開玩笑說Python是'可執行的虛擬碼。但是當你可以編寫這樣的程式碼時,很難反駁:
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
您可以在控制檯中顯示圖表。
collections
Python有一些很棒的預設資料型別,但有時候它們的行為並不像你想要的那樣。
幸運的是,Python標準庫提供了集合模組。這個方便的附加元件為您提供了更多的資料型別。
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以及動態瀏覽您正在使用的物件和模組時,這可能是一個非常有用的功能。
$ pip install emoji from emoji import emojize print(emojize(":thumbs_up:"))
fromfutureimport
Python受歡迎的一個後果是一直有新的版本在開發中。新版本意味著新功能 - 除非您的版本已過時。
但是,不要害怕。該 future 模組 ,讓您可以用Python匯入未來版本的功能。它實際上就像時間旅行,魔術或其他東西。
from __future__ import print_function print("Hello World!")
為什麼不去匯入花括號?
geopy
對於程式設計師來說,地理位置可能是一個具有挑戰性的領域(ha,a pun!)。但是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,但不想離開終端?
然後你需要 這個有用的命令列工具 。
$ pip install howdoi
問你有什麼問題,它會盡力回答。
$ howdoi vertical align css $ howdoi for java in java $ howdoi undo commits in git
請注意 - 它從StackOverflow的頂級答案中刪除程式碼。它可能並不總能提供最有用的資訊......
$ howdoi退出vim
inspect 檢查
Python的檢查模組非常適合理解幕後發生的事情。你甚至可以自己呼叫它的方法!
下面的程式碼示例 inspect.getsource()
用於列印自己的原始碼。它還 inspect.getmodule()
用於列印定義它的模組。
最後一行程式碼打印出自己的行號。
import inspect print(inspect.getsource(inspect.getsource)) print(inspect.getmodule(inspect.getmodule)) print(inspect.currentframe().f_lineno)
當然,除了這些微不足道的用途之外,檢查模組對於理解程式碼的作用非常有用。您也可以使用它來編寫自我記錄程式碼。
Jedi
Jedi庫是一個程式碼輔助和程式碼分析的庫。它使編寫程式碼更快,更高效。
除非您正在開發自己的IDE,否則您可能最感興趣的是將Jedi用作編輯器外掛。幸運的是,已經可用了!
但是,您可能已經在使用Jedi了。IPython專案利用Jedi實現其程式碼自動完成功能。
** kwargs
學習任何語言時,沿途都有許多里程碑。使用Python,理解神祕的 **kwargs
語法可能算作一個。
字典物件前面的雙星號允許您將該字典的內容作為命名引數傳遞給函式。
字典的鍵是引數名稱,值是傳遞給函式的值。你甚至不需要叫它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)
當您想要編寫可以處理未事先定義的命名引數的函式時,這非常有用。
List comprehensions
我最喜歡用Python程式設計的一點是列表推導。
這些表示式可以很容易地編寫非常乾淨的程式碼,幾乎就像自然語言一樣。
您可以在此處詳細瞭解如何使用它們。
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()
將簡單的lambda函式應用於每個元素 x
。它返回一個map物件,可以將其轉換為某個可迭代物件,例如list或tuple。
newspaper3k
如果你還沒有看過它,那麼請準備好讓你的思緒被 Python的報紙模組所震撼 。
它允許您從一系列領先的國際出版物中檢索新聞文章和相關的元資料。您可以檢索影象,文字和作者姓名。
它甚至還有一些內建的NLP功能。
因此,如果您正在考慮將BeautifulSoup或其他DIY網頁爬蟲庫用於您的下一個專案,請節省您自己的時間和精力,用`$ pip install newspaper3k 代替。
Operator overloading 運算子過載
Python提供了對運算子過載的支援,這是使你聽起來像一個合法的電腦科學家的術語之一。
這實際上是一個簡單的概念。有沒有想過為什麼Python允許你使用 +
運算子來新增數字以及連線字串?那是運算子過載在起作用。
您可以按照自己的特定方式定義使用Python標準運算子符號的物件。這使您可以在與您正在使用的物件相關的上下文中使用它們。
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的預設 print
函式可以完成它的工作。但是嘗試打印出任何大的巢狀物件,結果相當醜陋。
這是 標準庫的漂亮列印模組(Standard Library’s pretty-print module)的 用武之地。它以易於閱讀的格式打印出複雜的結構化物件。
任何使用非常規資料結構的Python開發人員必備的。
import requests import pprint url = 'https://randomuser.me/api/?results=1' users = requests.get(url).json() pprint.pprint(users)
Queue 佇列
Python支援多執行緒,標準庫的佇列模組為此提供了便利。
此模組允許您實現佇列資料結構。這些是允許您根據特定規則新增和檢索條目的資料結構。
'先進先出'(或FIFO)佇列允許您按照新增的順序檢索物件。“後進先出”(LIFO)佇列允許您首先訪問最近新增的物件。
最後,優先順序佇列允許您根據物件的排序順序檢索物件。
這是一個如何在Python中使用佇列進行多執行緒程式設計的示例。
repr
在Python中定義類或物件時,提供一種將該物件表示為字串的“官方”方法很有用。例如:
>>> file = open('file.txt', 'r') >>> print(file) <open file 'file.txt', mode 'r' at 0x10d30aaf0>
這使除錯程式碼更容易。將其新增到您的類定義中,如下所示:
class someClass: def __repr__(self): return "<some description here>" someInstance = someClass() # prints <some description here> print(someInstance)
SH
Python是一種很棒的指令碼語言。有時使用標準的作業系統和子程序庫可能會讓人頭疼。
該SH庫提供了一個整潔的替代品。
它允許您呼叫任何程式,就像它是一個普通函式一樣 - 對於自動化工作流和任務非常有用,所有這些都來自Python。
import sh sh.pwd() sh.mkdir('new_folder') sh.touch('new_file.txt') sh.whoami() sh.echo('This is great!')
Type hints
Python是一種動態型別語言。定義變數,函式,類等時,不需要指定資料型別。
這允許快速開發時間。但是,有一些事情比簡單的鍵入問題導致的執行時錯誤更令人討厭。
從Python 3.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)
雖然不是強制性的,但型別註釋可以使您的程式碼更容易理解。
它們還允許您使用型別檢查工具在執行時捕獲那些雜散的TypeErrors。如果您正在開展大型複雜專案,那可能是值得的!
uuid
生成通用唯一ID(或“UUID”)的快捷方法是通過 Python標準庫的uuid模組 。
import uuid user_id = uuid.uuid4() print(user_id)
這會建立一個隨機的128位數字,幾乎肯定是唯一的。
實際上,可以生成超過2 12 2個可能的UUID。這超過五億十億(或5,000,000,000,000,000,000,000,000,000,000,000,000,000)。
在給定集合中找到重複的概率非常低。即使有萬億UUID,重複存在的可能性也遠遠低於十億分之一。
兩行程式碼相當不錯。
Virtual environments
這可能是我最喜歡的Python的地方。
您有可能在任何時候都在處理多個Python專案。不幸的是,有時兩個專案將依賴於同一依賴項的不同版本。你在系統上安裝了哪些?
幸運的是,Python對虛擬環境的支援讓您擁有兩全其美的優勢。從命令列:
python -m venv my-project source my-project/bin/activate pip install all-the-modules
現在,您可以在同一臺計算機上執行獨立版本和Python安裝。
wikipedia 維基百科
維基百科有一個很棒的API,允許使用者以程式設計方式訪問無與倫比的完全免費的知識和資訊。
在維基百科模組,使訪問該API幾乎令人意想不到的方便。
import wikipedia result = wikipedia.page('freeCodeCamp') print(result.summary) for link in result.links: print(link)
與真實網站一樣,該模組提供對多種語言的支援,頁面消歧,隨機頁面檢索,甚至還有一種 donate()
方法。
XKCD
幽默是Python語言的一個關鍵特徵 - 畢竟,它是以英國喜劇素描 Monty Python的飛行馬戲團 命名的。Python的大部分官方文件都引用了該劇最著名的草圖。
但幽默感並不侷限於文件。請按以下方式執行:
import antigravity
永遠不要改變,Python。從不改變。
YAML
YAML代表' YAML Is Not Markup Language '。它是一種資料格式化語言,是JSON的超集。
與JSON不同,它可以儲存更復雜的物件並引用它自己的元素。您還可以編寫註釋,使其特別適合編寫配置檔案。
該PyYAML模組可讓您使用YAML使用Python。安裝:
$ pip install pyyaml
然後匯入到您的專案中:
import yaml
PyYAML允許您儲存任何資料型別的Python物件,以及任何使用者定義類的例項。
zip 壓縮
技巧的最後一招,真的很酷。曾經需要從兩個列表中形成字典嗎?
keys = ['a', 'b', 'c'] vals = [1, 2, 3] zipped = dict(zip(keys, vals))
該 zip()
內建函式需要一系列可迭代的物件,並返回一個元組列表。每個元組按位置索引對輸入物件的元素進行分組。
您也可以通過呼叫 *zip()
它們來“解壓縮”物件。