這些Python代碼技巧,你肯定還不知道

2021-01-08 機器之心Pro

選自FreeCodeCamp

作者:Peter Gleeson

機器之心編譯

參與:路、王淑婷

被人工智慧捧紅的 Python 已是一種發展完善且非常多樣化的語言,其中肯定有一些你尚未發現的功能。本文或許能夠讓你學到一些新技巧。

Python 是世界上最流行、熱門的程式語言之一,原因很多,比如:

易於學習超高的通用性具備大量模塊和庫

本文將分享一些使用 Python 的技巧,順序按照 A-Z 排列。

all or any

Python 非常受歡迎的原因之一是其可讀性和表達性。

人們還經常把 Python 笑稱為「可執行偽碼(executable pseudocode)」。但是,當你可以編寫這樣的代碼時,很難去反駁這種言論:

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 標準庫提供了 collections 模塊。這個方便的附加組件可以為你提供更多數據類型。

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 charactery = Counter("Hello World!")

dir

你是否想過如何查看 Python 對象內部及其具有哪些屬性?

輸入以下命令行:

>>> dir()>>> dir("Hello World")>>> dir(dir)

當以交互方式運行 Python 時,這可能是一個非常有用的功能,並且可以動態地探索你正在使用的對象和模塊。

想要了解更多,點這裡:https://docs.python.org/3/library/functions.html#dir

emoji

是的,真的有。請點擊這裡:https://pypi.org/project/emoji/

$ pip install emoji

別以為我不知道你會偷偷試它→→

from emoji import emojizeprint(emojize(":thumbs_up:"))

from __future__ import

Python 流行的一個結果是,總有新版本正在開發中。新版本意味著新功能——除非你的版本已經過時。

不過,別擔心。__ future__模塊允許用戶導入新版 Python 的功能。這簡直就像時間旅行,或者魔法什麼的。

__ future__模塊:https://docs.python.org/2/library/*future*.html

from __future__ import print_functionprint("Hello World!")

geopy

地理(Geography)對於程式設計師來說可能是一個具有挑戰性的領域。但是 geopy 模塊讓它變得異常簡單。

geopy 模塊:https://geopy.readthedocs.io/en/latest/

$ pip install geopy

它通過抽取一系列不同地理編碼服務的 API 來工作,使用戶獲取一個地方的完整街道地址、緯度、經度,甚至海拔高度。

另外一個有用的功能是距離:它可以用你喜歡的度量單位計算出兩個位置之間的距離。

from geopy import GoogleV3place = "221b Baker Street, London"location = GoogleV3().geocode(place)print(location.address)print(location.location)

howdoi

陷入編碼問題,卻不記得以前見過的解決方案?需要檢查 StackOverflow,但不想離開終端?

那麼你需要這個有用的命令行工具:https://github.com/gleitz/howdoi。

$ pip install howdoi

無論你有什麼問題都可以問它,它會盡力回答。

$ howdoi vertical align css$ howdoi for loop in java$ howdoi undo commits in git

但是請注意——它會從 StackOverflow 的最高票答案中抓取代碼。也就是說它提供的信息並非總是有用……

$ howdoi exit vim

inspect

Python 的 inspect 模塊非常有助於理解問題背後的詳情。你甚至可以在 inspect 模塊上調用其方法!

inspect 模塊:https://docs.python.org/3/library/inspect.html

下面的代碼示例使用 inspect.getsource() 列印自己的原始碼。它還使用 inspect.getmodule() 列印定義它的模塊。

最後一行代碼列印出自己的行號。

import inspectprint(inspect.getsource(inspect.getsource))print(inspect.getmodule(inspect.getmodule))print(inspect.currentframe().f_lineno)

當然,除了這些瑣碎的用途之外,inspect 模塊還能幫助你理解代碼正在做的事。你還可以用它編寫自文檔化代碼。

Jedi

Jedi 庫是一個自動完成和代碼分析的庫。它使代碼編寫變得更快、效果更高。

除非你正在開發自己的 IDE,否則你肯定會對使用 Jedi 庫作為編輯插件很感興趣。

Jedi:https://jedi.readthedocs.io/en/latest/docs/usage.html

