在 Python 編程世界里,代碼的簡潔性與可讀性至關重要。簡潔優雅的代碼不僅便于自己后期維護,也能讓其他開發者快速理解邏輯。而 Python 豐富的內置函數和一些實用的第三方庫函數,就是實現這一目標的有力武器。接下來,就為大家介紹幾個能讓代碼“脫胎換骨”的函數,助力寫出簡潔又優雅的代碼。
?
?
一、?map? 函數:批量操作元素
?
?map? 函數接收兩個參數,一個是函數,一個是可迭代對象(比如列表、元組等 ),它會將傳入的函數依次作用到可迭代對象的每個元素上,返回一個新的迭代器。
?
場景示例:列表元素平方
?
如果要對一個列表 ?nums = [1, 2, 3, 4]? 中的每個元素求平方,常規的 ?for? 循環寫法是這樣:
?
nums = [1, 2, 3, 4]
result = []
for num in nums:
? ? result.append(num ** 2)
print(result)??
?
?
用 ?map? 函數則簡潔很多:
?
nums = [1, 2, 3, 4]
result = map(lambda x: x ** 2, nums)
# 轉為列表查看結果,實際使用中若后續迭代可直接用迭代器
print(list(result))??
?
?
這里利用 ?lambda? 匿名函數配合 ?map?,一行代碼就完成了對列表所有元素的平方操作,省去了手動初始化空列表、寫循環體的步驟,代碼更緊湊。
?
二、?filter? 函數:精準篩選元素
?
?filter? 函數同樣接收函數和可迭代對象作為參數,傳入的函數需返回布爾值,它會篩選出可迭代對象中使函數返回 ?True? 的元素,返回一個迭代器。
?
場景示例:篩選列表中的偶數
?
對于列表 ?nums = [1, 2, 3, 4, 5, 6]?,要篩選出其中的偶數,常規循環:
?
nums = [1, 2, 3, 4, 5, 6]
result = []
for num in nums:
? ? if num % 2 == 0:
? ? ? ? result.append(num)
print(result)??
?
?
用 ?filter? 函數:
?
nums = [1, 2, 3, 4, 5, 6]
result = filter(lambda x: x % 2 == 0, nums)
print(list(result))??
?
?
借助 ?filter? ,把篩選邏輯(判斷是否為偶數 )提煉成函數(這里用 ?lambda? ),直接篩選出符合條件的元素,代碼邏輯清晰又簡潔。
?
三、?zip? 函數:高效聚合多個可迭代對象
?
?zip? 函數能將多個可迭代對象中對應位置的元素打包成元組,返回一個迭代器。當你需要同時遍歷多個可迭代對象,取出對應位置元素進行操作時,它非常好用。
?
場景示例:合并兩個列表對應元素
?
有兩個列表 ?names = ["Alice", "Bob"]?,?ages = [20, 25]?,要將姓名和年齡一一對應合并,常規思路可能用索引遍歷:
?
names = ["Alice", "Bob"]
ages = [20, 25]
result = []
for i in range(len(names)):
? ? result.append((names[i], ages[i]))
print(result)??
?
?
用 ?zip? 函數:
?
names = ["Alice", "Bob"]
ages = [20, 25]
result = zip(names, ages)
print(list(result))??
?
?
?zip? 自動幫我們把對應位置元素配對,代碼簡潔直觀,尤其當可迭代對象數量更多時,優勢更明顯,比如三個列表 ?a = [1,2]?, ?b = [3,4]?, ?c = [5,6]? ,?zip(a,b,c)? 能輕松打包成 ?[(1,3,5),(2,4,6)]? 這樣的形式。
?
四、?enumerate? 函數:遍歷帶索引
?
在遍歷可迭代對象時,有時需要同時獲取元素的索引和元素本身。?enumerate? 函數就可以在遍歷過程中,為每個元素配上其索引,返回一個枚舉對象(迭代器 )。
?
場景示例:遍歷列表并獲取索引
?
對于列表 ?fruits = ["apple", "banana", "orange"]?,要打印出“索引:元素”的形式,常規做法:
?
fruits = ["apple", "banana", "orange"]
index = 0
for fruit in fruits:
? ? print(f"{index}: {fruit}")
? ? index += 1
?
?
用 ?enumerate? 函數:
?
fruits = ["apple", "banana", "orange"]
for index, fruit in enumerate(fruits):
? ? print(f"{index}: {fruit}")
?
?
?enumerate? 自動處理了索引的遞增,代碼更簡潔,也避免了手動管理索引變量可能出現的錯誤,讓遍歷帶索引的場景變得輕松。
?
五、?collections.defaultdict?:便捷處理字典默認值
?
在使用普通字典 ?dict? 時,如果訪問不存在的鍵,會拋出 ?KeyError? 異常。而 ?collections? 模塊里的 ?defaultdict? ,可以指定一個默認工廠函數,當訪問不存在的鍵時,會自動用默認工廠函數生成對應的值。
?
場景示例:統計列表中各元素出現次數(常規字典對比 )
?
常規字典統計列表 ?words = ["apple", "banana", "apple"]? 中單詞出現次數:
?
words = ["apple", "banana", "apple"]
count_dict = {}
for word in words:
? ? if word in count_dict:
? ? ? ? count_dict[word] += 1
? ? else:
? ? ? ? count_dict[word] = 1
print(count_dict)??
?
?
用 ?defaultdict?:
?
from collections import defaultdict
words = ["apple", "banana", "apple"]
count_dict = defaultdict(int) # int 作為默認工廠函數,調用 int() 得到 0
for word in words:
? ? count_dict[word] += 1
print(dict(count_dict))??
?
?
?defaultdict? 幫我們省去了判斷鍵是否存在的步驟,直接對鍵進行操作即可,在處理一些需要默認值的字典場景時,讓代碼簡潔又高效。
?
六、?functools.lru_cache?:緩存優化遞歸或重復計算
?
對于一些遞歸函數或者會重復計算相同參數結果的函數,?functools? 模塊里的 ?lru_cache? 裝飾器可以緩存函數的調用結果,當再次以相同參數調用函數時,直接返回緩存的結果,避免重復計算,提升效率,同時也能讓代碼更簡潔(無需手動實現緩存邏輯 )。
?
場景示例:計算斐波那契數列(遞歸優化 )
?
常規遞歸計算斐波那契數列(存在大量重復計算 ):
?
def fibonacci(n):
? ? if n <= 1:
? ? ? ? return n
? ? return fibonacci(n - 1) + fibonacci(n - 2)
# 計算 fibonacci(30) 時會有很多重復計算
print(fibonacci(30))??
?
?
用 ?lru_cache? 裝飾器優化:
?
from functools import lru_cache
?
@lru_cache(maxsize=None) # maxsize=None 表示緩存無限大
def fibonacci(n):
? ? if n <= 1:
? ? ? ? return n
? ? return fibonacci(n - 1) + fibonacci(n - 2)
?
print(fibonacci(30))??
?
?
加上 ?lru_cache? 后,函數自動緩存了計算結果,后續相同參數調用直接取緩存,大大提升了遞歸效率,代碼上也只是添加一個裝飾器,簡潔又實用。
?
七、這些 Python 函數(包括內置函數和部分庫函數 ),從數據處理的批量操作、篩選、聚合,到遍歷優化、字典便捷處理,再到函數計算優化,覆蓋了多種常見編程場景。合理運用它們,能讓代碼擺脫繁瑣的循環、條件判斷等冗余結構,變得更加簡潔優雅,同時也能提升代碼的執行效率和可讀性。當然,Python 中還有很多其他好用的函數和特性,大家在日常編程中可以不斷探索挖掘,讓自己的代碼越來越“Pythonic” ,寫出更優質的程序。
?