Python常用高階函數全面解析:通俗易懂的指南

Python常用高階函數全面解析:通俗易懂的指南

一、什么是高階函數?

高階函數(Higher-order Function)是指能夠接受其他函數作為參數,或者將函數作為返回值的函數。在Python中,函數是一等公民,可以像普通變量一樣傳遞和使用。

簡單理解:高階函數就是把函數當玩具的函數——可以接收函數、可以返回函數、可以把函數傳來傳去。

二、Python五大常用高階函數

Python中最常用的高階函數有五個,它們都來自functools模塊或內置函數:

高階函數作用返回值常用場景
map()對序列中每個元素應用函數迭代器數據轉換
filter()過濾序列中符合條件的元素迭代器數據篩選
reduce()累積計算序列元素單個結果聚合計算
sorted()排序序列新列表數據排序
裝飾器修改或增強函數功能包裝后的函數功能擴展

下面我們逐個詳細講解。

1. map()函數:批量處理器

作用:

對可迭代對象的每個元素應用指定函數,返回一個包含所有結果的新迭代器(Python 3 中返回 map 對象,需轉為列表顯示)。

語法:
map(function, iterable, ...)
  • function:處理函數(可以是內置函數、lambda 或自定義函數)
  • iterable:可迭代對象(如列表、元組)
示例:
① 對列表元素平方
nums = [1, 2, 3, 4]
squared = map(lambda x: x**2, nums)
print(list(squared))  # 輸出: [1, 4, 9, 16]
② 多參數函數處理
def add(a, b):return a + blist1 = [1, 2, 3]
list2 = [4, 5, 6]
result = map(add, list1, list2)
print(list(result))  # 輸出: [5, 7, 9]
特點:
  • 不修改原數據,生成新結果
  • 可同時處理多個可迭代對象(要求函數能接收對應數量的參數)
  • 適合統一轉換場景(如類型轉換、數學運算)
map()工作原理:
原始序列: [1, 2, 3, 4]↓ map(函數)
新序列: [函數(1), 函數(2), 函數(3), 函數(4)]

2. filter()函數:數據過濾器

作用:

篩選可迭代對象中滿足條件的元素,返回一個包含所有符合條件元素的新迭代器(Python 3 中返回 filter 對象)。

語法:
filter(function, iterable)
  • function:判斷函數(返回 True/False,若為 None 則直接過濾掉“假值”)
  • iterable:可迭代對象
示例:
① 篩選偶數
nums = [1, 2, 3, 4, 5]
evens = filter(lambda x: x % 2 == 0, nums)
print(list(evens))  # 輸出: [2, 4]
② 過濾空字符串
words = ["hello", "", "world", None, " "]
valid = filter(None, words)  # 過濾掉 bool(value) 為 False 的元素
print(list(valid))  # 輸出: ['hello', 'world', ' ']
特點:
  • 保留原元素,只做篩選
  • 適合條件過濾場景(如數據清洗、有效性檢查)

filter()工作原理:
原始序列: [1, 2, 3, 4, 5, 6]↓ filter(條件函數)
新序列: [2, 4, 6]  # 只保留使函數返回True的元素

3. reduce()函數:累積計算器

作用:

對可迭代對象中的元素進行累積計算,通過指定的二元函數從左到右依次處理元素,最終返回一個單一的累積結果

語法:
from functools import reduce  # Python 3 需從模塊導入reduce(function, iterable[, initializer])
  • function:二元函數(接收兩個參數,返回一個結果)。
  • iterable:可迭代對象(如列表、元組)。
  • initializer(可選):初始值,若提供則作為第一個計算的左參數。
核心邏輯:
  1. 從可迭代對象中依次取出兩個元素,傳遞給 function 計算。
  2. 將計算結果與下一個元素繼續傳遞給 function,直到所有元素處理完畢。
  3. 返回最終結果。