你可能已經在使用 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 編程的原因之一是它的列表推導式(https://docs.python.org/3/tutorial/datastructures.html#list-comprehensions)。

這些表達式使得編寫乾淨易讀的代碼變得很容易,那些代碼讀起來幾乎像自然語言一樣。

關於它們的更多使用信息請查看: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 通過許多內置功能支持函數式編程。map() 函數是最有用的函數之一——特別是當它與 lambda 函數結合使用時。

lambda 函數: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() 將一個簡單的 lambda 函數應用於 x 中的每個元素。它返回一個 map 對象,該對象可以被轉換成可迭代的對象,如列表或元組。

newspaper3k

如果你之前沒有見過它,那麼我建議你先查看:https://pypi.org/project/newspaper3k/。

它可以幫助你從大量頂級國際出版物中檢索到新聞文章和相關元數據。你可以檢索圖像、文本和作者名。

它還有一些內置的 NLP 功能。

地址:https://newspaper.readthedocs.io/en/latest/user_guide/quickstart.html#performing-nlp-on-an-article

如果你想在下一個項目中使用 BeautifulSoup 或其它 DIY 網頁抓取庫,那麼不如使用$ pip install newspaper3k,既省時又省事,何樂而不為呢?

運算符重載(Operator overloading)

Python 支持運算符重載。

它實際上是一個簡單的概念。你有沒有想過為什麼 Python 允許用戶使用 + 運算符來將數字相加,並級聯字符串?這就是運算符重載在發揮作用。

你可以使用 Python 的標準運算符號來定義對象,這樣你可以在與這些對象相關的語境中使用它們。

classThing:def__init__(self, value):self.__value= value def __gt__(self, other):return self.__value > other.__value def __lt__(self, other):return self.__value < other.__valuesomething = Thing(100)nothing = Thing(0)# Truesomething > nothing# Falsesomething < nothing# Errorsomething + nothing

pprint

Python 的默認 print 函數就可以實現列印功能。但如果嘗試列印較大的嵌套對象,就會發現列印結果很醜。

這時 Python 標準庫的 pretty printer 模塊就可以發揮作用了。該模塊可以將複雜的結構化對象以一種易讀的格式列印出來。

pretty printer 模塊:https://docs.python.org/3/library/pprint.html

Python 開發者的必備技能之一就是處理複雜的數據結構。

import requestsimport pprinturl = 'https://randomuser.me/api/?results=1'users = requests.get(url).json()pprint.pprint(users)

Queue

Python 支持多線程,而這是由 Python 標準庫的 Queue 模塊支持的。

該模塊允許用戶實現隊列(queue)數據結構。隊列數據結構允許用戶根據特定的規則添加和檢索條目。

『First in, first out』 (FIFO) 隊列允許用戶按照對象被添加的順序來檢索對象。『Last in, first out』 (LIFO) 隊列允許用戶首先訪問最新添加的對象。

最後,優先級隊列(priority queue)允許用戶根據對象對應的優先級類別來檢索對象。

如何使用 queue 在 Python 中實現多線程編程,示例詳見:https://www.tutorialspoint.com/python3/python_multithreading.htm。

__repr__

在 Python 中定義一個類別或對象時,以「官方」方式將對象表示為字符串很有用。例如:

>>> file = open('file.txt', 'r')>>> print(file)<open file 'file.txt', mode 'r' at 0x10d30aaf0>

這使代碼 debug 變得簡單很多。將字符串添加到類別定義,如下所示:

classsomeClass:def__repr__(self):return "<somedescriptionhere>"someInstance= someClass()# prints <some description here>print(someInstance)

sh

Python 是一種偉大的腳本語言,不過有時使用標準 os 和 subprocess 庫會有點棘手。

sh 庫提供了一種不錯的替代方案。

sh 庫:http://amoffat.github.io/sh/

該庫允許用戶像使用普通函數一樣調用任意程序,這對自動化工作流和任務非常有用。

from sh import *sh.pwd()sh.mkdir('new_folder')sh.touch('new_file.txt')sh.whoami()sh.echo('This is great!')

類型提示(Type hints)

Python 是動態語言。在定義變量、函數、類別等時無需指定數據類型。

這有利於縮短開發周期。但是,簡單的類型錯誤(typing issue)導致的運行時錯誤真的太煩了。

從 Python 3.5 版本開始,用戶可以選擇在定義函數時開啟類型提示。

def addTwo(x : Int) -> Int:return x + 2

你還可以定義類型別名:

from typing import ListVector = 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 resultx = [[1.0, 0.0], [0.0, 1.0]]y = [[2.0, 1.0], [0.0, -2.0]]z = addMatrix(x, y)

儘管非強制,但類型注釋可以使代碼更易理解。

它們還允許你在運行之前使用類型檢查工具捕捉 TypeError。在進行大型複雜項目時執行此類操作是值得的。

uuid

生成通用唯一標識符(Universally Unique ID,UUID)的一種快速簡單方法就是使用 Python 標準庫的 uuid 模塊。

uuid 模塊:https://docs.python.org/3/library/uuid.html

import uuiduser_id = uuid.uuid4()print(user_id)

這創建了一個隨機化後的 128 比特數字,該數字幾乎必然是唯一的。

事實上,可以生成 2可能的 UUID。這個數字超過了 5,000,000,000,000,000,000,000,000,000,000,000,000。

在給定集合中找出重複數字的可能性極低。即使有一萬億 UUID,重複數字存在的概率也遠遠低於十億分之一。

虛擬環境(Virtual environment)

這可能是 Python 中我最喜歡的事物了。

你可能同時處理多個 Python 項目。不幸的是,有時候兩個項目依賴於相同依賴項的不同版本。那你要安裝哪個版本呢?

幸運的是,Python 支持虛擬環境,這使得用戶能夠充分利用兩種環境。見下列行:

python -m venv my-projectsource my-project/bin/activatepip install all-the-modules

現在你在一臺機器上具備獨立的多個 Python 版本了。問題解決!

wikipedia

Wikipedia 擁有一個很棒的 API,允許用戶以編程方式訪問巨大體量的免費知識和信息。

wikipedia 模塊使得訪問該 API 非常便捷。

Wikipedia 模塊:https://wikipedia.readthedocs.io/en/latest/quickstart.html

import wikipediaresult = wikipedia.page('freeCodeCamp')print(result.summary)for link in result.links: print(link)

和真實的維基百科網站類似,該模塊支持多種語言、頁面消歧、隨機頁面檢索,甚至還具備 donate() 方法。

xkcd

humour 是 Python 語言的一個關鍵特徵,其名稱來自英國喜劇片《蒙提·派森的飛行馬戲團》(Monty Python and the Flying Circus)。Python 的很多官方文檔引用了該喜劇片最著名的劇情。

幽默感並不限於文檔。試著運行下列行:

import antigravity

將打開 xkcd 畫的 Python 漫畫。不要改變這一點,Python。不要改變。

YAML

YAML 代表 『YAML Ain』t Markup Language』。它是一種數據格式語言,是 JSON 的超集。

與 JSON 不同,它可以存儲更複雜的對象並引用自己的元素。你還可以編寫注釋,使其尤其適用於編寫配置文件。

PyYAML 模塊(https://pyyaml.org/wiki/PyYAMLDocumentation)可以讓你在 Python 中使用 YAML。安裝:

$ pip install pyyaml

然後導入到項目中:

import yaml

PyYAML 使你能夠存儲任何數據類型的 Python 對象,以及任何用戶定義類別的實例。

zip

給你支最後一招,非常酷。還在用兩個列表來組成一部詞典嗎?

keys = ['a', 'b', 'c']vals = [1, 2, 3]zipped = dict(zip(keys, vals))

zip() 內置函數使用多個可迭代對象作為輸入並返回元組列表。每個元組按位置索引對輸入對象的元素進行分組。

你也可以通過調用*zip() 來「解壓」對象。

原文連結:https://medium.freecodecamp.org/an-a-z-of-useful-python-tricks-b467524ee747

相關焦點

  • 你不知道的18個Python高效編程技巧
    python語言的高效編程技巧讓我們這些大學曾經苦逼學了四年c或者c++的人,興奮的不行不行的,終於解脫了。高級語言,如果做不到這樣,還扯啥高級呢?但是python不需要,只需一行,大家看清楚了>>>a,b=b,a>>>print(a)>>>6>>>ptint(b)>>>5
  • 你需要知道的10條Python實用技巧(值得收藏)
    如何在運行狀態查看原始碼?查看函數的原始碼,我們通常會使用 IDE 來完成。比如在 PyCharm 中,你可以 Ctrl + 滑鼠點擊 進入函數的原始碼。那如果沒有 IDE 呢?當我們想使用一個函數時,如何知道這個函數需要接收哪些參數呢?當我們在使用函數時出現問題的時候,如何通過閱讀原始碼來排查問題所在呢?
  • 掌握這10個python技巧,讓你代碼工作如魚得水!
    福布斯最新發布的一篇報告指出,python的使用量在去年增長了456%。Netfix、IBM以及其它數以百計的公司都在使用python。包括Dropbox也是由python創建的。Dice的研究表明,python是世界上最熱門的技巧之一,根據程式語言的流行度指數來看,python同時也是最受歡迎的程式語言。Python為何有如此大的魅力呢?
  • vs code配合Anaconda寫Python?掌握這些技巧讓數據分析事半功倍
    不僅如此,Anaconda內部conda管理工具以及jupyter notebook,這些工具已經可以滿足你在Python的數據領域中如虎添翼。Anaconda中使用圖界面管理python環境以及包管理如上圖,打開Anaconda Navigator主界面左邊選擇"Environments",即可看到你本機安裝的所有Python版本環境,這裡可以看到我本機又5個Python環境例如我現在希望在py37環境中安裝pandas庫,只要選中該環境,右上方選擇"Not installed",搜索中輸入pandas,下方勾選後
  • 入門Python,這些JupyterNotebook技巧就是你必須學的
    前言使用Python做數據相關工作,不能不提 JupyterNotebook 這個強大的工具,網絡上其實挺多相關的資料,只是相對而言比較分散,有些技巧可能對於初學者不太有用。光標在方法括號中,按住 shift 後,連續按 tab 鍵多次,次數越多,看到的文檔信息越詳細有人說,你這個技巧一點用都沒有!因為我連函數名字都拼寫不出來。我也經常遇到這種情況,但是這是有技巧的。
  • 11個技巧讓你編寫出更好的Python代碼
    前言在本教程中,我們將展示11個技巧來編寫更好的Python代碼!我們展示了許多最佳實踐,它們通過使代碼更加簡潔和更具python風格來改進代碼。如果不包含該項,則返回0。你應該知道,字符串是不可變的元素,所以這裡我們每次都要創建新的字符串。對於大型列表,此代碼可能非常慢,所以您應該立即忘記這種方法!
  • Python寫出漂亮Python 代碼的19條準則,你學會了嗎?
    用 Python 寫代碼時,個人也會遵循自己的風格。然而,當我們必須花大把時間來理解一個人的隱式代碼時,這項工作肯定不受歡迎,這種情況同樣可能發生在別人閱讀我們的代碼時。所以,讓我們聚焦 Python 之禪和一些改進技巧,從而解決問題。
  • iPhone這些隱藏代碼你肯定不知道
    每一部手機都有一些內置的隱藏代碼,也可以稱為指令,iPhone也不例外,但是這些代碼指令並不是給消費者平時使用的,而主要是工程師測試使用的。
  • 你可能不知道的 Python 技巧
    如果我們只想丟棄迭代器的開頭部分(在此例中是注釋),並且不知道有多少內容,那麼此方法很有用。例如,你不能將 IPv4Network 實例當成地址字符串——需要先使用 str 轉換它們。14、在Shell中調試程序崩潰如果你是一個拒絕使用 IDE,並在 Vim 或 Emacs 中進行編碼的人,那麼你可能會遇到這樣的情況:擁有在 IDE 中那樣的調試器會很有用。你知道嗎?
  • 代碼跑得慢甩鍋Python?手把手教你如何給代碼提速30%
    ~ $ time python3.8slow_program.pyreal0m11,058suser0m11,050ssys0m0,008s如果你只能直到整個程序的運行時間,這樣就夠了,但通常這還遠遠不夠。
  • 你可能不知道的 Python 技巧
    如果我們只想丟棄迭代器的開頭部分(在此例中是注釋),並且不知道有多少內容,那麼此方法很有用。你有一個——只要用python3.8 -i 運行你的程序——一旦你的程序終止了, -i 會啟動交互式 shell,在那你可以查看所有的變量和調用函數。整潔,但是使用實際的調試器(pdb )會如何呢?
  • Python2 已終結,入手Python 3,你需要這30個技巧
    使用 Python3如果你關注 Python 的話,應該會知道 Python 2 已經於今年(2020 年)1 月 1 日正式棄用了。這份教程的很多例子都是只支持 Python 3 的,如果你還在用 Python 2.1,那也是時候與時俱進了。2.
  • 讓你python代碼更快的3個小技巧
    今天呢,我們來聊一聊如何加速你的 python 代碼。Python 語言的優點可以列舉出許多,語法簡單易懂、模塊豐富、應用廣泛等等。但是世界上沒有有完美的東西,python 一個明顯缺點就是運行速度慢,至少跟 C 語言沒法比。所以,不安於現狀的 Pythoner 就開發了許多工具。
  • 編寫更簡潔的Python代碼的5個技巧
    更重要的是,從長遠來看,更簡潔的代碼往往更易於閱讀和維護。當然,有很多方法可以用Python編寫簡潔的代碼。 在本文中,我想分享五個技巧,這些技巧在日常Python項目中特別有用。 為了說明為什麼這些技巧可以提供更簡潔的解決方案,在每個部分中,為了比較目的,我都會提供替代的,通常更長的解決方案。
  • 太火了,這些牛逼的Java代碼技巧,肯定能讓你目瞪口呆
    開發工具不知道有多少」老」程式設計師還在使用 Eclipse,這些程式設計師們要不就是因循守舊,要不就是根本就不知道其他好的開發工具的存在,Eclipse 吃內存卡頓的現象以及各種偶然莫名異常的出現如果你還不理解我說的話,請看一下 Vaughn Vernon 出的一本叫做《IMPLEMENTING DOMAIN-DRIVEN DESIGN》(實現領域驅動設計)這本書,書中講解了貧血模型與領域模型的區別,相信你會受益匪淺。
  • 阿里達摩院給你整理一套2020超強的python書籍,電子檔請你帶走
    為什麼要選擇python?你可能不知道,AlphaGO都在使用python,他是最簡單寫出AI的語言,國家教育部在18年3月份發布,全國二級計算機考試正式加入了「python編程程序語言」科目。從2018年起,浙江省信息技術教材從vb改成python語言,python將成為未來的趨勢,不一定要從事python工作,但一定要學python!
  • Python代碼優化技巧和竅門
    Python代碼優化技巧和竅門1-分析你的代碼1.1. 使用timeit模塊1.2. 使用高級的cProfile分析1.2.1. 關於 cProfile 的結果說明?我們可以做很多事情來使我們的代碼更輕,更快。 它不僅僅是使用多進程等功能,而且還可以輕鬆實現。 下面,我們列出了一些最佳的Python代碼優化技巧和竅門。1-分析你的代碼如果您不了解你的代碼性能瓶頸所在,那麼在進一步優化代碼之前,這會顯得你很幼稚。
  • 分享一個python調試程序BUG的技巧,有誰會不出BUG呢
    由於這個程序代碼很少,所以大家很容易就看出來了。但是如果是幾百行的代碼,就很不容易找到錯誤的源頭,這就需要用input中斷程序,然後列印出可疑變量。之後,還要找出這個出錯的一行代碼,裡面用到了哪些變量,用到的這些變量就是可以變量。
  • 看了這篇文章你還不知道該怎麼學習python,那你來找我,我教你!
    相信有了解IT行業的朋友都知道,現在python是世界上主流程式語言top5,python在數據分析、雲計算系統管理、人工智慧等領域Python是當之無愧的第一語言,在web、遊戲腳本、機器人集物聯網開發領域也有不俗的表現,在最新的HackerRank開發人員技能報告中python又排到前五。
  • 出色代碼成就機器學習:數據科學的軟體工程技巧和最佳實踐
    這在python開發中是不好的做法,它限制了有效的代碼重用。由於筆記本電腦變成容納所有變量的大型狀態機,因此也會損害其可重複性。在這種配置下,必須記住要哪個結果被緩存,哪個結果沒有被緩存,還必須期望其他用戶遵循你的單元執行順序。· 筆記本在後臺格式化的方式(JSON對象)使代碼版本控制變得困難。