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