一文帶您掌握十個(gè)強(qiáng)大的Python內(nèi)置函數(shù)
我們經(jīng)常有這樣的經(jīng)歷:花了很長(zhǎng)時(shí)間編寫和調(diào)試一個(gè)特定功能的函數(shù),卻發(fā)現(xiàn)Python已經(jīng)有類似的內(nèi)置函數(shù)。我們常常在重復(fù)造輪子。Python包含了許多強(qiáng)大的內(nèi)置函數(shù),使用這些函數(shù)來(lái)簡(jiǎn)化代碼可以為我們節(jié)省寶貴的時(shí)間。
接下來(lái),我們將介紹一些我們經(jīng)常忽略的強(qiáng)大Python內(nèi)置函數(shù)。
ZIP_Longest
合并不同大小的可迭代對(duì)象。Python中的zip_longest()函數(shù)來(lái)自itertools模塊,允許你將多個(gè)長(zhǎng)度不同的可迭代對(duì)象進(jìn)行合并。與zip()不同,后者會(huì)在最短的可迭代對(duì)象處停止,zip_longest()會(huì)一直合并,直到最長(zhǎng)的可迭代對(duì)象耗盡,缺失的值會(huì)用指定的fillvalue填充(默認(rèn)為None)。
- 處理不等長(zhǎng)的可迭代對(duì)象:在處理長(zhǎng)度不同的可迭代對(duì)象時(shí)非常有用,確保由于尺寸不均而沒(méi)有數(shù)據(jù)丟失。
- 允許自定義填充:fillvalue參數(shù)允許你指定如何處理缺失值,這為合并來(lái)自多個(gè)來(lái)源的數(shù)據(jù)提供了靈活性。
zip_longest()函數(shù)可以用于:
- 合并來(lái)自多個(gè)來(lái)源的數(shù)據(jù),尤其是長(zhǎng)度不均勻的數(shù)據(jù)。
- 比較沒(méi)有直接關(guān)聯(lián)的數(shù)據(jù)點(diǎn)。
- 處理不等維度的矩陣或網(wǎng)格。
from itertools import zip_longest
list1 = [1, 2, 3]
list2 = ['a', 'b']
list3 = ['X', 'Y', 'Z', 'W']
result = list(zip_longest(list1, list2, list3))
print(result)
result = list(zip_longest(list1, list2, list3, fillvalue='-'))
print(result)
圖片
Divmod
divmod(a, b)函數(shù)返回一個(gè)包含商和余數(shù)的元組,當(dāng)將a除以b時(shí)。它是a // b(商)和a % b(余數(shù))的組合形式。
這個(gè)函數(shù)在需要同時(shí)得到商和余數(shù)的情況下非常實(shí)用。它通過(guò)一步操作代替了兩個(gè)獨(dú)立的操作(整數(shù)除法和取模),從而減少了開銷。
divmod()在以下場(chǎng)景中非常有用:
- 當(dāng)你需要將秒轉(zhuǎn)換為分鐘和秒,小時(shí)轉(zhuǎn)換為分鐘和小時(shí)等時(shí),divmod()可以快速計(jì)算這兩個(gè)值。
- 計(jì)算貨幣分解,例如將總金額分解為較大的面額和較小的零錢。
a = 20
b = 6
result = divmod(a, b)
print(result)
quotient, remainder = result
print(f"Quotient: {quotient}, Remainder: {remainder}")
圖片
Compile
將代碼編譯為字節(jié)碼,快速而簡(jiǎn)潔。Python中的compile()函數(shù)將源代碼編譯為可以稍后執(zhí)行的代碼對(duì)象。它允許你將一段Python代碼字符串轉(zhuǎn)換為代碼對(duì)象,然后可以將其傳遞給exec()或eval()進(jìn)行執(zhí)行。
圖片
compile()函數(shù)允許你動(dòng)態(tài)執(zhí)行存儲(chǔ)在字符串中的Python代碼,這在一些高級(jí)用例中非常有用,例如模板引擎、REPL系統(tǒng)或動(dòng)態(tài)生成代碼時(shí)。
code_string = '3 * 4 + 5'
compiled_code = compile(code_string, '<string>', 'eval')
print(compiled_code)
result = eval(compiled_code)
print(result)
圖片
Bytearray
創(chuàng)建和修改字節(jié)序列。bytearray()函數(shù)創(chuàng)建一個(gè)可變的字節(jié)序列,它是字節(jié)數(shù)據(jù)的靈活表示形式。與不可變的bytes不同,bytearray允許修改,適用于需要操作或更新字節(jié)數(shù)據(jù)的場(chǎng)景。
圖片
bytearray允許修改,適用于需要?jiǎng)討B(tài)構(gòu)建或更改字節(jié)數(shù)據(jù)的場(chǎng)景。在處理文件、網(wǎng)絡(luò)協(xié)議或流中的二進(jìn)制數(shù)據(jù)時(shí),它非常有用,尤其是在需要頻繁修改的情況下。
data = bytearray("Hello, World!", "utf-8")
print(data)
data[7:12] = b'Python'
print(data)
圖片
Repr
查看對(duì)象背后的代碼。Python中的repr()函數(shù)返回對(duì)象的字符串表示形式,理想情況下可以使用eval()函數(shù)重新創(chuàng)建該對(duì)象。它提供對(duì)象的正式字符串表示,適用于調(diào)試和日志記錄。
圖片
number = 42
string = "Hello, World!"
list_obj = [1, 2, 3]
print(repr(number))
print(repr(string))
print(repr(list_obj))
圖片
Memoryview
輕松實(shí)現(xiàn)直接內(nèi)存訪問(wèn)。Python中的memoryview()函數(shù)創(chuàng)建一個(gè)內(nèi)存視圖對(duì)象,允許你訪問(wèn)支持緩沖區(qū)協(xié)議的對(duì)象的內(nèi)部數(shù)據(jù),而無(wú)需復(fù)制數(shù)據(jù)。這在高效處理大數(shù)據(jù)集時(shí)特別有用,因?yàn)樗试S對(duì)數(shù)據(jù)的切片進(jìn)行操作。
圖片
memoryview()通過(guò)允許直接訪問(wèn)對(duì)象的底層內(nèi)存,避免了復(fù)制數(shù)據(jù)的開銷。在科學(xué)計(jì)算或數(shù)據(jù)分析中,處理大型數(shù)組或緩沖區(qū)非常常見,memoryview()可以通過(guò)減少內(nèi)存使用大大提升性能。
data = bytearray(b"Hello, World!")
mv = memoryview(data)
print(mv[0:5].tobytes())
圖片
Property
集成getter、setter和deleter于一體。property()函數(shù)是一個(gè)內(nèi)置函數(shù),它創(chuàng)建并返回一個(gè)屬性對(duì)象,這是一種特殊的屬性類型,允許對(duì)對(duì)象屬性進(jìn)行管理式訪問(wèn)。屬性支持為屬性定義getter、setter和deleter方法,促進(jìn)了封裝和數(shù)據(jù)隱藏。
圖片
- 封裝:允許控制屬性的訪問(wèn)和修改方式,支持驗(yàn)證和日志記錄。
- 惰性計(jì)算:支持屬性的惰性計(jì)算,只有在訪問(wèn)時(shí)才計(jì)算其值。
當(dāng)你希望對(duì)屬性的修改施加規(guī)則時(shí),property()非常有用。
class Circle:
def __init__(self, radius):
self._radius = radius
@property
def radius(self):
"""The radius property."""
return self._radius
@radius.setter
def radius(self, value):
if value < 0:
raise ValueError("Radius cannot be negative")
self._radius = value
@property
def area(self):
"""The area property."""
return 3.14159 * (self._radius ** 2)
circle = Circle(5)
print(circle.radius)
circle.radius = 10
print(circle.area)
try:
circle.radius = -5
except ValueError as e:
print(e)
圖片
Frozensets
用于高效操作的不可變集合。frozenset()函數(shù)返回一個(gè)不可變的集合對(duì)象,意味著一旦創(chuàng)建,其元素?zé)o法被更改(添加或刪除)。這允許創(chuàng)建可用于字典鍵或存儲(chǔ)在其他集合中的集合。
以下是一些使用此函數(shù)的場(chǎng)景:
- 當(dāng)你需要一個(gè)在其生命周期內(nèi)不應(yīng)更改的集合時(shí)。
- 作為字典中的鍵,以確保項(xiàng)目的唯一性。
- 由于frozenset是不可變的,它們可以用作字典的鍵。
my_frozenset = frozenset([1, 2, 3, 4, 5])
print(my_frozenset)
my_frozenset.add(6)
圖片
Callable
callable()是Python中的一個(gè)內(nèi)置函數(shù),用于檢查一個(gè)對(duì)象是否可調(diào)用。callable()通過(guò)在調(diào)用之前驗(yàn)證對(duì)象是否可調(diào)用,防止運(yùn)行時(shí)錯(cuò)誤。當(dāng)處理可能在運(yùn)行時(shí)被調(diào)用的對(duì)象時(shí),特別是在復(fù)雜的應(yīng)用中,函數(shù)、lambda表達(dá)式或?qū)ο罂赡軙?huì)被傳遞和互換使用,callable()非常有用。
這個(gè)內(nèi)置函數(shù)適用于以下情況——當(dāng)函數(shù)、lambda表達(dá)式或?qū)ο罂赡芑Q使用時(shí),callable()可以幫助驗(yàn)證它們是否可以被調(diào)用。
圖片
還可以通過(guò)定義__call__()方法,使自定義類的實(shí)例變得可調(diào)用。
class Dog:
def __call__(self, sound):
return f"The dog says {sound}"
dog = Dog()
print(callable(dog))
print(dog("woof"))
圖片
在這里,Dog類通過(guò)實(shí)現(xiàn)__call__()方法變得可調(diào)用。dog實(shí)例表現(xiàn)得像一個(gè)函數(shù),允許你直接向其傳遞參數(shù)。
dis
Python中的dis模塊提供了用于反匯編Python字節(jié)碼的函數(shù),這對(duì)于理解Python如何執(zhí)行代碼以及調(diào)試非常有用。這個(gè)模塊使開發(fā)者能夠查看Python執(zhí)行的低級(jí)操作。它還可以通過(guò)檢查字節(jié)碼來(lái)幫助識(shí)別性能瓶頸。
import dis
def fibonacci(n):
if n <= 1:
return n
else:
return fibonacci(n-1) + fibonacci(n-2)
dis.dis(fibonacci)
將輸出fibonacci的字節(jié)碼指令,顯示Python執(zhí)行該函數(shù)時(shí)所執(zhí)行的操作。
圖片
Python的內(nèi)置函數(shù)顯著提升了開發(fā)效率。常用函數(shù)包括:
- zip_longest():合并不等長(zhǎng)的可迭代對(duì)象,避免數(shù)據(jù)丟失。
- divmod():同時(shí)獲取商和余數(shù),簡(jiǎn)化計(jì)算。
- compile():動(dòng)態(tài)執(zhí)行代碼。
- bytearray():處理可變字節(jié)序列,適合頻繁修改的場(chǎng)景。
- memoryview():提供高效的內(nèi)存訪問(wèn)。
- property():支持?jǐn)?shù)據(jù)封裝與訪問(wèn)控制。
- frozenset():創(chuàng)建不可變集合,適用于字典鍵。
- callable():檢查對(duì)象是否可調(diào)用。
- dis模塊:幫助理解字節(jié)碼,識(shí)別性能瓶頸。
合理利用這些函數(shù)可以提升代碼的簡(jiǎn)潔性和可讀性。