Python匿名函數(lambda)全面詳解

文章目錄

  • Python匿名函數(lambda)全面詳解
    • 一、lambda函數基礎
      • 1. 什么是lambda函數?
      • 2. lambda函數語法
      • 3. 與普通函數的區別
    • 二、lambda函數使用場景
      • 1. 作為函數參數
      • 2. 在數據結構中使用
      • 3. 作為返回值
      • 4. 立即調用(IIFE)
    • 三、lambda函數高級用法
      • 1. 多參數lambda
      • 2. 條件表達式
      • 3. 嵌套lambda
      • 4. 捕獲變量
      • 5. 與高階函數配合
    • 四、lambda函數限制
    • 五、何時使用lambda
      • 適合使用lambda的場景
      • 不適合使用lambda的場景
    • 六、lambda與def性能比較
    • 七、lambda最佳實踐
    • 八、綜合示例

Python匿名函數(lambda)全面詳解

匿名函數是Python中一種簡潔的函數定義方式,也稱為lambda函數。下面我將從基礎到高級全面講解lambda函數的所有知識點。

一、lambda函數基礎

1. 什么是lambda函數?

lambda函數是使用lambda關鍵字創建的匿名函數(沒有函數名),適合編寫簡單的、一次性使用的小函數。

# 普通函數
def square(x):return x ** 2# lambda等效
square = lambda x: x ** 2print(square(5))  # 輸出: 25

2. lambda函數語法

lambda 參數列表: 表達式
  • lambda:關鍵字,表示創建匿名函數
  • 參數列表:可以包含多個參數,用逗號分隔
  • ::分隔參數和表達式
  • 表達式:只能有一個表達式,不能包含語句,其結果為返回值

3. 與普通函數的區別

特性lambda函數普通函數(def)
名稱匿名有名稱
函數體只能是單個表達式可以包含多條語句
返回值表達式結果自動返回需要return語句
復雜度適合簡單操作適合復雜邏輯
存儲通常不賦值給變量通常賦值給變量
使用場景臨時、一次性使用需要重復使用

二、lambda函數使用場景

1. 作為函數參數

常用于需要函數作為參數的函數,如map()filter()sorted()等。

# 使用map()和lambda
numbers = [1, 2, 3, 4, 5]
squared = list(map(lambda x: x**2, numbers))
print(squared)  # 輸出: [1, 4, 9, 16, 25]# 使用filter()和lambda
evens = list(filter(lambda x: x % 2 == 0, numbers))
print(evens)  # 輸出: [2, 4]# 使用sorted()和lambda
students = [('Alice', 22), ('Bob', 19), ('Charlie', 20)]
sorted_students = sorted(students, key=lambda s: s[1])  # 按年齡排序
print(sorted_students)  # 輸出: [('Bob', 19), ('Charlie', 20), ('Alice', 22)]

2. 在數據結構中使用

# 字典值排序
data = {'a': 3, 'b': 1, 'c': 2}
sorted_items = sorted(data.items(), key=lambda item: item[1])
print(sorted_items)  # 輸出: [('b', 1), ('c', 2), ('a', 3)]# 列表自定義排序
words = ['apple', 'banana', 'cherry', 'date']
sorted_words = sorted(words, key=lambda x: len(x))
print(sorted_words)  # 輸出: ['date', 'apple', 'banana', 'cherry']

3. 作為返回值

def make_multiplier(n):return lambda x: x * ndouble = make_multiplier(2)
triple = make_multiplier(3)print(double(5))  # 輸出: 10
print(triple(5))  # 輸出: 15

4. 立即調用(IIFE)

立即調用的lambda表達式(Immediately Invoked Function Expression):

result = (lambda x, y: x + y)(3, 4)
print(result)  # 輸出: 7

三、lambda函數高級用法

1. 多參數lambda

add = lambda x, y: x + y
print(add(3, 5))  # 輸出: 8full_name = lambda first, last: f"{first} {last}"
print(full_name("John", "Doe"))  # 輸出: John Doe

2. 條件表達式

