Python中的lambda匿名函數詳解以及三種經典使用場景

lambda匿名函數

匿名函數,顧名思義就是不需要具體定義函數名的函數。我們首先拋開復雜的定義,看兩個具體例子。

先看一個無參數函數的例子。假設我們需要一個return 1的函數,如果使用普通的函數定義方式,其代碼為:

# 使用def關鍵字進行函數定義
def get_one():return 1# 輸出1
print(get_one())

如果我們使用lambda匿名函數,我們則不需要使用def關鍵字而改用lambda關鍵字,其代碼為:

# 使用lambda匿名函數進行函數定義
# 注意這里的get_one_lambda看似是一個變量名
# 但實際上是一個函數名
get_one_lambda = lambda: 1print(get_one_lambda)
# 輸出形如 <function <lambda> at 0x00000249F7AD7B00> 的結果
# 這一長串復雜的十六進制數是函數get_one_lambda的內存地址print(get_one_lambda())
# 在函數名get_one_lambda后面加上括號,才能正確地輸出1

把上述代碼進行合并操作,可以無需聲明函數名get_one_lambda,直接得到結果:

# 這里的(lambda: 1)等價于上面的函數名get_one_lambda
# (lambda: 1)()等價于get_one_lambda()
# 顯然get_one_lambda這個函數名是不必要的,故稱之為"lambda匿名函數"print(lambda: 1)        
# 輸出形如 <function <lambda> at 0x00000249F7AD7B00> 的結果
# 這一長串復雜的十六進制數是該匿名函數的內存地址print((lambda: 1)())
# 在匿名函數后面加上括號,才能正確地輸出1

再看一個有參數函數的例子。假設我們需要一個計算兩個參數xy相加return x+y的函數,如果使用普通的函數定義方式,其代碼為:

# 使用def關鍵字進行函數定義
def add(x, y):return x+y# 輸出30
print(add(10, 20))

如果我們使用lambda匿名函數,我們則不需要使用def關鍵字而改用lambda關鍵字,其代碼為:

# 使用lambda匿名函數進行函數定義
# 注意這里的get_one_lambda看似是一個變量名
# 但實際上是一個函數名
add_lambda = lambda x,y: x+yprint(add_lambda)        
# 輸出形如 <function <lambda> at 0x00000249F7AD7B00> 的結果
# 這一長串復雜的十六進制數是函數add_lambda的內存地址print(add_lambda(10, 20))
# 在函數名add_lambda后面加上括號并傳入參數,才能正確地輸出結果

把上述代碼進行合并操作,可以無需聲明函數名add_lambda,直接傳入兩個數字1020,得到結果:

# 這里的(lambda x,y: x+y)等價于上面的函數名add_lambda
# (lambda x,y: x+y)(10, 20)等價于add_lambda(10, 20)
# 顯然add_lambda這個函數名是不必要的,故稱之為"lambda匿名函數"print(lambda x,y: x+y)        
# 輸出形如 <function <lambda> at 0x00000249F7AD7B00> 的結果
# 這一長串復雜的十六進制數是該匿名函數的內存地址print((lambda x,y: x+y)(10, 20))
# 在匿名函數后面加上括號并傳入參數,才能正確地輸出結果

根據上述兩個例子已經能夠看出端倪了,有以下重要結論:

  1. lambda匿名函數本質上是一個函數,而不是一個變量,使用lambda匿名函數可以得到一個函數。
  2. 定義lambda匿名函數的語法為:lambda [形參]: 返回值,形參的數量可以為0,即支持定義無參數匿名函數。
  3. 使用lambda匿名函數的語法為:(lambda [形參]: 返回值) ([實參]),一般情況下,實參的數量應該和定義的形參數量一致。

*注:上述語句中的中括號[]表示非必須結構。

最后我們來看lambda匿名函數在算法題中的幾個經典用法。

  1. defaultdict()

使用內置模塊collections中的defaultdict(func),能夠將哈希表的值value的默認類型設置為func,其中func是某種數據類型****初始化函數的函數名,如intlistdict等等。

假設我們想要value的默認值為1,其中一種方法通過def關鍵字定義一個叫做get_one()的函數,并且將函數名get_one作為函數名傳入defaultdict(func)中。