示例:
① 計算列表元素的乘積
from functools import reducenums = [1, 2, 3, 4]
product = reduce(lambda x, y: x * y, nums)
print(product)  # 輸出: 24 (1 * 2 * 3 * 4)
② 拼接字符串(帶初始值)
words = ["Hello", "World", "!"]
sentence = reduce(lambda x, y: f"{x} {y}", words, "Say:")
print(sentence)  # 輸出: "Say: Hello World !"
③ 模擬 sum() 功能
nums = [10, 20, 30]
total = reduce(lambda x, y: x + y, nums)
print(total)  # 輸出: 60
特點:
  • 必須導入 functools(Python 3 中不再是內置函數)。
  • 適合需要逐步累積的場景(如累加、累乘、最大值/最小值)。
  • 可指定初始值(避免空列表報錯)。
reduce()工作原理:
初始值(可選) + 序列: [a, b, c, d]↓ reduce(函數)
計算過程: 函數(函數(函數(a, b), c), d)

4. sorted()函數:智能排序器

作用:

對可迭代對象進行排序,返回一個新的排序后的列表(原數據不變)。

語法:
sorted(iterable, *, key=None, reverse=False)
  • iterable:可迭代對象(如列表、字典鍵、字符串)。
  • key:排序依據的函數(高階函數用法)。
  • reverse:是否降序(默認 False 升序)。
核心邏輯:
  1. 根據 key 函數處理每個元素,生成排序依據的臨時值。
  2. 按臨時值比較排序。
  3. 返回排序后的新列表。
