Lambda 函數簡介
Lambda函數也被稱為匿名(沒有名稱)函數,它直接接受參數的數量以及使用該參數執行的條件或操作,此參數以冒號分隔,並傳回最終結果。為了在大型程式碼庫上編寫程式碼時執行一項小任務,或在函數中執行一項小任務,便在正常過程中使用lambda函數。
lambda argument_list:expersion
argument_list是參數列表,它的結構與Python中函數(function)的參數列表是一樣的
a,b a=1,b=2 *args **kwargs a,b=1,*args 空 ....
expression是一個關於參數的表達式,表達式中出現的參數需要在argument_list中有定義,且表達式只能是單行的。
1 None a+b sum(a) 1 if a >10 else 0 [i for i in range(10)] ...
普通函數和Lambda函數的區別
- 沒有名稱Lambda函數沒有名稱,而普通運算有一個合適的名稱。
- Lambda函數沒有傳回值使用def關鍵字建立的普通函數傳回值或序列資料類型,但在Lambda函數中傳回一個完整的過程。假設我們想要檢查數字是偶數還是奇數,使用lambda函數語法類似下面的程式碼片段。
b = lambda x: "Even" if x%2==0 else "Odd" b(9)
- 函數只在一行中Lambda函數只在一行中編寫和創建,而在普通函數的中使用縮排
- 不用於程式碼重用Lambda函數不能用於程式碼重用,或不能在任何其他檔案中匯入這個函數。相反,普通函數用於程式碼重用,可以在外部文件中使用。
為什麼要使用Lambda函數?
在一般情況下,我們不使用Lambda函數,而是將其與高階函數一起使用。高階函數是一種需要多個函數來完成任務的函數,或者當一個函數傳回任何另一個函數時,可以選擇使用Lambda函數。
什麼是高階函數?
透過一個例子來理解高階函數。假設有一個整數列表,必須傳回三個輸出。
- 一個列表中所有偶數的和
- 一個列表中所有奇數的和
- 一個所有能被三整除的數的和
首先假設用普通函數來處理這個問題。在這種情況下,將宣告三個不同的變數來儲存各個任務,並使用一個for迴圈處理並傳回結果三個變數。此方法常規可正常運作。
現在使用Lambda函數來解決這個問題,那麼可以用三個不同的Lambda函數來檢查一個待檢驗數是否是偶數,奇數,還是能被三整除,然後在結果中加上一個數。
def return_sum(func, lst): result = 0 for i in lst: #if val satisfies func if func(i): result = result + i return result lst = [11,14,21,56,78,45,29,28] x = lambda a: a%2 == 0 y = lambda a: a%2 != 0 z = lambda a: a%3 == 0 print(return_sum(x, lst)) print(return_sum(y, lst)) print(return_sum(z, lst))
這裡創建了一個高階函數,其中Lambda函數作為一個部分傳遞給普通函數。其實這種類型的程式碼在網路上隨處可見。然而很多人在使用Python時都會忽略這個函數,或者只是偶爾使用它,但其實這些函數真的非常方便,同時也可以節省更多的程式碼行。接下來我們一起來看看這些高階函數。
Python內建高階函數
Map函數
map() 會根據提供的函數對指定序列做映射。
Map函數是一個接受兩個參數的函數。第一個參數 function 以參數序列中的每一個元素呼叫 function 函數,第二個是任何可迭代的序列資料類型。傳回包含每次 function 函數傳回值的新清單。
map(function, iterable, ...)
Map函數將定義在迭代器物件中的某種類型的操作。假設我們要將陣列元素進行平方運算,即將一個陣列的每個元素的平方映射到另一個產生所需結果的陣列。
arr = [2,4,6,8] arr = list(map(lambda x: x*x, arr)) print(arr)
我們可以用不同的方式使用Map函數。假設有一個包含名稱、地址等詳細資訊的字典列表,目標是產生一個包含所有名稱的新列表。
students = [ {"name": "John Doe", "father name": "Robert Doe", "Address": "123 Hall street" }, { "name": "Rahul Garg", "father name": "Kamal Garg", "Address": "3-Upper-Street corner" }, { "name": "Angela Steven", "father name": "Jabob steven", "Address": "Unknown" } ] print(list(map(lambda student: student['name'], students))) >>> ['John Doe', 'Rahul Garg', 'Angela Steven']
上述操作通常出現在從資料庫或網路抓取取得資料等場景。
Filter函數
Filter函數根據給定的特定條件過濾掉資料。即在函數中設定篩選條件,迭代元素,保留傳回值為True 的元素。 Map 函數對每個元素進行操作,而 filter 函數僅輸出符合特定要求的元素。
假設有一個水果名稱列表,任務是只輸出那些名稱中包含字元「g」的名稱。
fruits = ['mango', 'apple', 'orange', 'cherry', 'grapes'] print(list(filter(lambda fruit: 'g' in fruit, fruits)))
filter(function or None, iterable) --> filter object
傳回一個迭代器,為那些函數或項為真的可迭代項。如果函數為None,則傳回為真的項。
Reduce函數
這個函數比較特別,不是 Python 的內建函數,需要透過from functools import reduce 導入。 Reduce 從序列資料結構傳回單一輸出值,它透過應用給定的函數來減少元素。
reduce(function, sequence[, initial]) -> value
將包含兩個參數的函數(function)累積應用於序列(sequence)的項,從左到右,從而將序列reduce至單一值。
如果存在initial,則將其放在專案之前的序列,並作為預設值時序列是空的。
假设有一个整数列表,并求得所有元素的总和。且使用reduce函数而不是使用for循环来处理此问题。
from functools import reduce lst = [2,4,6,8,10] print(reduce(lambda x, y: x+y, lst)) >>> 30
还可以使用 reduce 函数而不是for循环从列表中找到最大或最小的元素。
lst = [2,4,6,8] # 找到最大元素 print(reduce(lambda x, y: x if x>y else y, lst)) # 找到最小元素 print(reduce(lambda x, y: x if x<y else y, lst))
高阶函数的替代方法
列表推导式
其实列表推导式只是一个for循环,用于添加新列表中的每一项,以从现有索引或一组元素创建一个新列表。之前使用map、filter和reduce完成的工作也可以使用列表推导式完成。然而,相比于使用Map和filter函数,很多人更喜欢使用列表推导式,也许是因为它更容易应用和记忆。
同样使用列表推导式将数组中每个元素进行平方运算,水果的例子也可以使用列表推导式来解决。
arr = [2,4,6,8] arr = [i**2 for i in arr] print(arr) fruit_result = [fruit for fruit in fruits if 'g' in fruit] print(fruit_result)
字典推导式
与列表推导式一样,使用字典推导式从现有的字典创建一个新字典。还可以从列表创建字典。
假设有一个整数列表,需要创建一个字典,其中键是列表中的每个元素,值是列表中的每个元素的平方。
lst = [2,4,6,8] D1 = {item:item**2 for item in lst} print(D1) >>> {2: 4, 4: 16, 6: 36, 8: 64} # 创建一个只包含奇数元素的字典 arr = [1,2,3,4,5,6,7,8] D2 = {item: item**2 for item in arr if item %2 != 0} print(D2) >>> {1: 1, 3: 9, 5: 25, 7: 49}
一个简单应用
如何快速找到多个字典的公共键
方法一
dl = [d1, d2, d3] # d1, d2, d3为字典,目标找到所有字典的公共键 [k for k in dl[0] if all(map(lambda d: k in d, dl[1:]))]
例
dl = [{1:'life', 2: 'is'}, {1:'short', 3: 'i'}, {1: 'use', 4: 'python'}] [k for k in dl[0] if all(map(lambda d: k in d, dl[1:]))] # 1
解析
# 列表表达式遍历dl中第一个字典中的键 [k for k in dl[0]] # [1, 2] # lambda 匿名函数判断字典中的键,即k值是否在其余字典中 list(map(lambda d: 1 in d, dl[1:])) # [True, True] list(map(lambda d: 2 in d, dl[1:])) #[False, False] # 列表表达式条件为上述结果([True, True])全为True,则输出对应的k值 #1
方法二
# 利用集合(set)的交集操作 from functools import reduce # reduce(lambda a, b: a*b, range(1,11)) # 10! reduce(lambda a, b: a & b, map(dict.keys, dl))
写在最后
目前已经学习了Lambda函数是什么,以及Lambda函数的一些使用方法。随后又一起学习了Python中的高阶函数,以及如何在高阶函数中使用lambda函数。
除此之外,还学习了高阶函数的替代方法:在列表推导式和字典推导式中执行之前操作。虽然这些方法看似简单,或者说你之前已经见到过这类方法,但你很可能很少使用它们。你可以尝试在其他更加复杂的函数中使用它们,以便使代码更加简洁。
以上是Python 中的萬能之王 Lambda 函數的詳細內容。更多資訊請關注PHP中文網其他相關文章!

