Python進階教程丨lambda函數

1. lambda函數是什么?

在 Python 里,lambda 函數是一種特殊類型的函數,也被叫做匿名函數。匿名”意味著它不需要像常規函數那樣使用 def 來進行命名。lambda lambda 函數本質上是簡潔的臨時函數 ,它適用于只需要簡單邏輯的場景,并且通常會在代碼里被直接使用,不會像普通函數那樣被長期保存和復用。

lambda函數主要用于簡化代碼結構,它的主要特點是:
? 即用即棄:不需要預先定義
? 簡潔性:單行表達式實現功能
? 函數式編程:作為參數傳遞高階函數

1.1. 基本語法:

lambda 函數的基本語法格式如下:

lambda 參數列表: 表達式

其中具體的參數和表達式含義如下:

參數列表

參數列表是 lambda 函數接收的輸入參數,可以包含 0 個或多個參數,如果有多個參數,需要用逗號分隔開。參數列表緊跟在 lambda 關鍵字之后,中間沒有空格。例如:

  • 無參數的 lambda 函數:
func = lambda: "Hello, World!"
print(func())  # 輸出: Hello, World!
  • 單個參數的 lambda 函數:
square = lambda x: x ** 2
print(square(5))  # 輸出: 25
  • 多個參數的 lambda 函數:
add = lambda x, y: x + y
print(add(3, 4))  # 輸出: 7

冒號 (:)

冒號是參數列表和表達式之間的分隔符,用于明確區分函數的輸入參數和函數要執行的操作。

表達式

表達式是 lambda 函數的核心部分,它是一個簡單的計算式,lambda 函數會自動返回這個表達式的計算結果。需要注意的是,lambda 函數只能包含一個表達式,不能包含多條語句或復雜的邏輯結構。例如:

# 計算兩個數的乘積
multiply = lambda a, b: a * b
print(multiply(6, 7))  # 輸出: 42

1.2. 核心特性

1.2.1. 參數靈活性

這個就是剛剛提到的可以包含 0 個或多個參數,參數十分靈活

# 無參數
greet = lambda: "Hello World"
print(greet())  # Hello World# 多參數
multiply = lambda a, b, c: a * b * c
print(multiply(2,3,4))  # 24# 默認參數
power = lambda x, n=2: x ** n
print(power(3))    # 9
print(power(3,3))  # 27
1.2.2. 表達式限制

lambda只能包含單個表達式

# 錯誤示例:包含語句
invalid = lambda x: print(x)  # print是語句,非法!# 正確寫法:表達式返回值
valid = lambda x: x * 2  # 表達式合法
1.2.3. 閉包特性

lambda可以捕獲外部變量:

base = 10
adder = lambda x: x + base
print(adder(5))  # 15base = 20       # 修改外部變量
print(adder(5))  # 25(隨外部變量改變)
1.2.4. 類型注解支持

Python 3.6+支持類型注解,這里簡單提一下類型注解是什么。

Python 是一種動態類型語言,在傳統的 Python 代碼里,變量的類型在運行時才能確定,這讓代碼具有很高的靈活性,但也在一定程度上降低了代碼的可讀性和可維護性。從 Python 3.6 開始,Python 引入了類型注解(Type Annotations)這一特性,允許開發者為變量、函數參數、函數返回值等添加類型提示,從而提升代碼的可讀性和可維護性。

現在 Python 也可以像 C 語言或者 java 一樣標明變量類型了,為變量添加類型注解的語法是在變量名后面加上冒號和類型。

// C語言中聲明變量的方式
int num = 12;
char name = "凌小添"
// 聲明變量前必須說明變量類型

Python3.6 版本后也支持了這種寫法,也就是所謂的類型注解。

# 為整數類型的變量添加注解
age: int = 25
# 為字符串類型的變量添加注解
name: str = "凌小添"
# 為列表類型的變量添加注解,列表元素類型為字符串
fruits: list[str] = ["apple", "banana", "cherry"]

那么在匿名函數中,我們也可以使用對應的注解

from typing import Callable
# 為lambda添加類型注解
math_op: Callable[[float, float], float] = lambda x,y: x**2 + y**2
result = math_op(3.0, 4.0)
print(result)  # 25.0
1.2.5. 嵌套lambda

lambda可以多層嵌套,像下面這樣

high_order = lambda x: (lambda y: x + y)
adder_5 = high_order(5)
print(adder_5(3))  # 8
1.2.6. 立即執行

