網站首頁 編程語言 正文
前言:
Lambda 函數是 Python 中的匿名函數。當你需要完成一件小工作時,在本地環境中使用它們可以讓工作得心應手。有些人將它們簡稱為 lambdas,它們的語法如下:
lambda arguments: expression
lambda 關鍵字可以用來創建一個 lambda 函數,緊跟其后的是參數列表和用冒號分割開的單個表達式。例如,lambda x: 2 * x 是將任何輸入的數乘2,而 lambda x, y: x+y 是計算兩個數字的和。語法十分直截了當,對吧?
假設您知道什么是 lambda 函數,本文旨在提供有關如何正確使用 lambda 函數的一些常規準則。
1. 不要返回任何值
看看語法,您可能會注意到我們在 lambda 函數中并沒有返回任何內容。這都是因為 lambda 函數只能包含一個表達式。然而,使用 return 關鍵字會構成不符合規定語法的語句,如下所示:
>>> integers = [(3, -3), (2, 3), (5, 1), (-4, 4)] >>> sorted(integers, key=lambda x: x[-1]) [(3, -3), (5, 1), (2, 3), (-4, 4)] >>> sorted(integers, key=lambda x: return x[-1]) ...? ? File "<input>", line 1 ? ? sorted(integers, key=lambda x: return x[-1]) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?^ SyntaxError: invalid syntax
該錯誤可能是由于無法區分表達式和語句而引起的。像是包含 return、try、 with 以及 if 的語句會執行特殊動作。然而,表達式指的是那些可以被計算出一個值的表達,例如數值或其他 Python 對象。
通過使用 lambda 函數,單個表達式會被計算為一個值并且參與后續的計算,例如由 sorted 函數排序。
2. 不要忘記更好的選擇
lambda 函數最常見的使用場景是將它作為一些內置工具函數中 key 的實參,比如上面展示的 sorted() 和 max()。根據情況,我們可以使用其他替代方法。
思考下面的例子:
>>> integers = [-4, 3, 7, -5, -2, 6] >>> sorted(integers, key=lambda x: abs(x)) [-2, 3, -4, -5, 6, 7] >>> sorted(integers, key=abs) [-2, 3, -4, -5, 6, 7] >>> scores = [(93, 100), (92, 99), (95, 94)] >>> max(scores, key=lambda x: x[0] + x[1]) (93, 100) >>> max(scores, key=sum) (93, 100)
在數據科學領域,很多人使用 pandas 庫來處理數據。如下所示,我們可以使用 lambda 函數通過 map() 函數從現有數據中創建新數據。除了使用 lambda 函數外,我們還可以直接使用算術函數,因為 pandas
是支持的:
>>> import pandas as pd >>> data = pd.Series([1, 2, 3, 4]) >>> data.map(lambda x: x + 5) 0 ? ?6 1 ? ?7 2 ? ?8 3 ? ?9 dtype: int64 >>> data + 5 0 ? ?6 1 ? ?7 2 ? ?8 3 ? ?9 dtype: int64
3. 不要將它賦值給變量
我曾見過一些人將 lambda
函數誤認為是簡單函數的另一種聲明方式,我們可能也見過有人像下面這么做:
>>> doubler = lambda x: 2 * x >>> doubler(5) 10 >>> doubler(7) 14 >>> type(doubler) <class 'function'>
對 lambda 函數命名的唯一作用可能是出于教學目的,以表明 lambda 函數的確是和其他函數一樣的函數——可以被調用并且具有某種功能。除此之外,我們不應該將 lambda 函數賦值給變量。
為 lambda 函數命名的問題在于這使得調試不那么直觀。與其他的使用常規 def 關鍵字創建的函數不同,lambda 函數沒有名字,這也是為什么有時它們被稱為匿名函數的原因。思考下面簡單的例子,找出細微的區別:
>>> inversive0 = lambda x: 1 / x >>> inversive0(2) 0.5 >>> inversive0(0) Traceback (most recent call last): ? File "<input>", line 1, in <module> ? File "<input>", line 1, in <lambda> ZeroDivisionError: division by zero >>> def inversive1(x): ... ? ? return 1 / x ...? >>> inversive1(2) 0.5 >>> inversive1(0) Traceback (most recent call last): ? File "<input>", line 1, in <module> ? File "<input>", line 2, in inversive1 ZeroDivisionError: division by zero
當我們的代碼存在關于 lambda 函數的問題(即 inversive0
),Traceback 錯誤信息只會提示您 lambda 函數存在問題。
相比之下,使用正常定義的函數,Traceback會清晰地提示您有問題的函數(即 inversive1
)。
與此相關,如果您想多次使用 lambda 函數,最佳實踐是使用通過 def 定義的允許使用文檔字符串的常規函數。
4. 不要忘記列表推導式
有些人喜歡將 lambda 函數和高階函數一起使用,比如 map 或 filter。思考下面用法示例:
>>> # 創建一個數字列表 >>> numbers = [2, 1, 3, -3] >>> # 使用帶有 lambda 函數的 map 函數 >>> list(map(lambda x: x * x, numbers)) [4, 1, 9, 9] >>> # 使用帶有 lambda 函數的 filter 函數 >>> list(filter(lambda x: x % 2, numbers)) [1, 3, -3]
我們可以使用可讀性更強的列表推導式代替 lambda 函數。如下所示,我們使用列表推導式來創建相同的列表對象。如所見,與列表推導式相比,之前將 map 或 filter 函數與 lambda 函數一起使用更麻煩。因此,在創建涉及高階函數的列表時,應考慮使用列表推導式。
>>> # Use list comprehensions >>> [x * x for x in numbers] [4, 1, 9, 9] >>> [x for x in numbers if x % 2] [1, 3, -3]
結論
在本文中,我們回顧了使用 lambda 函數可能會犯的四個常見錯誤。通過避免這些錯誤,您應該能在代碼中正確使用 lambda 函數。
使用 lambda
函數的經驗準則是保持簡單以及只在本地使用一次。
原文鏈接:https://blog.csdn.net/lyc2016012170/article/details/122975024
相關推薦
- 2022-07-12 合理使用gateWay過濾器,實現Concroller自動注入用戶信息
- 2023-03-29 python中文字符如何轉url編碼_python
- 2022-12-12 C語言使用函數實現字符串部分復制問題_C 語言
- 2021-12-10 Qt?QFile文件操作的具體使用_C 語言
- 2021-12-15 C/C++?Qt?數據庫與Chart歷史數據展示_C 語言
- 2022-07-06 C語言實現可增容動態通訊錄詳細過程_C 語言
- 2022-04-17 python數據庫操作之sqlalchemy逆向工程
- 2022-08-01 Win?Server2016遠程桌面如何允許多用戶同時登錄_win服務器
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支