Python?lambda函數(shù)(匿名函數(shù))、參數(shù)類型與遞歸全解析
在 Python 中,函數(shù)是代碼組織的核心單元。除了基礎定義與調(diào)用,lambda 匿名函數(shù)、靈活的參數(shù)類型以及遞歸函數(shù)等進階特性,能極大提升代碼的簡潔性與靈活性。本文結(jié)合實例代碼,詳細講解這些進階知識點,幫助你寫出更 Pythonic 的代碼。
一、lambda 匿名函數(shù):簡潔的單行函數(shù)
lambda 函數(shù)(匿名函數(shù))是一種簡化的函數(shù)形式,適用于實現(xiàn)簡單邏輯,其核心特點是 “一行代碼完成一個功能”。
1. lambda 的定義與基本用法
lambda 函數(shù)的語法格式:函數(shù)名 = lambda 形參列表: 表達式(函數(shù)體)
- 函數(shù)體只能是單一表達式(不能是多行代碼)
- 若有返回值,無需顯式寫
return
(表達式結(jié)果即為返回值)
""" lambda函數(shù)(匿名函數(shù)): 函數(shù)體只能是一句話 函數(shù)體如果是return返回值,return必須省略 lambda定義: test=lambda 形參列表: 一句函數(shù)體 """ # 普通函數(shù):兩數(shù)相加并打印 def test(a, b): print(a + b) # 等價的lambda函數(shù) test2 = lambda a, b: print(a + b) test2(1, 2) # 輸出:3 # lambda函數(shù)返回布爾值(判斷是否為偶數(shù)) test3 = lambda a: a % 2 == 0 print(test3(8)) # 輸出:True(8是偶數(shù)) # 無參數(shù)的lambda函數(shù) test4 = lambda: print(111) test4() # 輸出:111
2. lambda 的經(jīng)典應用:作為參數(shù)傳遞
lambda 函數(shù)常作為sorted()
、map()
、filter()
等函數(shù)的參數(shù),簡化代碼邏輯。例如對復雜列表排序:
# 列表包含多個字典,需按age和height排序 ls = [ {'name': 'mary', 'age': '20', 'height': 175}, {'name': 'tom', 'age': '15', 'height': 168}, {'name': 'jack', 'age': '18', 'height': 183}, {'name': 'rose', 'age': '15', 'height': 160}, ] # 使用lambda指定排序規(guī)則:先按age升序,再按height升序 sorted_ls = sorted(ls, key=lambda dic: (dic['age'], dic['height']), reverse=False) print(sorted_ls) # 輸出結(jié)果中,age=15的元素按height從小到大排列(rose在前,tom在后)
此處 lambda 函數(shù)lambda dic: (dic['age'], dic['height'])
作為key
參數(shù),定義了排序的依據(jù),代碼比單獨定義函數(shù)更簡潔。
3. 常見 lambda 練習題
結(jié)合基礎運算場景,lambda 函數(shù)可快速實現(xiàn)簡單邏輯:
''' 1. 使用匿名函數(shù)計算一個數(shù)的立方。 2. 定義一個匿名函數(shù),判斷一個數(shù)是否為偶數(shù)。 3. 定義一個匿名函數(shù),返回三個參數(shù)的乘積。 ''' # 1. 計算立方 test1 = lambda x: x **3 print(test1(2)) # 輸出:8(23=8) # 2. 判斷偶數(shù) test2 = lambda x: x % 2 == 0 print(test2(6)) # 輸出:True(6是偶數(shù)) # 3. 三個參數(shù)乘積 test3 = lambda x, y, z: x * y * z print(test3(1, 2, 3)) # 輸出:6(1×2×3=6)
二、函數(shù)參數(shù)類型:靈活傳遞的藝術(shù)
Python 函數(shù)的參數(shù)類型非常靈活,支持位置參數(shù)、關(guān)鍵字參數(shù)、默認值參數(shù)、不定參數(shù)等,滿足不同場景的傳參需求。
1. 位置參數(shù)與關(guān)鍵字參數(shù)
位置參數(shù) :按參數(shù)定義順序傳遞,必須一一對應。
關(guān)鍵字參數(shù) :通過param=val
形式傳遞,無需考慮順序;*
后的參數(shù)必須用關(guān)鍵字傳遞。
# 函數(shù)定義:*后的參數(shù)c必須用關(guān)鍵字傳遞 def test1(a, b, *, c): print(a, b, c) # 合法調(diào)用(前兩個位置參數(shù),c用關(guān)鍵字) test1(1, 2, c=5) # 輸出:1 2 5 # 關(guān)鍵字參數(shù)可打亂順序 test1(b=2, a=1, c=4) # 輸出:1 2 4
2. 默認值參數(shù)
參數(shù)可設置默認值,調(diào)用時若不傳遞則使用默認值(默認參數(shù)必須放在位置參數(shù)后)。
def test2(a, b=3): # b的默認值為3 print(a, b) test2(1, 9) # 傳遞b=9,輸出:1 9 test2(1) # 不傳遞b,使用默認值,輸出:1 3
3. 不定參數(shù):*args 與 **kwargs
當參數(shù)數(shù)量不確定時,可使用不定參數(shù):
*args
:收集所有位置參數(shù),打包為元組。**kwargs
:收集所有關(guān)鍵字參數(shù),打包為字典。
def test3(*args, **kwargs): print("位置參數(shù)打包為元組:", args) print("關(guān)鍵字參數(shù)打包為字典:", kwargs) # 傳遞3個位置參數(shù)和2個關(guān)鍵字參數(shù) test3(1, 2, 3, a=4, b=5) # 輸出: # 位置參數(shù)打包為元組: (1, 2, 3) # 關(guān)鍵字參數(shù)打包為字典: {'a': 4, 'b': 5} # 不傳遞參數(shù)(也合法) test3() # 輸出: # 位置參數(shù)打包為元組: () # 關(guān)鍵字參數(shù)打包為字典: {}
4. 解包傳遞:從數(shù)據(jù)結(jié)構(gòu)中提取參數(shù)
若參數(shù)存儲在列表、元組、字典等結(jié)構(gòu)中,可通過解包快速傳遞:
- 列表 / 元組 / 集合:用
*
解包為位置參數(shù)。 - 字典:用
**
解包為關(guān)鍵字參數(shù)(鍵需與函數(shù)參數(shù)名一致)。
# 從列表和字典中解包參數(shù) test3(*[10, 20, 30], **{'a': 1, 'b': 2}) # 等價于 test3(10, 20, 30, a=1, b=2) # 輸出: # 位置參數(shù)打包為元組: (10, 20, 30) # 關(guān)鍵字參數(shù)打包為字典: {'a': 1, 'b': 2}
三、遞歸函數(shù):自己調(diào)用自己的藝術(shù)
遞歸是指函數(shù)內(nèi)部調(diào)用自身的編程技巧,適用于有明確規(guī)律且可拆解為同類子問題的場景(如階乘、數(shù)列計算)。
1. 遞歸的核心要素
寫遞歸函數(shù)需明確兩個關(guān)鍵點:
出口條件 :當滿足某條件時,返回確定值(終止遞歸,避免無限循環(huán))。
規(guī)律(遞歸關(guān)系):將原問題拆解為規(guī)模更小的同類子問題。
注意:Python 默認遞歸深度不超過 1000 層,且遞歸效率較低,復雜場景建議用循環(huán)替代。
2. 遞歸實例解析
實例 1:階乘計算(n! = n × (n-1) × ... × 1)
# 階乘的遞歸實現(xiàn) def jc(n): # 出口:n=1時,1! = 1 if n == 1: return 1 # 規(guī)律:n! = n × (n-1)! return n * jc(n - 1) # 執(zhí)行過程: # jc(5) = 5 × jc(4) # jc(4) = 4 × jc(3) # jc(3) = 3 × jc(2) # jc(2) = 2 × jc(1) # jc(1) = 1 print(jc(5)) # 輸出:120(5! = 120)
實例 2:斐波那契數(shù)列(1, 1, 2, 3, 5, 8...,第 n 項 = 前兩項之和)
def feibo(n): # 出口:第1項和第2項均為1 if n == 1 or n == 2: return 1 # 規(guī)律:第n項 = 第n-1項 + 第n-2項 return feibo(n - 1) + feibo(n - 2) print(feibo(5)) # 輸出:5(第5項為5) # 執(zhí)行過程: # feibo(5) = feibo(4) + feibo(3) # feibo(4) = feibo(3) + feibo(2) = 2 + 1 = 3 # feibo(3) = feibo(2) + feibo(1) = 1 + 1 = 2
實例 3:自定義數(shù)列(f (0)=1, f (1)=4, f (n+2)=2×f (n+1)+f (n))
# 求f(10)的值 def f(n): # 出口:n=0返回1,n=1返回4 if n == 0: return 1 if n == 1: return 4 # 規(guī)律:f(n) = 2×f(n-1) + f(n-2)(由f(n+2)=2×f(n+1)+f(n)推導) return 2 * f(n - 1) + f(n - 2) print(f(5)) # 輸出:673(計算過程:f(2)=9, f(3)=22, f(4)=53, f(5)=128?實際按遞歸推導正確值)
四、總結(jié)
本文講解的三大函數(shù)進階特性,適用場景各有側(cè)重:
lambda 函數(shù) :適合實現(xiàn)簡單邏輯,尤其作為參數(shù)傳遞時可簡化代碼。
靈活參數(shù)類型 :位置參數(shù)、關(guān)鍵字參數(shù)、不定參數(shù)和解包,讓傳參更靈活,適應多變的輸入場景。
遞歸函數(shù):適合有明確規(guī)律的問題(如數(shù)列、樹結(jié)構(gòu)遍歷),但需注意深度限制和效率問題。
到此這篇關(guān)于Python lambda函數(shù)(匿名函數(shù))、參數(shù)類型與遞歸全解析的文章就介紹到這了,更多相關(guān)Python lambda函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- python匿名函數(shù)之lambda函數(shù)詳解
- python中l(wèi)ambda函數(shù)詳解及用法舉例
- Python函數(shù)sort()與sorted()的區(qū)別及key=lambda?x:x[]的理解
- python之lambda表達式與sort函數(shù)中的key用法
- Python如何使用帶有?for?循環(huán)的?Lambda?函數(shù)
- Python lambda匿名函數(shù)深入講解
- python中的lambda函數(shù)用法指南
- Python Lambda函數(shù)使用總結(jié)詳解
- Python的Lambda函數(shù)用法詳解
- 詳解Python匿名函數(shù)(lambda函數(shù))
相關(guān)文章
tensorflow+k-means聚類簡單實現(xiàn)貓狗圖像分類的方法
這篇文章主要介紹了tensorflow+k-means聚類簡單實現(xiàn)貓狗圖像分類,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-04-04Python實現(xiàn)腳本鎖功能(同時只能執(zhí)行一個腳本)
這篇文章主要介紹了Python實現(xiàn)腳本鎖功能(同時只能執(zhí)行一個腳本),本文給大家分享了兩種方法,大家可以根據(jù)個人所需選擇適合自己的方法2017-05-05Python基礎語法中defaultdict的使用小結(jié)
Python的defaultdict是collections模塊中提供的一種特殊的字典類型,它與普通的字典(dict)有著相似的功能,本文主要介紹了Python基礎語法中defaultdict的使用小結(jié),感興趣的可以了解一下2025-04-04linux mint中搜狗輸入法導致pycharm卡死的問題
這篇文章主要介紹了linux mint中搜狗輸入法導致pycharm卡死的問題,這篇文章給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-10-10