與普通函數不同,匿名函數可在定義后立即調用,無需再去專門調用。

print((lambda x: x.upper())('hello'))  # HELLO

2. lambda的典型應用場景

2.1. 數據排序

我們看這么一個需求,要求將字符串按出現次數排序。

我們可以用字典來記錄次數,用lambda函數去進行排序。

s = input()#獲取輸入的字符
dic = {}
for i in s: # 通過字典記錄字符出現次數if i in dic:dic[i] += 1else:dic[i] = 1
item = list(dic.items())item.sort(key=lambda x: x[0])
item.sort(key=lambda x: x[1], reverse=True)
for i in item:print(i[0], end="")

2.2. 事件處理

lambda函數還可以在 GUI編程快速定義事件響應。

# Tkinter示例
import tkinter as tkroot = tk.Tk()colors = ['red', 'green', 'blue']
for c in colors:btn = tk.Button(root, text=c,command=lambda color=c: print(f"Selected {color}"))btn.pack()root.mainloop()

注意:通過 color=c 固定循環變量值

2.3. 高階函數傳參

在函數式編程中,lambda常作為臨時函數傳遞給 mapfilterreduce 等函數。

# 數據清洗管道
raw_data = [" 42 ", "3.14", "error", "100"]# 鏈式處理:去空格 -> 過濾有效數字 -> 轉換為浮點數
processed = list(map(float,filter(lambda s: s.strip().replace('.','',1).isdigit(),map(str.strip, raw_data))))
print(processed)  # [42.0, 3.14, 100.0]

2.4. 動態邏輯生成

動態生成指的是代碼可以根據運行時條件生成不同行為的函數

def operation_factory(op_type):return {'add': lambda a, b: a + b,'sub': lambda a, b: a - b,'mul': lambda a, b: a * b}.get(op_type, lambda a, b: None)calc = operation_factory('mul')
print(calc(3, 4))  # 12

2.5. 遞歸算法簡化

實現簡潔的遞歸邏輯

factorial = lambda n: 1 if n == 0 else n * factorial(n-1)print(factorial(5))  # 120

3. 使用lambda的注意事項

使用lambda函數有一些常見問題,提前學習可以有效降低犯錯概率。

3.1. 變量錯誤

循環中創建lambda的一個常見錯誤:直接使用變量

funcs = []
for i in range(3):funcs.append(lambda: i**2)print([f() for f in funcs])  # [4, 4, 4] 不是預期的[0,1,4]

正確寫法

funcs = []
for i in range(3):funcs.append(lambda i=i: i**2)  # 捕獲當前i值print([f() for f in funcs])  # [0, 1, 4]

3.2. 可讀性把控

lambda函數一般都寫在一行,如果使用復雜的lambda函數寫著寫著可能就不知道是什么了。

# 難以理解的lambda
bad = lambda lst: list(map(lambda x: (x[0], sum(x[1])/len(x[1])), ((k, [d['v'] for d in g]) for k, g in groupby(sorted(lst, key=lambda x: x['k']), key=lambda x: x['k']))))# 改用普通函數更清晰
def process_data(lst):sorted_lst = sorted(lst, key=lambda x: x['k'])grouped = groupby(sorted_lst, key=lambda x: x['k'])return [(key, sum(d['v'] for d in group)/len(group))for key, group in grouped]

3.3. 調試困難

lambda沒有函數名,調試時顯示<lambda>,如果有多個匿名函數,調試將更加復雜。

def debug_demo():f = lambda x: x * 2print(f)  # <function debug_demo.<locals>.<lambda> at 0x...>

3.4. 類型限制

無法添加文檔字符串:

# 普通函數可以添加文檔
def add(x, y):"""Add two numbers"""return x + y# lambda無法添加文檔
lambda_add = lambda x,y: x + y
lambda_add.__doc__ = "Add numbers"  # 不報錯但無效

3.5. lambda與普通函數對比

我們用一個表格來總結匿名函數和普通函數的區別。

類型

lambda函數

普通函數(def)

函數名

匿名

需明確命名

表達式數量

只能有一個表達式

可包含多個語句

返回值

自動返回表達式結果

需要return語句

文檔字符串

不支持

支持

調試信息

顯示為<lambda>

顯示函數名

適用場景

簡單邏輯、回調函數

復雜邏輯、重用代碼

4. 小結

雖然lambda函數在某些場景使用十分方便,但在使用 lambda函數時請注意以下內容:

簡單原則:邏輯不超過一個表達式時使用

