譯者 | 晶顏
審校 | 重樓
一些奇特的Python函數(shù)初看似乎毫無(wú)意義,但當(dāng)真正了解其用途后,便會(huì)發(fā)現(xiàn)它們極具價(jià)值。
若你長(zhǎng)期使用Python,想必對(duì)其極為龐大的標(biāo)準(zhǔn)庫(kù)并不陌生,該標(biāo)準(zhǔn)庫(kù)極大地提升了開(kāi)發(fā)的效率與便捷性。諸如json、datetime和re等熱門(mén)模塊備受開(kāi)發(fā)者關(guān)注,但其中還有一些鮮為人知的函數(shù)卻常常被忽視。
本文將探討其中部分函數(shù),這些函數(shù)在一些人眼中是“無(wú)用的”,實(shí)則不然。它們具備一些獨(dú)特而奇異的功能,初遇時(shí)可能會(huì)讓人疑惑“誰(shuí)會(huì)需要這些功能”,但在實(shí)際開(kāi)發(fā)中,某一天你或許就會(huì)發(fā)現(xiàn),它們恰好能夠解決你所面臨的特定問(wèn)題。
接下來(lái),讓我們一同深入了解這些實(shí)用性極強(qiáng)的函數(shù)。
1.textwrap.dedent()-整理繁雜的多行字符串
在使用Python編寫(xiě)多行字符串時(shí),你是否曾因縮進(jìn)問(wèn)題而感到困擾?若有,textwrap.dedent函數(shù)將是你的得力助手。
以下是使用textwrap模塊的代碼示例,該函數(shù)能夠去除源代碼中縮進(jìn)的多行字符串的額外縮進(jìn),從而得到無(wú)前導(dǎo)空格的整潔文本:
import textwrap
def my_function():
# Without dedent, this would preserve all the leading spaces
description = textwrap.dedent("""
This is a multi-line string
that will have consistent indentation
regardless of how it's indented in the code.
Pretty neat, right?
""").strip()
return description
print(my_function())
輸出結(jié)果:
這是一個(gè)多行字符串,無(wú)論它在代碼中如何縮進(jìn),都將具有一致的縮進(jìn)。很簡(jiǎn)潔,對(duì)吧?
2.difflib.get_close_matches()-輕松實(shí)現(xiàn)模糊字符串匹配
在實(shí)際開(kāi)發(fā)中,有時(shí)需要找出字符串之間的相似之處,或者實(shí)現(xiàn)“你的意思是什么?”之類(lèi)的功能,此時(shí)就可以用到difflib模塊中的get_close_matches函數(shù)。
以下是幾個(gè)使用該函數(shù)的示例:
import difflib
words = ["python", "javascript", "typescript", "ruby", "golang"]
search = "pythn"
matches = difflib.get_close_matches(search, words, n=3, cutoff=0.6)
print(f"Did you mean: {matches}")
輸出結(jié)果:
你的意思是:
['python']
search = "typescript"
matches = difflib.get_close_matches(search, words)
print(f"Matches: {matches}")
輸出結(jié)果:
['typescript', 'javascript']
上述第一個(gè)示例在編程語(yǔ)言列表中查找與“python”最接近的匹配項(xiàng);第二個(gè)示例則展示了與“typescript”接近的匹配結(jié)果,包括“typescript”和“javascript”。
該函數(shù)在開(kāi)發(fā)命令行工具、搜索功能,或任何需要處理拼寫(xiě)錯(cuò)誤及近似匹配的場(chǎng)景中,都具有重要的應(yīng)用價(jià)值。
3.uuid.uuid4()-生成確保唯一的ID
當(dāng)需要唯一標(biāo)識(shí)符,且無(wú)需借助數(shù)據(jù)庫(kù),同時(shí)也不必?fù)?dān)心標(biāo)識(shí)符沖突時(shí),可使用uuid模塊中的函數(shù)。
通過(guò)調(diào)用uuid.uuid4()函數(shù)能夠創(chuàng)建一個(gè)隨機(jī)的UUID對(duì)象,該對(duì)象可用作唯一標(biāo)識(shí)符,示例如下:
import uuid
# Generate a random UUID
random_id = uuid.uuid4()
print(f"Unique ID: {random_id}")
輸出結(jié)果:
唯一ID: fc4c6638-9707-437b-83a1-76206b5f7191
下面的示例展示了如何將UUID應(yīng)用于文件名,以確保文件名的唯一性:
# Use as string for filenames, database keys, etc.
filename = f"document-{uuid.uuid4()}.pdf"
print(filename)
輸出結(jié)果:
文檔- b5ccbe7a fad9 - 4611 - 8163 - be1015c634b9.pdf
UUID(通用唯一標(biāo)識(shí)符)具備極高的唯一性保障,即便在不同機(jī)器、不同時(shí)間生成,也不會(huì)出現(xiàn)重復(fù)情況。這一特性使其非常適用于為文件、數(shù)據(jù)庫(kù)條目,以及其他任何對(duì)唯一性有要求的場(chǎng)景生成ID。
4.shutil.get_terminal_size()-響應(yīng)式CLI應(yīng)用程序
如果期望命令行應(yīng)用程序能夠適配用戶(hù)終端的尺寸,shutil.get_terminal_size函數(shù)能夠輕松達(dá)成這一目標(biāo)。使用方式如下:
import shutil
columns, rows = shutil.get_terminal_size()
print(f"Your terminal is {columns} columns wide and {rows} rows tall")
# Create a horizontal divider that fits perfectly
print("-" * columns)
上述代碼可獲取當(dāng)前終端的列數(shù)與行數(shù),并據(jù)此創(chuàng)建一個(gè)寬度恰好與終端寬度一致的水平分隔符。例如,若終端為80列寬、24行高,則會(huì)輸出相應(yīng)尺寸信息,并生成80個(gè)“-”組成的水平分隔符。
5.itertools.groupby()-無(wú)需字典即可高效分組數(shù)據(jù)
當(dāng)需要依據(jù)特定鍵對(duì)數(shù)據(jù)進(jìn)行分組時(shí),itertools.groupby()函數(shù)提供了高效的解決方案。
以員工數(shù)據(jù)分組為例,需先按部門(mén)對(duì)員工列表進(jìn)行排序(這是groupby函數(shù)正常工作的必要前提),隨后便可按部門(mén)進(jìn)行分組并輸出結(jié)果:
from itertools import groupby
from operator import itemgetter
# Sample data: (name, department)
employees = [
("Alice", "Engineering"),
("Bob", "Marketing"),
("Charlie", "Engineering"),
("Diana", "HR"),
("Evan", "Marketing"),
]
# Sort by department first (groupby works on consecutive items)
employees.sort(key=itemgetter(1))
# Group by department
for department, group in groupby(employees, key=itemgetter(1)):
print(f"\n{department} Department:")
for name, _ in group:
print(f" - {name}")
輸出結(jié)果:
工程部:
——愛(ài)麗絲
——查理
人力資源部:
——戴安娜
市場(chǎng)部:
——鮑勃
——埃文
6.collections.ChainMap-無(wú)開(kāi)銷(xiāo)地合并字典
在需要對(duì)多個(gè)字典進(jìn)行搜索操作時(shí),collections模塊中的ChainMap類(lèi)能夠讓用戶(hù)按順序查看字典內(nèi)容,而無(wú)需實(shí)際進(jìn)行字典合并。
注意:盡管它并非函數(shù),但依然是Python標(biāo)準(zhǔn)庫(kù)中極具實(shí)用價(jià)值的類(lèi)。
以下為實(shí)際應(yīng)用示例:
from collections import ChainMap
defaults = {"theme": "dark", "language": "en", "timeout": 30}
user_settings = {"theme": "light"}
session_settings = {"timeout": 60}
# Create a combined view of all settings
settings = ChainMap(session_settings, user_settings, defaults)
print(settings["theme"])
print(settings["language"])
print(settings["timeout"])
上述代碼將創(chuàng)建一個(gè)包含多個(gè)字典的視圖,該視圖會(huì)按順序查找所需的值,無(wú)需合并字典,從而實(shí)現(xiàn)對(duì)不同來(lái)源設(shè)置的優(yōu)先級(jí)排序展示。
輸出結(jié)果:
light
en
60
7.os.path.commonpath()-查找共享目錄路徑
當(dāng)需要找出多個(gè)文件路徑之間的公共目錄時(shí),os模塊中的path.commonpath函數(shù)可滿(mǎn)足這一需求。通過(guò)該函數(shù),能夠從文件路徑列表中識(shí)別出最長(zhǎng)的公共目錄路徑,用于確定一組文件的基礎(chǔ)目錄。具體操作如下:
import os.path
paths = [
"/home/user/documents/work/report.pdf",
"/home/user/documents/personal/taxes.xlsx",
"/home/user/documents/work/presentation.pptx"
]
common = os.path.commonpath(paths)
print(f"Common directory: {common}")
輸出結(jié)果:
公共目錄:/home/user/documents
綜上所述,os.path.commonpath()函數(shù)在諸如查找一組文件的公共根目錄、構(gòu)建相對(duì)路徑等實(shí)際任務(wù)中,展現(xiàn)出極高的便捷性與實(shí)用性。
結(jié)語(yǔ)
通過(guò)上述示例不難發(fā)現(xiàn),Python標(biāo)準(zhǔn)庫(kù)中存在諸多功能獨(dú)特的函數(shù)。盡管這些函數(shù)在日常編程中使用頻率相對(duì)較低,但針對(duì)特定場(chǎng)景與問(wèn)題,它們能夠提供簡(jiǎn)潔、高效且優(yōu)雅的解決方案,充分彰顯了Python標(biāo)準(zhǔn)庫(kù)的豐富性與強(qiáng)大功能。
在編程實(shí)踐過(guò)程中,當(dāng)開(kāi)發(fā)者著手編寫(xiě)復(fù)雜函數(shù)以解決看似常見(jiàn)的問(wèn)題前,不妨先深入查閱Python標(biāo)準(zhǔn)庫(kù)?;蛟S其中已存在現(xiàn)成的解決方案,如此不僅能夠節(jié)省開(kāi)發(fā)時(shí)間,還能提升代碼的質(zhì)量與規(guī)范性。
此外,Python標(biāo)準(zhǔn)庫(kù)中還有許多鮮為人知卻極具價(jià)值的函數(shù),值得大家去挖掘。
原文標(biāo)題:7 “Useless” Python Standard Library Functions You Should Know,作者:Bala Priya C