Python?lambda函數(shù)(匿名函數(shù))、參數(shù)類型與遞歸全解析
在 Python 中,函數(shù)是代碼組織的核心單元。除了基礎(chǔ)定義與調(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() # 輸出:1112. lambda 的經(jīng)典應(yīng)用:作為參數(shù)傳遞
lambda 函數(shù)常作為sorted()、map()、filter()等函數(shù)的參數(shù),簡化代碼邏輯。例如對復(fù)雜列表排序:
# 列表包含多個字典,需按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 練習(xí)題
結(jié)合基礎(chǔ)運算場景,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ù)定義順序傳遞,必須一一對應(yīng)。
關(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 42. 默認值參數(shù)
參數(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 33. 不定參數(shù):*args 與 **kwargs
當(dāng)參數(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)鍵點:
出口條件 :當(dāng)滿足某條件時,返回確定值(終止遞歸,避免無限循環(huán))。
規(guī)律(遞歸關(guān)系):將原問題拆解為規(guī)模更小的同類子問題。
注意:Python 默認遞歸深度不超過 1000 層,且遞歸效率較低,復(fù)雜場景建議用循環(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)推導(dǎo))
return 2 * f(n - 1) + f(n - 2)
print(f(5)) # 輸出:673(計算過程:f(2)=9, f(3)=22, f(4)=53, f(5)=128?實際按遞歸推導(dǎo)正確值)四、總結(jié)
本文講解的三大函數(shù)進階特性,適用場景各有側(cè)重:
lambda 函數(shù) :適合實現(xiàn)簡單邏輯,尤其作為參數(shù)傳遞時可簡化代碼。
靈活參數(shù)類型 :位置參數(shù)、關(guān)鍵字參數(shù)、不定參數(shù)和解包,讓傳參更靈活,適應(yīng)多變的輸入場景。
遞歸函數(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)貓狗圖像分類,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-04-04
Python實現(xiàn)腳本鎖功能(同時只能執(zhí)行一個腳本)
這篇文章主要介紹了Python實現(xiàn)腳本鎖功能(同時只能執(zhí)行一個腳本),本文給大家分享了兩種方法,大家可以根據(jù)個人所需選擇適合自己的方法2017-05-05
Python基礎(chǔ)語法中defaultdict的使用小結(jié)
Python的defaultdict是collections模塊中提供的一種特殊的字典類型,它與普通的字典(dict)有著相似的功能,本文主要介紹了Python基礎(chǔ)語法中defaultdict的使用小結(jié),感興趣的可以了解一下2025-04-04
linux mint中搜狗輸入法導(dǎo)致pycharm卡死的問題
這篇文章主要介紹了linux mint中搜狗輸入法導(dǎo)致pycharm卡死的問題,這篇文章給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-10-10

