如何寫好?Python?的?Lambda?函數(shù)
前言:
Lambda 函數(shù)是 Python 中的匿名函數(shù)。當你需要完成一件小工作時,在本地環(huán)境中使用它們可以讓工作得心應(yīng)手。有些人將它們簡稱為 lambdas,它們的語法如下:
lambda arguments: expression
lambda 關(guān)鍵字可以用來創(chuàng)建一個 lambda 函數(shù),緊跟其后的是參數(shù)列表和用冒號分割開的單個表達式。例如,lambda x: 2 * x 是將任何輸入的數(shù)乘2,而 lambda x, y: x+y 是計算兩個數(shù)字的和。語法十分直截了當,對吧?
假設(shè)您知道什么是 lambda 函數(shù),本文旨在提供有關(guān)如何正確使用 lambda 函數(shù)的一些常規(guī)準則。
1. 不要返回任何值
看看語法,您可能會注意到我們在 lambda 函數(shù)中并沒有返回任何內(nèi)容。這都是因為 lambda 函數(shù)只能包含一個表達式。然而,使用 return 關(guān)鍵字會構(gòu)成不符合規(guī)定語法的語句,如下所示:
>>> integers = [(3, -3), (2, 3), (5, 1), (-4, 4)] >>> sorted(integers, key=lambda x: x[-1]) [(3, -3), (5, 1), (2, 3), (-4, 4)] >>> sorted(integers, key=lambda x: return x[-1]) ...? ? File "<input>", line 1 ? ? sorted(integers, key=lambda x: return x[-1]) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?^ SyntaxError: invalid syntax
該錯誤可能是由于無法區(qū)分表達式和語句而引起的。像是包含 return、try、 with 以及 if 的語句會執(zhí)行特殊動作。然而,表達式指的是那些可以被計算出一個值的表達,例如數(shù)值或其他 Python 對象。
通過使用 lambda 函數(shù),單個表達式會被計算為一個值并且參與后續(xù)的計算,例如由 sorted 函數(shù)排序。
2. 不要忘記更好的選擇
lambda 函數(shù)最常見的使用場景是將它作為一些內(nèi)置工具函數(shù)中 key 的實參,比如上面展示的 sorted() 和 max()。根據(jù)情況,我們可以使用其他替代方法。
思考下面的例子:
>>> integers = [-4, 3, 7, -5, -2, 6] >>> sorted(integers, key=lambda x: abs(x)) [-2, 3, -4, -5, 6, 7] >>> sorted(integers, key=abs) [-2, 3, -4, -5, 6, 7] >>> scores = [(93, 100), (92, 99), (95, 94)] >>> max(scores, key=lambda x: x[0] + x[1]) (93, 100) >>> max(scores, key=sum) (93, 100)
在數(shù)據(jù)科學(xué)領(lǐng)域,很多人使用 pandas 庫來處理數(shù)據(jù)。如下所示,我們可以使用 lambda 函數(shù)通過 map() 函數(shù)從現(xiàn)有數(shù)據(jù)中創(chuàng)建新數(shù)據(jù)。除了使用 lambda 函數(shù)外,我們還可以直接使用算術(shù)函數(shù),因為 pandas
是支持的:
>>> import pandas as pd >>> data = pd.Series([1, 2, 3, 4]) >>> data.map(lambda x: x + 5) 0 ? ?6 1 ? ?7 2 ? ?8 3 ? ?9 dtype: int64 >>> data + 5 0 ? ?6 1 ? ?7 2 ? ?8 3 ? ?9 dtype: int64
3. 不要將它賦值給變量
我曾見過一些人將 lambda
函數(shù)誤認為是簡單函數(shù)的另一種聲明方式,我們可能也見過有人像下面這么做:
>>> doubler = lambda x: 2 * x >>> doubler(5) 10 >>> doubler(7) 14 >>> type(doubler) <class 'function'>
對 lambda 函數(shù)命名的唯一作用可能是出于教學(xué)目的,以表明 lambda 函數(shù)的確是和其他函數(shù)一樣的函數(shù)——可以被調(diào)用并且具有某種功能。除此之外,我們不應(yīng)該將 lambda 函數(shù)賦值給變量。
為 lambda 函數(shù)命名的問題在于這使得調(diào)試不那么直觀。與其他的使用常規(guī) def 關(guān)鍵字創(chuàng)建的函數(shù)不同,lambda 函數(shù)沒有名字,這也是為什么有時它們被稱為匿名函數(shù)的原因。思考下面簡單的例子,找出細微的區(qū)別:
>>> inversive0 = lambda x: 1 / x >>> inversive0(2) 0.5 >>> inversive0(0) Traceback (most recent call last): ? File "<input>", line 1, in <module> ? File "<input>", line 1, in <lambda> ZeroDivisionError: division by zero >>> def inversive1(x): ... ? ? return 1 / x ...? >>> inversive1(2) 0.5 >>> inversive1(0) Traceback (most recent call last): ? File "<input>", line 1, in <module> ? File "<input>", line 2, in inversive1 ZeroDivisionError: division by zero
當我們的代碼存在關(guān)于 lambda 函數(shù)的問題(即 inversive0
),Traceback 錯誤信息只會提示您 lambda 函數(shù)存在問題。
相比之下,使用正常定義的函數(shù),Traceback會清晰地提示您有問題的函數(shù)(即 inversive1
)。
與此相關(guān),如果您想多次使用 lambda 函數(shù),最佳實踐是使用通過 def 定義的允許使用文檔字符串的常規(guī)函數(shù)。
4. 不要忘記列表推導(dǎo)式
有些人喜歡將 lambda 函數(shù)和高階函數(shù)一起使用,比如 map 或 filter。思考下面用法示例:
>>> # 創(chuàng)建一個數(shù)字列表 >>> numbers = [2, 1, 3, -3] >>> # 使用帶有 lambda 函數(shù)的 map 函數(shù) >>> list(map(lambda x: x * x, numbers)) [4, 1, 9, 9] >>> # 使用帶有 lambda 函數(shù)的 filter 函數(shù) >>> list(filter(lambda x: x % 2, numbers)) [1, 3, -3]
我們可以使用可讀性更強的列表推導(dǎo)式代替 lambda 函數(shù)。如下所示,我們使用列表推導(dǎo)式來創(chuàng)建相同的列表對象。如所見,與列表推導(dǎo)式相比,之前將 map 或 filter 函數(shù)與 lambda 函數(shù)一起使用更麻煩。因此,在創(chuàng)建涉及高階函數(shù)的列表時,應(yīng)考慮使用列表推導(dǎo)式。
>>> # Use list comprehensions >>> [x * x for x in numbers] [4, 1, 9, 9] >>> [x for x in numbers if x % 2] [1, 3, -3]
結(jié)論
在本文中,我們回顧了使用 lambda 函數(shù)可能會犯的四個常見錯誤。通過避免這些錯誤,您應(yīng)該能在代碼中正確使用 lambda 函數(shù)。
使用 lambda
函數(shù)的經(jīng)驗準則是保持簡單以及只在本地使用一次。
到此這篇關(guān)于如何寫好 Python 的 Lambda 函數(shù)的文章就介紹到這了,更多相關(guān)Python 的 Lambda 函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python可視化學(xué)習之seaborn繪制線型回歸曲線
這篇文章主要為大家介紹了如何利用seaborn繪制變量之間線型回歸(linear regression)曲線,2文中涉及如下兩個重要函數(shù):seaborn.regplot和seaborn.lmplot,感興趣的小伙伴可以跟隨小編一起學(xué)習一下2022-02-02Python selenium 自動化腳本打包成一個exe文件(推薦)
這篇文章主要介紹了Python selenium 自動化腳本打包成一個exe文件,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2020-01-01python實現(xiàn)指定文件夾下的指定文件移動到指定位置
這篇文章主要為大家詳細介紹了python實現(xiàn)指定文件夾下的指定文件移動到指定位置,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-09-09Python實現(xiàn)查找匹配項作處理后再替換回去的方法
這篇文章主要介紹了Python實現(xiàn)查找匹配項作處理后再替換回去的方法,涉及Python字符串查找、轉(zhuǎn)換、輸出等相關(guān)操作技巧,需要的朋友可以參考下2017-06-06導(dǎo)入tensorflow時報錯:cannot import name ''abs''的解決
這篇文章主要介紹了導(dǎo)入tensorflow時報錯:cannot import name 'abs'的解決,文中介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧2019-10-10深入理解Python虛擬機中復(fù)數(shù)(complex)的實現(xiàn)原理及源碼剖析
在本篇文章當中主要給大家介紹在 cpython 虛擬機當中是如何實現(xiàn) 復(fù)數(shù) complex 這個數(shù)據(jù)類型的,這個數(shù)據(jù)類型在 cpython 當中一應(yīng)該是一個算比較簡單的數(shù)據(jù)類型了,非常容易理解2023-03-03python爬取網(wǎng)站數(shù)據(jù)保存使用的方法
這篇文章主要介紹了使用Python從網(wǎng)上爬取特定屬性數(shù)據(jù)保存的方法,其中解決了編碼問題和如何使用正則匹配數(shù)據(jù)的方法,詳情看下文2013-11-11python執(zhí)行系統(tǒng)命令4種方法與比較
這篇文章主要介紹了python執(zhí)行系統(tǒng)命令4種方法與比較,需要的朋友可以參考下2021-04-04