lambda中可以使用條件表達式(三元運算符):

# 返回兩個數中較大的數
max_num = lambda a, b: a if a > b else b
print(max_num(10, 20))  # 輸出: 20# 奇偶判斷
check_odd = lambda x: "odd" if x % 2 else "even"
print(check_odd(7))  # 輸出: odd

3. 嵌套lambda

# 嵌套lambda實現多條件判斷
grade = lambda score: ("A" if score >= 90 else"B" if score >= 80 else"C" if score >= 70 else"D" if score >= 60 else"F"
)print(grade(85))  # 輸出: B

4. 捕獲變量

lambda可以捕獲外部作用域的變量:

prefix = "Hello, "
greet = lambda name: prefix + name
print(greet("Alice"))  # 輸出: Hello, Alice# 注意變量捕獲的時間點
funcs = [lambda x: x + i for i in range(3)]
print([f(10) for f in funcs])  # 輸出: [12, 12, 12] (不是預期的[10,11,12])

5. 與高階函數配合

from functools import reduce# 使用reduce和lambda計算階乘
factorial = lambda n: reduce(lambda x, y: x * y, range(1, n+1))
print(factorial(5))  # 輸出: 120# 多個lambda組合
process = lambda f, g: lambda x: f(g(x))
add_one = lambda x: x + 1
square = lambda x: x ** 2
add_then_square = process(square, add_one)
print(add_then_square(3))  # 輸出: 16 (3+1=4, 4^2=16)

四、lambda函數限制

  1. 只能包含一個表達式:不能包含語句(如if語句、for循環等)

    • 錯誤示例: lambda x: if x > 0: return x else return -x
    • 正確寫法: lambda x: x if x > 0 else -x
  2. 沒有文檔字符串:lambda函數不支持__doc__屬性

  3. 調試困難:由于沒有名稱,錯誤信息中難以識別

  4. 可讀性差:復雜邏輯使用lambda會降低代碼可讀性

五、何時使用lambda

適合使用lambda的場景

? 簡單的、一次性的操作
? 函數體只是一個表達式
? 作為高階函數的參數
? 排序、過濾等操作的key函數
? 需要保持代碼簡潔的場合

不適合使用lambda的場景

? 復雜的邏輯(應該使用def定義普通函數)
? 需要多條語句實現的功能
? 需要文檔說明的函數
? 會被多次調用的功能(應該定義命名函數)
? 需要調試的復雜操作

六、lambda與def性能比較

對于簡單操作,lambda和def性能差異不大:

import timeit# lambda測試
lambda_time = timeit.timeit('(lambda x: x*2)(5)', number=1000000)# def測試
def double(x):return x*2
def_time = timeit.timeit('double(5)', globals=globals(), number=1000000)print(f"lambda: {lambda_time:.6f}")  # 示例輸出: 0.098723
print(f"def: {def_time:.6f}")       # 示例輸出: 0.102456

實際選擇應基于可讀性和使用場景,而非微小性能差異。

七、lambda最佳實踐

  1. 保持簡短:lambda應該只包含簡單表達式
  2. 避免復雜邏輯:復雜邏輯使用def定義常規函數
  3. 合理命名變量:如果賦值給變量,給變量一個好名字
  4. 不要過度使用:當降低可讀性時,應該使用def
  5. 注意變量作用域:lambda會捕獲外部變量,注意閉包問題

八、綜合示例

# 數據處理管道
data = [1, 5, 3, 8, 2, 7, 6, 4]# 1. 過濾出大于3的數
# 2. 每個數乘以2
# 3. 按結果排序
# 4. 轉換為字符串
result = list(map(lambda x: str(x),sorted(map(lambda x: x * 2,filter(lambda x: x > 3,data))))
)print(result)  # 輸出: ['8', '10', '12', '14', '16']# 等價于列表推導式(通常更推薦)
result = [str(x*2) for x in sorted(data) if x > 3]
print(result)  # 輸出: ['8', '10', '12', '14', '16']