命名規范:賦值給變量時使用有意義的名字

# 不推薦
f = lambda x: x**2 + 2*x + 1# 推薦
quadratic = lambda x: x**2 + 2*x + 1

避免嵌套:多層嵌套lambda降低可讀性

類型提示:為復雜lambda添加類型注解

無法處理異常:不能包含try/except塊

不支持賦值語句:無法在lambda內修改外部變量

調試困難:缺乏有意義的堆棧信息

可讀性差:復雜邏輯會大幅降低代碼可讀性

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

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

相關文章

TK矩陣系統:高效管理與智能化操作平臺

隨著TikTok等社交媒體平臺的快速發展&#xff0c;短視頻創作和內容運營逐漸成為互聯網行業的重要組成部分。為了幫助內容創作者、品牌運營商以及數據分析人員更高效地管理多個TikTok賬號并優化運營策略&#xff0c;TK矩陣系統提供了一種全新的解決方案&#xff0c;結合了先進的…

Spring Boot整合Apache BookKeeper教程

精心整理了最新的面試資料和簡歷模板&#xff0c;有需要的可以自行獲取 點擊前往百度網盤獲取 點擊前往夸克網盤獲取 Spring Boot整合Apache BookKeeper教程 1. 簡介 Apache BookKeeper 是一個高性能、持久化的分布式日志存儲系統&#xff0c;適用于需要強一致性和高吞吐量的…

蘋果HFS+56TB存儲MOV文件出錯的恢復方法

HFS文件系統是Apple電腦中默認的最常見的文件系統。HFS來源于UNIX&#xff0c;優勢就是穩定性&#xff0c;另外HFS是支持日志功能的&#xff0c;所以很多存儲設備也采用了HFS文件系統。再穩定的文件系統也有“馬失前蹄”的時候&#xff0c;下面就來聊下HFS出現文件出錯、丟失時…

電源電路篇

電源電路篇 一、LDO-Low Dropout Regulator(低壓差線性穩壓器)1.1 AMS1117-3.3V芯片 二、DCDC-Direct Current to Direct Current(開關穩壓器)2.1 降壓(Buck)電路2.1.1 TPS5450-5V芯片 一、LDO-Low Dropout Regulator(低壓差線性穩壓器) LDO是一種線性穩壓器&#xff0c;用于提…

java項目之在線購物系統(源碼+文檔)

項目簡介 在線購物系統實現了以下功能&#xff1a; 使用在線購物系統的用戶分管理員和用戶兩個角色的權限子模塊。 管理員所能使用的功能主要有&#xff1a;主頁、個人中心、用戶管理、商品分類管理、商品信息管理、系統管理、訂單管理等。 用戶可以實現主頁、個人中心、我的…

go語言中空結構體

空結構體(struct{}) 普通理解 在結構體中&#xff0c;可以包裹一系列與對象相關的屬性&#xff0c;但若該對象沒有屬性呢&#xff1f;那它就是一個空結構體。 空結構體&#xff0c;和正常的結構體一樣&#xff0c;可以接收方法函數。 type Lamp struct{}func (l Lamp) On()…

Unity實現連連看連線效果

1.一個比較簡單的向量計算&#xff0c;用的LineRenderer實現&#xff1b; 已知起始A點和終點C點&#xff0c;求B點&#xff1b; 先計算A點到C點的向量取歸一化當做方向&#xff0c;再給定一個“模長”&#xff08;B點到A點的模長&#xff09;乘以該方向&#xff0c;最后加上L…

【MySQL】觸發器與存儲引擎

目錄 觸發器基本概念觸發器操作創建觸發器NEW 與 OLD查看觸發器刪除觸發器 注意事項 存儲引擎基本概念基本操作查詢當前數據庫支持的存儲引擎查看當前的默認存儲引擎查看某個表用的存儲引擎創建表時指定存儲引擎修改表的存儲引擎 觸發器 基本概念 概述&#xff1a; 觸發器&a…

能“嘎嘎提升”提升用戶居住體驗的智能家居物聯網框架推薦!

智能家居在日常生活中給我們的帶來了更多的便利&#xff0c;更讓有些用戶切實地體會到了科技的魅力&#xff0c;對于想要打造屬于自己的智能家居氛圍感的用戶們&#xff0c;以下是一些能夠幫助提升居住體驗的智能家居物聯網框架及應用&#xff1a; 1. 涂鴉智能&#xff08;Tuy…

DevEco Studio的使用