from collections import defaultdict# 使用def關鍵字進行函數定義
def get_one():return 1# 哈希表d的value的默認值即為1
# 注意這里傳入的是函數名get_one,而不是調用函數get_one()
d = defaultdict(get_one)# 輸出1
print(d[0])

通過前面分析我們知道,get_one這個函數名實際上等同于lambda: 1,故我們不需要對get_one()顯式地進行定義,使用lambda匿名函數能夠使得代碼更加整潔。

from collections import defaultdict# 哈希表d1的value的默認值即為1
d_lambda = defaultdict(lambda: 1)# 輸出1
print(d_lambda[0])
  1. sort()方法或內置函數sorted()

sort()方法和內置函數sorted()均包含key參數,用來指定排序的依據。key參數傳入的也是一個函數名func,可以簡單理解為對列表中的所有元素均使用函數func后,以得到的結果為依據對原列表進行排序。

假設我們想要對字符串按照長度來排序,可以指定len()內置函數為排序依據。

lst = ["123", "4567", "0", "12", "789"]# 注意這里key參數傳入是函數名len,而不是調用函數len()
lst.sort(key = len)# 輸出['0', '12', '123', '789', '4567']
print(lst)

上述代碼也可以寫成lambda匿名函數的形式。

lst = ["123", "4567", "0", "12", "789"]# 注意這里key參數傳入是函數名len,而不是調用函數len()
lst.sort(key = lambda x: len(x))# 輸出['0', '12', '123', '789', '4567']
print(lst)

如果對于長度相同的字符串,我們還想要按照數字序降序排列,那么僅用len()函數是無法完成的,只能通過進一步完善lambda匿名函數來完成。

lst = ["123", "4567", "0", "12", "789"]# 注意這里key參數傳入是函數名len,而不是調用函數len()
lst.sort(key = lambda x: (len(x), -int(x)))# 輸出['0', '12', '789', '123', '4567']
print(lst)
  1. 內置函數map()

內置函數map(func, iter)包含兩個參數,分別是函數名func和可迭代對象iter。這里的func參數不僅可以傳入已有的內置函數或自定義函數的函數名,也可以直接用lambda匿名函數完成。

譬如想要對由二進制字符串組成的列表lst_bin中的每一個字符串用先導0填充至長度為4,如果我們使用def關鍵字定義一個叫做get_pre_0()的函數,可以這樣實現:

# 使用def關鍵字進行函數定義
# (4-len(s))能夠獲得應該填充的先導零"0"的個數
def get_pre_0(s):return (4-len(s))*"0" + slst_bin = ["10", "101", "1100", "1", "0"]# 注意這里key參數傳入是函數名get_pre_0,而不是調用函數get_pre_0()
lst_with_pre_0 = list(map(get_pre_0, lst_bin))# 輸出['0010', '0101', '1100', '0001', '0000']
print(lst_with_pre_0)

使用lambda匿名函數,無需具體定義函數get_pre_0(),亦可完成同樣操作。

lst_bin = ["10", "101", "1100", "1", "0"]# 使用lambda匿名函數,無需具體定義函數get_pre_0()
lst_with_pre_0_lambda = list(map(lambda x: (4-len(x))*"0" + x, lst_bin))# 輸出['0010', '0101', '1100', '0001', '0000']
print(lst_with_pre_0_lambda)

華為OD算法/大廠面試高頻題算法練習沖刺訓練

  • 華為OD算法/大廠面試高頻題算法沖刺訓練目前開始常態化報名!目前已服務100+同學成功上岸!

  • 課程講師為全網50w+粉絲編程博主@吳師兄學算法 以及小紅書頭部編程博主@閉著眼睛學數理化

  • 每期人數維持在20人內,保證能夠最大限度地滿足到每一個同學的需求,達到和1v1同樣的學習效果!

  • 60+天陪伴式學習,40+直播課時,300+動畫圖解視頻,300+LeetCode經典題,200+華為OD真題/大廠真題,還有簡歷修改、模擬面試、專屬HR對接將為你解鎖

  • 可上全網獨家的歐弟OJ系統練習華子OD、大廠真題

  • 可查看鏈接 大廠真題匯總 & OD真題匯總(持續更新)

  • 綠色聊天軟件戳 od1336了解更多

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

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

相關文章

vuepress-----20、全文搜索