Python和C 各有優勢,選擇應基於項目需求。 1)Python適合快速開發和數據處理,因其簡潔語法和動態類型。 2)C 適用於高性能和系統編程,因其靜態類型和手動內存管理。

選擇Python還是C 取決於項目需求:1)如果需要快速開發、數據處理和原型設計,選擇Python;2)如果需要高性能、低延遲和接近硬件的控制,選擇C 。

通過每天投入2小時的Python學習,可以有效提升編程技能。 1.學習新知識:閱讀文檔或觀看教程。 2.實踐:編寫代碼和完成練習。 3.複習:鞏固所學內容。 4.項目實踐:應用所學於實際項目中。這樣的結構化學習計劃能幫助你係統掌握Python並實現職業目標。

在兩小時內高效學習Python的方法包括:1.回顧基礎知識,確保熟悉Python的安裝和基本語法;2.理解Python的核心概念,如變量、列表、函數等;3.通過使用示例掌握基本和高級用法;4.學習常見錯誤與調試技巧;5.應用性能優化與最佳實踐,如使用列表推導式和遵循PEP8風格指南。

Python適合初學者和數據科學,C 適用於系統編程和遊戲開發。 1.Python簡潔易用,適用於數據科學和Web開發。 2.C 提供高性能和控制力,適用於遊戲開發和系統編程。選擇應基於項目需求和個人興趣。

Python更適合數據科學和快速開發,C 更適合高性能和系統編程。 1.Python語法簡潔,易於學習,適用於數據處理和科學計算。 2.C 語法複雜,但性能優越,常用於遊戲開發和系統編程。

每天投入兩小時學習Python是可行的。 1.學習新知識:用一小時學習新概念,如列表和字典。 2.實踐和練習:用一小時進行編程練習,如編寫小程序。通過合理規劃和堅持不懈,你可以在短時間內掌握Python的核心概念。

Python更易學且易用,C 則更強大但複雜。 1.Python語法簡潔,適合初學者,動態類型和自動內存管理使其易用,但可能導致運行時錯誤。 2.C 提供低級控制和高級特性,適合高性能應用,但學習門檻高,需手動管理內存和類型安全。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

禪工作室 13.0.1
強大的PHP整合開發環境