通過本文的詳細講解,你應該對Python的lambda函數有了全面深入的理解。合理使用lambda可以使代碼更簡潔,但也要注意不要濫用,在適當的時候選擇def定義命名函數會讓代碼更易讀易維護。

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

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

相關文章

Qt Widgets模塊功能詳細說明,基本控件:QCheckBox(三)

一、基本控件(Widgets) Qt 提供了豐富的基本控件,如按鈕、標簽、文本框、復選框、單選按鈕、列表框、組合框、菜單、工具欄等。 1、QCheckBox 1.1、概述 (用途、狀態、繼承關系) QCheckBox 是 Qt 框架中的復選框控件,用于表示二…

HarmonyOS 鴻蒙應用開發基礎:轉換整個PDF文檔為圖片功能

在許多應用場景中,將PDF文檔的每一頁轉換為單獨的圖片文件是非常有幫助的。這可以用于文檔的分享、掃描文檔的電子化存檔、或者進行進一步的文字識別處理等。本文將介紹如何使用華為HarmonyOS提供的PDF處理服務將整個PDF文檔轉換為圖片,并將這些圖片存放…

【算法】: 前綴和算法(利用o(1)的時間復雜度快速求區間和)

前綴和算法:高效處理區間求和的利器 目錄 引言什么是前綴和前綴和的基本實現前綴和的作用前綴和的典型應用場景前綴和的優缺點分析實戰例題解析 引言 區間求和問題的普遍性暴力解法的時間復雜度問題前綴和算法的核心思想 什么是前綴和 前綴和的數學定義 通俗來…

NDVI諧波擬合(基于GEE實現)

在遙感影像中,我們常用 NDVI(歸一化植被指數)來衡量地表植被的綠度。它簡單直觀,是生態監測、農情分析的基礎工具。但你是否注意到: NDVI 雖然“綠”,卻常常“亂”。 因為云層、觀測頻率、天氣干擾&#xf…

基于Python+YOLO模型的手勢識別系統

本項目是一個基于Python、YOLO模型、PyQt5的實時手勢識別系統,通過攝像頭或導入圖片、視頻,能夠實時識別并分類不同的手勢動作。系統采用訓練好的深度學習模型進行手勢檢測和識別,可應用于人機交互、智能控制等多種場景。 1、系統主要功能包…

黑馬點評--短信登錄實現