目錄 1.創建ArkTS工程 2.ArkTS工程目錄結構&#xff08;Stage模型&#xff09; 構建第一個頁面 構建第二個頁面 實現頁面間的跳轉 1.創建ArkTS工程 若首次打開DevEco Studio&#xff0c;請點擊Create Project創建工程。如果已經打開了一個工程&#xff0c;請在菜單欄選擇…

性能監控——vmstat

性能監控——vmstat ? 性能監控是對 IT 系統運行效率和有效性的系統觀察和測量。它涉及收集、分析和報告各種組件&#xff08;包括應用程序、網絡、服務器和數據庫&#xff09;的關鍵性能指標 (KPI)。此過程使用專門的工具來跟蹤響應時間、吞吐量、資源利用率和錯誤率等指標。…

搭建Python量化開發環境:從零開始的完整指南

搭建Python量化開發環境&#xff1a;從零開始的完整指南 在量化投資領域&#xff0c;一個穩定且高效的開發環境是成功的關鍵。本文將引導你一步步搭建起自己的Python量化開發環境&#xff0c;確保你能夠順利開始編寫和運行量化策略。 &#x1f680;量化軟件開通 &#x1f68…

圖像分割的mask有空洞怎么修補

分享一個對實例分割mask修補的方法&#xff0c;希望對大家有所幫助。 1. 這是我準備分割的圖片 2 分割結果 可以看到衣服部分有一些沒分割出來&#xff0c;二值化圖片能清晰看到衣服部分有些黑色未分出的地方。 3 補全mask區域 import cv2 import numpy as npdef fill_mask_h…

Qt 控件概述 QLabel

目錄 QLabel顯示類控件 label如何做到與窗口同步變化 邊框 Frame QLabel顯示類控件 ?? ?? textFormat &#xff1a;設置文件格式 ? Pixmap &#xff1a;標簽圖片 label如何做到與窗口同步變化 Qt中對應用戶的操作 &#xff1a; 事件和信號 拖拽窗口大小就會觸發…

詞頻統計 ccf-csp 2024-2-1

在學習了文本處理后&#xff0c;小 P 對英語書中的 n篇文章進行了初步整理。 具體來說&#xff0c;小 P將所有的英文單詞都轉化為了整數編號。 假設這 n 篇文章中共出現了 m個不同的單詞&#xff0c;則把它們從 1到 m進行編號。 這樣&#xff0c;每篇文章就簡化為了一個整數…

用爬蟲解鎖 Shopee 店鋪商品數據,開啟電商新洞察

在電商競爭白熱化的當下&#xff0c;Shopee 作為全球知名的電商平臺&#xff0c;匯聚了海量的商品與商機。對于電商從業者、數據分析師、創業者來說&#xff0c;精準掌握 Shopee 店鋪的商品信息&#xff0c;就如同手握一把開啟財富大門的鑰匙。而爬蟲技術&#xff0c;無疑是幫助…

k8s中的service解析

k8s中的service解析 在k8s中&#xff0c;我們可以通過pod來創建服務。 然而&#xff0c;當我們創建多個 Pod 來提供同一項服務時&#xff0c;直接通過 Pod IP 進行訪問會變得復雜且不可維護。因此&#xff0c;Kubernetes 提供了 Service 這一抽象概念&#xff0c;用于對外暴露…

git 命令回退版本

1、查看提交記錄 git log --oneline # 簡化的提交歷史&#xff08;推薦&#xff09; # 或 git log # 完整提交歷史2、版本回退 git reset --hard <commit-hash>3、如果已推送過代碼到遠程倉庫&#xff0c;需強制推送更新 git push -f

深度學習與傳統算法在人臉識別領域的演進:從Eigenfaces到ArcFace

一、傳統人臉識別方法的發展與局限 1.1 Eigenfaces&#xff1a;主成分分析的經典實踐 算法原理 Eigenfaces是基于主成分分析&#xff08;PCA&#xff09;的里程碑式方法。其核心思想是將人臉圖像視為高維向量&#xff0c;通過協方差矩陣計算特征向量&#xff08;即特征臉&…

串口接收不到數據,串口RX配置(f407),f103和f407的區別

問題 芯片&#xff1a;STM32F407&#xff0c;軟件&#xff1a;標準庫 使用串口時&#xff0c;直接把之前STM32F103的串口配置移植過來&#xff0c;同樣以串口4為例&#xff0c;代碼如下&#xff1a; STM32F103 UART4&#xff1a; void UART4_Configuration(uint32_t BaudRa…