默認主題自帶的搜索, 只會為頁面的標題、h2、h3 以及 tags構建搜索索引。所以盡量將圍繞知識點的關鍵字體現到標題上。而 tags 更為靈活&#xff0c;可以把相關的能想到的關鍵字都配置到 tags 中&#xff0c;以方便搜索。 默認插件介紹 (opens new window) 默認主體配置 (ope…

電子秤ADC芯片CS1237技術資料問題合集

問題11&#xff1a;實際應用中&#xff0c;多個稱重傳感器應該怎么與ADC連接&#xff1f; 解答&#xff1a;如果傳感器是測量同一物體&#xff08;例如&#xff1a;廚房垃圾處理器&#xff09;&#xff0c;一般建議使用并聯的方式。則相同類型的信號線連接在一起。對于傳感器的…

C語言指針基礎題(一)

目錄 例題一題目解析答案 例題二題目解析答案 例題三題目解析答案 例題四題目解析答案 例題五題目解析答案 例題六題目解析答案 例題七題目解析答案 感謝各位大佬對我的支持,如果我的文章對你有用,歡迎點擊以下鏈接 &#x1f412;&#x1f412;&#x1f412; 個人主頁 &#x…

C++ 教程 - 01 基礎篇

文章目錄 C介紹環境配置第一個cpp程序案例練習 變量常量關系運算符邏輯運算符條件運算符位運算符類型轉換分支循環程序調用綜合案例 C介紹 基于C語言&#xff0c;繼承了C的所有語法&#xff1b; 靜態類型語言&#xff0c;需要先編譯&#xff0c;再執行&#xff1b; 貼近底層硬…

雪花算法:分布式系統的關鍵藝術

導言 在探索分布式系統的奧秘時&#xff0c;我們經常遇到一個看似簡單卻極其關鍵的挑戰&#xff1a;如何高效、可靠地生成唯一的標識符&#xff08;ID&#xff09;。這不僅是技術的問題&#xff0c;更是一種藝術。讓我們深入探討雪花算法&#xff08;Snowflake Algorithm&…

windows下分卷解壓文件

我的文件是這樣的&#xff1a; 存放路徑為&#xff1a;C:\Users\Luli_study\MICCAI_MMAC\fudanuniversity\DDR dataset 首先要進入分卷文件的目錄cd&#xff1a; 第一步&#xff1a;cd /path/o/分卷問文件目錄 第二步&#xff1a; 執行之后的結果(紅色框出來的)&#xff1a; …

?functools --- 高階函數和可調用對象上的操作?

源代碼: Lib/functools.py functools 模塊應用于高階函數&#xff0c;即參數或&#xff08;和&#xff09;返回值為其他函數的函數。 通常來說&#xff0c;此模塊的功能適用于所有可調用對象。 functools 模塊定義了以下函數: functools.cache(user_function) 簡單輕量級未綁…

Vellum —— Fluid

目錄 Vellum fluids setups Fluid tips and troubleshooting Fluid phases Vellum fluids and soft bodies Vellum fluid vs FLIP fluid Vellum fluids setups Vellum fluid solver是基于粒子流體的解算框架&#xff0c;被完全集成到了Vellum動力學系統&#xff08;可與gr…

王道數據結構課后代碼題 p149 第3—— 7(c語言代碼實現)

目錄 3.編寫后序遍歷二叉樹的非遞歸算法 4.試給出二叉樹的自下而上、自右到左的層次遍歷算法 &#xff08;有圖解代碼詳解&#xff09;c語言代碼實現 5.假設二叉樹采用二叉鏈表存儲結構&#xff0c;設計一個非遞歸算法求二叉樹的高度。 ?編輯 6.設一棵二叉樹中各結點的值互不…

普冉(PUYA)單片機開發筆記(7): ADC-輪詢式多路采樣

概述 應用中經常會有使用單片機進行模數轉換的需求。PY32F003 具有 1 個 12 位的模擬數字轉換器&#xff08;ADC&#xff09;&#xff0c;今天我們一起來使用一下這個 ADC。 數據手冊中對 ADC 簡介如下。 SAR ADC&#xff1a;逐次逼近式 ADC&#xff0c;原理參見“參考鏈接&a…

1830_emacs lisp的交互式模式