示例:
① 基本排序(數字/字符串)
nums = [3, 1, 4, 2]
print(sorted(nums))          # 輸出: [1, 2, 3, 4]
print(sorted(nums, reverse=True))  # 輸出: [4, 3, 2, 1]words = ["banana", "apple", "cherry"]
print(sorted(words))         # 按字母順序: ['apple', 'banana', 'cherry']
② 使用 key 自定義排序規則
# 按字符串長度排序
words = ["apple", "banana", "cherry"]
print(sorted(words, key=lambda x: len(x)))  # 輸出: ['apple', 'banana', 'cherry']# 按字典的某個鍵排序
students = [{"name": "Alice", "age": 25},{"name": "Bob", "age": 20}
]
print(sorted(students, key=lambda x: x["age"]))  
# 輸出: [{'name': 'Bob', 'age': 20}, {'name': 'Alice', 'age': 25}]
③ 多級排序(元組 key
# 先按長度,長度相同按字母逆序
words = ["apple", "banana", "cherry", "date"]
print(sorted(words, key=lambda x: (len(x), -ord(x[0]))))
# 輸出: ['date', 'apple', 'cherry', 'banana']
特點:
  • 返回新列表,原數據不變(與 list.sort() 方法不同)。
  • key 參數支持復雜排序邏輯(高階函數核心用途)。
  • 支持所有可迭代對象(甚至生成器)。
sorted()關鍵參數:
  • key:指定一個函數,這個函數會作用于每個元素,然后根據函數返回的結果進行排序
  • reverse:排序規則,True降序,False升序(默認)

5. 裝飾器:函數的化妝師

在 Python 中,裝飾器(Decorator) 是一種高階函數,它的核心作用是在不修改原函數或類代碼的前提下,動態地增強或修改其功能。裝飾器通過 @ 語法糖實現,是 Python 最強大的特性之一,廣泛應用于日志記錄、權限驗證、性能分析等場景。

作用:
1. 功能增強
  • 不侵入原代碼:無需修改函數/類內部邏輯,即可添加新功能(如日志、計時、緩存等)。
  • 代碼復用:將通用功能(如權限檢查)抽象為裝飾器,避免重復代碼。
2. 行為修改
  • 控制訪問:限制函數調用(如登錄驗證、API 限流)。
  • 修改返回值:對函數返回結果進行二次處理(如數據格式化)。
3. 元編程
  • 動態注冊:自動注冊函數到框架(如 Flask 路由 @app.route)。
  • AOP(面向切面編程):分離核心邏輯與橫切關注點(如事務管理)。
語法:

裝飾器本質上是一個接收函數/類作為參數,并返回修改后的函數/類的可調用對象。其底層實現基于閉包和高階函數。

def decorator(func):          # 1. 接收目標函數def wrapper(*args, **kwargs):  # 3. 定義增強邏輯# 前置增強(如權限檢查)result = func(*args, **kwargs)  # 4. 調用原函數# 后置增強(如日志記錄)return resultreturn wrapper            # 2. 返回包裝后的函數@decorator  # 等價于 func = decorator(func)
def func():pass
示例:
① 日志記錄
def log_call(func):def wrapper(*args, **kwargs):print(f"調用 {func.__name__},參數: {args}, {kwargs}")return func(*args, **kwargs)return wrapper@log_call
def add(a, b):return a + badd(2, 3)  # 輸出: 調用 add,參數: (2, 3), {}
② 性能計時
import timedef time_it(func):def wrapper(*args, **kwargs):start = time.time()result = func(*args, **kwargs)print(f"{func.__name__} 耗時: {time.time() - start:.2f}s")return resultreturn wrapper@time_it
def slow_function():time.sleep(1)slow_function()  # 輸出: slow_function 耗時: 1.00
③ 權限驗證
def login_required(func):def wrapper(user, *args, **kwargs):if not user.is_authenticated:raise PermissionError("請先登錄")return func(user, *args, **kwargs)return wrapper@login_required
def delete_file(user, filename):print(f"{user.name} 刪除了文件 {filename}")# 調用時會自動檢查權限
裝飾器的分類
1. 函數裝飾器
  • 最常用形式,作用于函數。
@decorator
def func(): pass
2. 類裝飾器
  • 裝飾類,可以修改或替換類行為。
def add_method(cls):cls.new_method = lambda self: print("動態添加的方法")return cls@add_method
class MyClass: passobj = MyClass()
obj.new_method()  # 輸出: 動態添加的方法
3. 帶參數的裝飾器
  • 通過嵌套函數實現參數傳遞。
def repeat(n):def decorator(func):def wrapper(*args, **kwargs):for _ in range(n):result = func(*args, **kwargs)return resultreturn wrapperreturn decorator@repeat(3)
def say_hello():print("Hello")say_hello()  # 輸出 3 次 Hello
4. 內置裝飾器
  • Python 自帶的裝飾器,如:
    • @staticmethod / @classmethod:定義靜態方法和類方法。
    • @property:將方法轉為屬性。
    • @functools.lru_cache:緩存函數結果。
裝飾器工作原理:
原始函數 → 裝飾器 → 增強后的新函數
常見裝飾器使用場景:
  • 日志記錄
  • 性能測試(如執行時間)
  • 權限校驗
  • 緩存
  • 事務處理

三、高階函數對比表

以下是 Python 中五大高階函數 map()filter()reduce()sorted() 和裝飾器的詳細對比表格,包含核心特性和使用場景的直觀對比:


1. Python 高階函數對比表

特性map()filter()reduce()sorted()裝飾器
功能對每個元素應用函數轉換篩選滿足條件的元素累積計算所有元素排序可迭代對象增強或修改函數行為
輸入(函數, 可迭代對象)(函數, 可迭代對象)(函數, 可迭代對象[, 初始值])(可迭代對象[, key][, reverse])函數作為輸入
輸出類型迭代器(需用 list() 轉換)迭代器(需用 list() 轉換)單個計算結果新列表返回包裝后的函數
是否修改原數據? 生成新數據? 生成新數據? 生成新數據? 生成新列表? 原函數不變
典型用途數據轉換(如類型轉換、數學計算)數據篩選(如去空值、條件過濾)聚合計算(如求和、求積)排序(支持自定義規則)日志、計時、權限校驗、緩存等
依賴模塊內置內置from functools import reduce內置語法支持(@
性能特點惰性求值,內存高效惰性求值,內存高效立即計算立即生成新列表運行時增加少量開銷
常用搭配lambdafilterreducelambdamaplambdamapkey= 函數、reverse=嵌套裝飾器(如 @log @timer
代碼示例map(lambda x: x*2, [1,2,3])filter(lambda x: x>0, [-1,0,1])reduce(lambda x,y: x+y, [1,2,3])sorted([3,1,2], reverse=True)@decorator def fn(): pass

2. 關鍵區別圖示

2.1 輸入輸出流程
map:      [a,b,c] → [f(a), f(b), f(c)]  
filter:   [a,b,c] → [a if f(a)=True, c if f(c)=True]  
reduce:   [a,b,c] → f(f(a,b), c)  
sorted:   [c,b,a] → [a,b,c]  
裝飾器:    func → decorated_func
2.2 何時選擇哪個?
需求選擇的高階函數
批量修改數據map()
按條件過濾數據filter()
計算總和/最大值等聚合reduce()
排序數據sorted()
給函數添加額外功能裝飾器
2.3 性能與內存對比
函數惰性求值內存占用適用數據規模
map()?大規模
filter()?大規模
reduce()?中小規模
sorted()?高(生成新列表)中小規模

3. 經典組合用法示例

from functools import reduce# 1. map + filter: 先過濾再轉換
numbers = [1, 2, 3, 4, 5]
result = list(map(lambda x: x**2, filter(lambda x: x%2==0, numbers)))
# 結果: [4, 16] (僅偶數平方)# 2. sorted + map: 排序轉換后的結果
words = ["apple", "banana", "cherry"]
sorted_by_len = sorted(map(len, words), reverse=True)
# 結果: [6, 6, 5] (按長度降序)# 3. reduce + map: 聚合計算
total = reduce(lambda x,y: x+y, map(float, ["1.5", "2.3"]))
# 結果: 3.8 (字符串轉浮點數后求和)# 4. 裝飾器 + map: 增強函數功能
@log_execution_time
def square(x):return x**2list(map(square, [1, 2, 3]))  # 自動記錄執行時間

4. 總結選擇建議

  1. 需要簡潔性 → 優先用 map/filter + lambda
  2. 需要可讀性 → 簡單邏輯用列表推導式,復雜邏輯用高階函數
  3. 需要性能 → 大數據用 map/filter(惰性求值),避免 reduce 處理大規模數據
  4. 需要擴展功能 → 裝飾器是唯一選擇

四、高階函數的鏈式調用

高階函數可以鏈式調用,形成強大的數據處理管道:

from functools import reducenumbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]# 鏈式調用示例:過濾偶數 → 平方 → 求和
result = reduce(lambda x, y: x + y,map(lambda x: x ** 2,filter(lambda x: x % 2 == 0,numbers))
)print(result)  # 輸出: 220 (22 + 42 + 62 + 82 + 102)

數據處理流程

原始數據 → filter(過濾) → map(轉換) → reduce(聚合) → 最終結果

五、實際應用案例

案例1:學生成績處理

students = [{"name": "Alice", "score": 85},{"name": "Bob", "score": 72},{"name": "Charlie", "score": 90},{"name": "David", "score": 68}
]# 找出及格的學生并按分數降序排列
passed_students = sorted(filter(lambda s: s["score"] >= 60, students),key=lambda x: x["score"],reverse=True
)print(passed_students)
# 輸出: [{'name': 'Charlie', 'score': 90}, {'name': 'Alice', 'score': 85}, 
#        {'name': 'Bob', 'score': 72}, {'name': 'David', 'score': 68}]

案例2:日志記錄裝飾器

def log(func):def wrapper(*args, **kwargs):print(f"開始執行: {func.__name__}")result = func(*args, **kwargs)print(f"執行結束: {func.__name__}")return resultreturn wrapper@log
def add(a, b):return a + bprint(add(3, 5))
# 輸出:
# 開始執行: add
# 執行結束: add
# 8

六、總結

Python的高階函數提供了強大的功能抽象能力,讓我們能夠寫出更簡潔、更易讀的代碼。記住這幾個關鍵點:

  1. map() - 對每個元素應用函數:“給我一個函數和一個列表,我會把函數應用到每個元素上”
  2. filter() - 篩選元素:“給我一個條件和一個列表,我會返回滿足條件的元素”
  3. reduce() - 累積計算:“給我一個計算規則和一個列表,我會把它們累積成一個結果”
  4. sorted() - 排序:“給我一個列表和排序規則,我會返回排好序的新列表”
  5. 裝飾器 - 增強函數:“給我一個函數,我會返回一個功能更強的版本”

通過靈活組合這些高階函數,你可以優雅地處理各種數據轉換和計算任務,寫出更"Pythonic"的代碼!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/84619.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/84619.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/84619.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Flume之選擇器:復制和多路復用(比喻化理解

Flume 的選擇器決定了Source 如何將數據分發到多個 Channel。這就像 “快遞員如何分配包裹到不同的運輸通道”,有兩種策略:復制和多路復用。 一、復制(Replicating Selector):每個 Channel 都送一份 核心邏輯 將同一…

yolov5 安卓運行

參考博客: 通過Android Studio 將yolov5部署到手機端(新手最新適用版)_怎么將yolo部署手機-CSDN博客 總體跟隨參考博客走是沒問題,有些細節需要注意: 1 jdk 版本選擇,jdk需要17,新版的Android Studio 選擇jdk版本方式…

day021-定時任務

文章目錄 1. cron1.1 檢查是否安裝1.2 檢查是否開機自啟動1.3 配置文件與相關命令1.4 配置文件格式 2. 案例2.1 同步時間2.2 定時備份/etc和/var/log目錄2.3 定時巡檢腳本 3. 練習三劍客過濾3.1 去重統計ip數量3.2 去重統計第7列 用戶訪問的url的數量3.3 去重統計第9列 狀態碼與…

關于(stream)流

Stream 是 Java 8 引入的一個強大的功能,用于處理集合(Collection)或數組中的數據。它提供了一種聲明式的編程方式,可以極大地簡化對數據的操作,例如過濾、排序、映射和聚合等。 1. 什么是 Stream 流? 定義…

結課作業自選01. 內核空間 MPU6050 體感鼠標驅動程序(二)(完整實現流程)

目錄 一. 題目要求-內核空間 MPU6050 體感鼠標驅動程序 二. 偽代碼及程序運行流程 三. 主要函數詳解(根據代碼流程進行詳解) 3.1 module_i2c_driver宏(對應“1”) 3.2 mpu_of_match設備樹匹配表(對應“2”&#x…

5G 核心網切換機制全解析:XN、N2 與移動性注冊對比

摘要 本文深入探討了 5G 核心網中的三種關鍵切換方式:基于 XN 接口的切換、基于 N2 接口的切換以及移動性注冊更新機制。通過對比分析它們的原理、應用場景和技術差異,幫助讀者全面理解 5G 網絡中用戶移動性管理的核心技術。 1. 引言 隨著 5G 技術的廣泛應用,用戶對網絡連…

用深度學習提升DOM解析——自動提取頁面關鍵區塊

一、時間軸:一次“抓不到重點”的二手車數據爬蟲事故 2025/03/18 09:00 產品經理希望抓取懂車帝平臺上“北京地區二手車報價”作為競品監測數據源。我們初步使用傳統XPath方案,試圖提取車型、年限、里程、價格等數據。2025/03/18 10:00 初版腳本運行失敗…

React與Vue的內置指令對比

React 與 Vue 不同,它沒有內置的模板指令系統。React 采用了 JavaScript 優先 的聲明式方式,使用 JSX 語法將 HTML 和 JavaScript 結合在一起。因此,React 中沒有類似 Vue 的 v-if、v-for、v-bind 等內置指令。 React 中的替代方案 條件渲染…

Spring聲明式事務源碼全鏈路剖析與設計模式深度解讀

Spring聲明式事務源碼全鏈路剖析與設計模式深度解讀 作者:AI 日期:2025-05-22 一、前言 Spring事務是企業級開發的基石,但“為什么有時事務失效?”、“不同傳播行為背后發生了什么?”、“Spring事務源碼到底如何實現&…

云原生安全基礎:深入探討容器化環境中的權限隔離與加固策略

🔥「炎碼工坊」技術彈藥已裝填! 點擊關注 → 解鎖工業級干貨【工具實測|項目避坑|源碼燃燒指南】 在云原生環境中,容器化技術(如 Docker 和 Kubernetes)的廣泛應用帶來了靈活性與效率,但也引入了新的安全挑…

如何在 ONLYOFFICE 演示文稿中調整段落首行縮進

在制作演示文稿時,保持內容的一致性與可讀性至關重要,而段落首行縮進作為格式設置的關鍵環節,直接影響著整體呈現效果。在本文中,我們將介紹如何通過創建 ONLYOFFICE 宏,快速設置演示文稿中所有段落的首行縮進。 關于 …

[Asp.Net]GridView、Repeater 導出Excel長數字顯示成科學計數

類似身份證純數字的格式時 ,excel默認是數字格式 變成了科學計數法 , GridView:RowDataBound 添加e.Row.Cells[2].Attributes.Add(“style”, “vnd.ms-excel.numberformat:;”); protected void GridView1_RowDataBound(object sender, GridViewRowE…

Ntfs!NtfsReadBootSector函數分析之nt!CcGetVacbMiss中得到一個nt!_VACB結構

第一部分: 1: kd> g Breakpoint 3 hit nt!CcGetVacbMiss: 80a1a19e 6a30 push 30h 1: kd> kc # 00 nt!CcGetVacbMiss 01 nt!CcGetVirtualAddress 02 nt!CcMapData 03 Ntfs!NtfsMapStream 04 Ntfs!NtfsReadBootSector Ntfs…

Linux10正式版發布,擁抱AI了!

📢📢📢📣📣📣 作者:IT邦德 中國DBA聯盟(ACDU)成員,10余年DBA工作經驗 Oracle、PostgreSQL ACE CSDN博客專家及B站知名UP主,全網粉絲10萬 擅長主流Oracle、MySQL、PG、高斯…

關于 SSE(Server-Sent Events)過程的簡要解剖

Js前端:發送普通請求 fetch(...) .then(()>{}) .catch(()>{})Java后端:接收請求后調用請求處理函數,函數返回一個emiiter對象 public SseEmitter handleRequest(...) {// 創建一個 SseEmitter 對象,用于發送 SSE 事件SseE…

PyTorch 中unsqueeze(-1)用法

unsqueeze(-1) 是 PyTorch 中的一個張量操作,用于?在指定維度上增加一個長度為1的維度?(即擴展維度)。具體解析如下: 功能說明 ?作用位置? -1 表示在張量的?最后一個維度?后添加新維度。 (等價于 dimlen(tensor.…

RTC技術

什么是RTC RTC(Real time communication)實時通信,是實時音視頻的一個簡稱,我們常說的RTC技術一般指的是WebRTC技術,已經被 W3C 和 IETF 發布為正式標準。由于幾乎所有主流瀏覽器都支持 WebRTC 標準 API ,…

vue+cesium示例:3Dtiles三維模型高度調整(附源碼下載)

接到一位知識星友的邀請,實現他需要3Dtiles三維模型的簡單高度調整需求,適合學習Cesium與前端框架結合開發3D可視化項目。 demo源碼運行環境以及配置 運行環境:依賴Node安裝環境,demo本地Node版本:推薦v18。 運行工具:…

詳解3DGS

4 可微分的3D高斯 splatting 核心目標與表示選擇 我們的目標是從無法線的稀疏SfM點出發,優化出一種能夠實現高質量新視角合成的場景表示。為此,我們選擇3D高斯作為基本圖元,它兼具可微分的體表示特性和非結構化的顯式表示優勢,既…

構建版本沒mac上傳APP方法

在蘋果開發者的app store connect上架Ios應用的時候,發現需要使用xode等軟件來上傳iOS的APP。 但是不管是xcode也好,transporter也好,還是命令行工具也好,都必須安裝在mac電腦才能使用,。 假如沒有mac電腦&#xff0…