Python中的lambda是最有用、最重要、最有趣的特性之一。不幸的是,他們也很容易誤解和出錯。
在本文中,我們將解釋您需要了解的關於這些神祕函數的一切,如何使用它們,以及它們為什麼有用。
在深入研究這些實際示例之前,您可能希望設置一個Python虛擬環境。如果您甚至不想這樣做,那麼您至少應該使用交互式在線pyth***hell來嘗試這些示例。
lambda只是在Python中定義函數的一種方法。它們有時被稱為“lambda運算符”或“lambda函數”。
如果您以前使用過Python,那麼您可能已經使用def關鍵字定義了函數,到目前為止,它對您來說運行良好。那麼,為什麼還有其他方法來做同樣的事情呢?
區別在於lambda函數是匿名的。也就是說,它們是不需要命名的函數。它們用於創建小型的一次性函數,以防“真正的”函數太大和太大。
lambda返回一個可以分配給變量的函數對象。lambda可以有任意數量的參數,但它們只能有一個表達式。不能在lambdas中調用其他函數。
lambda函數最常見的用法是在需要一個簡單的單行函數的代碼中,如果要編寫一個完整的普通函數就太過了。下面的“Map、Filter和Reduce如何?”,將更詳細地介紹這一點。
在看lambda函數之前,讓我們先看一下用“傳統”方式定義的超基本函數:
def add_five(number): return number + 5 print(add_five(number=4))這個函數非常基本,但它用於說明lambdas。你的可能比這更復雜。此函數將通過number參數傳遞給它的任何數字加5。
以下是lambda函數的外觀:
add_five = lambda number: number + 5 print(add_five(number=4))使用lambda這個詞而不是def。不需要括號,但lambda關鍵字後面的任何單詞都將創建為參數。冒號用於分隔參數和表達式。在本例中,表達式是數字+5。
不需要使用return關鍵字——lambda會自動為您執行此操作。
下面是如何創建具有兩個參數的lambda函數:
add_numbers_and_five = lambda number1, number2: number1 + number2 + 5 print(add_numbers_and_five(number1=4, number2=3))如果你仍然不確定蘭博達斯的觀點,下一節將深入並幫助你看到光明。
Python核心庫有三個方法,分別是map、reduce和filter。這些方法可能是使用lambda函數的最佳理由。
map函數需要兩個參數:一個函數和一個列表。它接受該函數並將其應用於列表中的每個元素,將修改後的元素列表作為映射對象返回。list函數用於將生成的映射對象再次轉換回列表。
下面介紹如何在沒有lambda的情況下使用map:
list1 = [2, 4, 6, 8]print(list1)def add_five(number): return number + 5 new_list = list(map(add_five, list1))print(new_list)這個map函數非常方便,但可能更好。add\u five函數作為參數傳入,但是如果您不想每次使用map時都創建一個函數呢?你可以用lambda代替!
下面是相同代碼的樣子,只是函數被lambda替換了:
list1 = [2, 4, 6, 8]print(list1) new_list = list(map(lambda x: x + 5, list1))print(new_list)如您所見,不再需要整個add\u five函數。相反,lambda函數用於保持整潔。
使用過濾功能,過程大致相同。Filter接受一個函數並將其應用於列表中的每個元素,並創建一個新的列表,其中只包含導致函數返回True的元素。
首先,沒有lambdas:
numbers = [1, 4, 5, 10, 20, 30]print(numbers)def greater_than_ten_func(number): if number > 10: return True else: return Falsenew_numbers = list(filter(greater_than_ten_func, numbers)) print(new_numbers)這個代碼沒有問題,但是有點長了。讓我們看看lambda可以刪除多少行:
numbers = [1, 4, 5, 10, 20, 30]print(numbers)new_numbers = list(filter(lambda x: x > 10, numbers))print(new_numbers)lambda函數已經取代了對整個大於十個函數的需要!用五個簡單的詞就完成了。這就是lambda強大的原因:它們減少了簡單任務的混亂。
最後,讓我們看看reduce。Reduce是另一個很酷的Python函數。它對列表中的所有項應用滾動計算。你可以用它來計算總數,或者把所有的數字相乘:
from functools import reducenumbers = [10, 20, 30, 40]print(numbers)def summer(a, b): return a + b result = reduce(summer, numbers)print(result)這個例子需要從functools模塊導入reduce,但是不要擔心,functools模塊是Python核心庫的一部分。
故事與lambda非常相似,不需要函數:
from functools import reducenumbers = [10, 20, 30, 40]print(numbers) result = reduce(lambda a, b: a + b, numbers)print(result)這些示例展示了lambda函數以及Python核心庫中的map、filter和reduce是多麼容易。儘管如此,lambda函數還是有一些用處。
如果你做的不僅僅是一個基本的任務,或者你想調用其他的方法,使用一個普通的函數。lambda非常適合於一次性匿名函數,但它們必須只有一個表達式。如果您的lambda開始看起來像一個正則表達式,那麼可能是時候重構到一個專用的方法了。
有關更多提示,請查看我們的Python面向對象編程指南和Python初學者常見問題解答指南。
關鍵區別——ruby與python Ruby和Python是高階程式語言,因為它們遵循與英語語言相似的語法。因此,程式設計師很容易理解這些語言。Ruby和Python都是解釋語言。兩種語言都有大量的社群支援。Ruby和Python的一個主要優點是這些語...
Python風靡了編碼界。隨著這門新語言的興起,DIY電子領域也蓬勃發展。來自Arduino和Raspberry Pi等公司的開發板和單板計算機改變了人們生產家用電子產品的方式。如果你能用Python程式設計一個Arduino,那不是很棒嗎? ...
... Excel最有用的內建函式之一是計算一組數字的平均值。如果您以前沒有使用過Excel函式,您會對它的簡單性印象深刻。只需輸入函式名,選擇要應用該函式的單元格,然後按Enter鍵。 ...
如果您是一名Java程式設計師,並且有興趣瞭解更多關於Java8Lambda的知識,那麼在本文中,我們將更深入地瞭解lambda語法和用法。 ...
... 我希望您現在能更清楚地瞭解Arduino和Raspberry Pi之間的區別,以及為什麼在特定的應用程式中一種可能比另一種更好。在下面的評論中向我們展示一些Arduino/Pi專案! ...
... 所以,如果你想擁抱科技的世紀,你需要很好地瞭解谷歌及其產品。最好參加一個簡短的課程,讓你熟悉應用程式,特別是如果你是一個初學者。否則,有一張備忘單可能會有所幫助。不管是哪種方式,你都能很好地處...
...az是一位經驗豐富的JavaScript講師,他會帶您透過實踐練習瞭解變數和迴圈。不,你不會在3.5小時後成為專家,但你肯定會對應對未來更大的挑戰更有信心。 ...
...許您將JavaScript或Python的概念引入Haskell。如果你想更多地瞭解這門語言,學習Haskell是一個受歡迎的起點。 ...