org-mode的標記語法 Grey 全部學習匯總&#xff1a; GitHub - GreyZhang/g_org: my learning trip for org-mode 交互式模式 emacs的交互式模式讓我對emacs的生命力有了更進一步的認識&#xff0c;但是我并沒有找到什么特別豐富的資料做這方面的學習與分析。尤其是理論與實…

class070 子數組最大累加和問題與擴展-上【算法】

class070 子數組最大累加和問題與擴展-上【算法】 code1 53. 最大子數組和 // 累加和最大子數組和 // 給你一個整數數組 nums // 請你找出一個具有最大累加和的非空子數組 // 返回其最大累加和 // 測試鏈接 : https://leetcode.cn/problems/maximum-subarray/ dp[i]&#xff…

【Docker】Docker Compose,yml 配置指令參考的詳細講解

作者簡介&#xff1a; 辭七七&#xff0c;目前大二&#xff0c;正在學習C/C&#xff0c;Java&#xff0c;Python等 作者主頁&#xff1a; 七七的個人主頁 文章收錄專欄&#xff1a; 七七的閑談 歡迎大家點贊 &#x1f44d; 收藏 ? 加關注哦&#xff01;&#x1f496;&#x1f…

基于c++版數據結構基于數組棧改-Python思維總結

##棧部分-&#xff08;疊貓貓&#xff09; ##抽象數據類型棧的定義&#xff1a;是一種遵循先入后出的邏輯的線性數據結構。 換種方式去理解這種數據結構如果我們在一摞盤子中取到下面的盤子&#xff0c;我們首先要把最上面的盤子依次拿走&#xff0c;才可以繼續拿下面的盤子&…

【Java期末復習資料】(2)常見例題 //持續更新

本文章主要是常見例題&#xff0c;解析不會太詳細&#xff0c;有問題、不會的可以給我發消息哦&#xff0c;后續會出模擬卷 常見例題&#xff1a; 1.下列跟Java技術平臺有關的是&#xff08;ABD&#xff09; A.JVM B.JDK C.JPN D.JRE 2.面向對象的特征包括&#xff08;ACD&…

wxPython的控件tree

wxPython樹控件介紹 樹&#xff08;tree&#xff09;是一種通過層次結構展示信息的控件&#xff0c;如下圖所示是樹控件示例&#xff0c;左窗口中是樹控件&#xff0c;在wxPython中樹控件類是wx.TreeCtrl。 wx.TreeCtrl常用的方法有 AddRoot(text, image-1, selImage-1, data…

在Deepin中安裝x11vnc工具并結合內網穿透軟件實現遠程訪問桌面

文章目錄 1. 安裝x11vnc2. 本地遠程連接測試3. Deepin安裝Cpolar4. 配置公網遠程地址5. 公網遠程連接Deepin桌面6. 固定連接公網地址7. 固定公網地址連接測試 x11vnc是一種在Linux系統中實現遠程桌面控制的工具&#xff0c;它的原理是通過X Window系統的協議來實現遠程桌面的展…

P4 Qt如何添加qss樣式表文件和添加圖片資源

目錄 前言 01 添加圖片資源文件 02 添加qss文件 前言 &#x1f3ac; 個人主頁&#xff1a;ChenPi &#x1f43b;推薦專欄1: 《C_ChenPi的博客-CSDN博客》??? &#x1f525; 推薦專欄2: 《Qt基礎_ChenPi的博客-CSDN博客》??? &#x1f33a;本篇簡介 &#xff1a;這一章…

JVM Optimization Learning(六)

目錄 一、JVM Optimization 1、Shenandoah Shenandoah的使用方法 2、ZGC ZGC的版本更迭 ZGC的使用方法 ZGC的參數設置 3、JMH測試GC性能 一、JVM Optimization 1、Shenandoah Shenandoah是由Red Hat開發的一款低延遲的垃圾收集器&#xff0c;Shenandoah并發執行大部分…

機器人純阻抗控制接觸剛性環境(阻尼影響因素)

問題描述 在機器人學中&#xff0c;阻抗控制是一種常用的控制策略&#xff0c;用于管理機器人在與環境交互時的運動和力。阻抗控制背后的關鍵概念是將環境視為導納&#xff0c;而將機器人視為阻抗。 純阻抗控制接觸剛性環境時&#xff0c;機器人的行為方式主要受其阻抗參數的…