短信登錄 導入黑馬點評項目 導入資料中提供的SQL文件 其中的核心表有: tb_user :用戶表 tb_user_info :用戶詳情表 tb_shop:用戶信息表 tb_shop_type:商戶類型表 tb_blog:用戶日記表(達人…

AWS EC2實例安全遠程訪問最佳實踐

EC2 遠程連接方案對比 遠程訪問 Amazon EC2 實例主要有以下四種方式: Secure Shell (SSH) 遠程訪問AWS Systems Manager 會話管理器適用于 Linux 實例的 EC2 Serial ConsoleAmazon EC2 Instance Connect SSH 遠程訪問 SSH(Secure Shell)廣…

Idea如果有參數,怎么debug

如上圖,輸入輸出路徑是需要運行的時候給參數。 那么 FileInputFormat.setInputPaths(job, new Path(args[0])); FileOutputFormat.setOutputPath(job, new Path(args[1])); 給上面的代碼給參數的步驟為 1.在類名或者方法名上右鍵,選擇More Run/Debug…

Oracle Apps R12——報表入門2:單表——報表開發流程

☆開發思路 開發表報代碼流程中有幾個重要的組件和重要的知識點需要搞懂,才能得心應手。報表通常是通過表格的形式來存在的,我們一般在開發代碼的時候在【輸出】中打印HTML,Css格式的表格,并把查詢到的數據插入其中,即可完成一個報…

Servlet的繼承關系和生命周期

1.繼承關系: javax.servlet.Servlet接口->javax.servlet.GenericServlet抽象類 ->javax.servlet.http.HttpServlet抽象子類 2.相關方法: javax.servlet.Servlet: (1)void init(config) -初始化方法 &…

PEFT庫PromptTuningConfig 配置

PEFT庫 PromptTuningConfig 配置 "Prompt Tuning"的參數高效微調 PromptTuningConfig 核心參數解析 1. task_type="CAUSAL_LM" 作用:指定任務類型為因果語言模型(Causal LM)。說明:因果語言模型從左到右生成文本(如GPT系列),這與任務需求匹配(模…

【438. 找到字符串中所有字母異位詞】

Leetcode算法練習 筆記記錄 438. 找到字符串中所有字母異位詞 438. 找到字符串中所有字母異位詞 思路就是我們要找和p相同的詞,可以先排個序,每次取一個和p的size長度相同的窗口去滑動,符合就記錄,不符合繼續滑動。 public List&l…

React Hooks底層執行邏輯詳解、自定義Hooks、FiberScheduler

React Hooks底層執行邏輯詳解 React Hooks 在表面上看像普通的函數調用,背后卻隱藏著一套復雜而高效的運行時機制。要理解 React Hooks 的底層執行邏輯,需要從 React 如何管理組件的狀態與副作用入手。 🧠 一、React 為什么引入 Hooks&#…

Windows命令實用工具——tcping 命令工具安裝及基礎使用

Windows命令實用工具——tcping 命令工具安裝及使用 一、tcping 命令簡介二、tcping 的安裝1、tcping 官網下載安裝包2、將軟件包復制到 Windws 系統的 System32 目錄下面3、查看 tcping 命令是否安裝成功 三、tcping 工具簡單使用方法 一、tcping 命令簡介 tcping 的主要功能…

智慧化工園區安全風險管控平臺建設方案(Word)

1 項目概況 1.1 園區概況 1.1.1 XX化工園區簡況 1.1.2 企業現狀 1.1.3 園區發展方向 1.1.4 園區信息化現狀 1.2 項目建設背景 1.2.1 政策背景 1.3 項目建設需求分析 1.3.1 政策需求分析 1.3.2 安全生產監管需求分析 1.3.3 應急協同管理需求分析 1.3.4 工業互聯網安…

【動手學深度學習】2.3. 線性代數

目錄 2.3. 線性代數1)標量2)向量3)矩陣4)張量5)張量的基本性質6)降維7)點積8)矩陣-向量積9)矩陣-矩陣乘法10)范數11) 小結 2.3. 線性代數 本節將…

如何在項目當中使用redis進行范圍搜索

目錄 如何將地理位置數據保存到 Redis 中以支持范圍查詢 Redis 中的 GEO 類型是什么? 如何保存 GEO 數據到 Redis 分段解釋: RedisKey.POSTS_ANIMALS_LOCATIONS new Point(longitude, latitude) 如何進行范圍搜索 Redis GEO 范圍搜索核心語句 1…

物聯網低功耗保活協同優化方案:軟硬件與WiFi網關動態聯動

目錄 一、總體方案概述 二、架構組成 2.1 系統拓撲 2.2 硬件端(MCU + WiFi 模組) 2.3 WiFi 網關 2.4 云端服務器 三、低功耗保活技術設計模式 3.1 模式一:定時喚醒 + MQTT 保活 3.1.1 設備端 3.1.2 優勢 3.2 模式二:網關保活代理 + 本地網絡喚醒 3.2.1 網關功能…

UniApp+Vue3微信小程序二維碼生成、轉圖片、截圖保存整頁

二維碼生成工具使用uqrcode/js,版本4.0.7 官網地址:uQRCode 中文文檔(不建議看可能會被誤導) 本項目采用了npm引入方式,也可通過插件市場引入,使用上會略有不同 準備工作: 安裝:pnpm…

Zenmap代理情況下無法掃描ip

原因是開了代理會報錯 error “only ethernet devices can be used for raw scans on Windows” 在掃描參數后加 -sT -Pn,但會導致結果太多 例如:nmap -sT -T4 -A -v -Pn 10.44.2.0/24 如果你只是想找沒人用的IP,你不需要搞復雜的原始層掃描&…