溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

怎么寫好Python的Lambda函數(shù)

發(fā)布時(shí)間:2022-03-30 12:24:24 來源:億速云 閱讀:148 作者:小新 欄目:開發(fā)技術(shù)

小編給大家分享一下怎么寫好Python的Lambda函數(shù),相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

前言:

Lambda 函數(shù)是 Python 中的匿名函數(shù)。當(dāng)你需要完成一件小工作時(shí),在本地環(huán)境中使用它們可以讓工作得心應(yīng)手。有些人將它們簡(jiǎn)稱為 lambdas,它們的語法如下:

lambda arguments: expression

lambda 關(guān)鍵字可以用來創(chuàng)建一個(gè) lambda 函數(shù),緊跟其后的是參數(shù)列表和用冒號(hào)分割開的單個(gè)表達(dá)式。例如,lambda x: 2 * x 是將任何輸入的數(shù)乘2,而 lambda x, y: x+y 是計(jì)算兩個(gè)數(shù)字的和。語法十分直截了當(dāng),對(duì)吧?

假設(shè)您知道什么是 lambda 函數(shù),本文旨在提供有關(guān)如何正確使用 lambda 函數(shù)的一些常規(guī)準(zhǔn)則。

1. 不要返回任何值

看看語法,您可能會(huì)注意到我們?cè)?lambda 函數(shù)中并沒有返回任何內(nèi)容。這都是因?yàn)?lambda 函數(shù)只能包含一個(gè)表達(dá)式。然而,使用 return 關(guān)鍵字會(huì)構(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

該錯(cuò)誤可能是由于無法區(qū)分表達(dá)式和語句而引起的。像是包含 return、try、 with 以及 if 的語句會(huì)執(zhí)行特殊動(dòng)作。然而,表達(dá)式指的是那些可以被計(jì)算出一個(gè)值的表達(dá),例如數(shù)值或其他 Python 對(duì)象。

通過使用 lambda 函數(shù),單個(gè)表達(dá)式會(huì)被計(jì)算為一個(gè)值并且參與后續(xù)的計(jì)算,例如由 sorted 函數(shù)排序。

2. 不要忘記更好的選擇

lambda 函數(shù)最常見的使用場(chǎng)景是將它作為一些內(nèi)置工具函數(shù)中 key 的實(shí)參,比如上面展示的 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 庫(kù)來處理數(shù)據(jù)。如下所示,我們可以使用 lambda 函數(shù)通過 map() 函數(shù)從現(xiàn)有數(shù)據(jù)中創(chuàng)建新數(shù)據(jù)。除了使用 lambda 函數(shù)外,我們還可以直接使用算術(shù)函數(shù),因?yàn)?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ù)誤認(rèn)為是簡(jiǎn)單函數(shù)的另一種聲明方式,我們可能也見過有人像下面這么做:

>>> doubler = lambda x: 2 * x
>>> doubler(5)
10
>>> doubler(7)
14
>>> type(doubler)
<class 'function'>

對(duì) lambda 函數(shù)命名的唯一作用可能是出于教學(xué)目的,以表明 lambda 函數(shù)的確是和其他函數(shù)一樣的函數(shù)&mdash;&mdash;可以被調(diào)用并且具有某種功能。除此之外,我們不應(yīng)該將 lambda 函數(shù)賦值給變量。

為 lambda 函數(shù)命名的問題在于這使得調(diào)試不那么直觀。與其他的使用常規(guī) def 關(guān)鍵字創(chuàng)建的函數(shù)不同,lambda 函數(shù)沒有名字,這也是為什么有時(shí)它們被稱為匿名函數(shù)的原因。思考下面簡(jiǎn)單的例子,找出細(xì)微的區(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

當(dāng)我們的代碼存在關(guān)于 lambda 函數(shù)的問題(即 inversive0),Traceback 錯(cuò)誤信息只會(huì)提示您 lambda 函數(shù)存在問題。

相比之下,使用正常定義的函數(shù),Traceback會(huì)清晰地提示您有問題的函數(shù)(即 inversive1)。

與此相關(guān),如果您想多次使用 lambda 函數(shù),最佳實(shí)踐是使用通過 def 定義的允許使用文檔字符串的常規(guī)函數(shù)。

4. 不要忘記列表推導(dǎo)式

有些人喜歡將 lambda 函數(shù)和高階函數(shù)一起使用,比如 map 或 filter。思考下面用法示例:

>>> # 創(chuàng)建一個(gè)數(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]

我們可以使用可讀性更強(qiáng)的列表推導(dǎo)式代替 lambda 函數(shù)。如下所示,我們使用列表推導(dǎo)式來創(chuàng)建相同的列表對(duì)象。如所見,與列表推導(dǎo)式相比,之前將 map 或 filter 函數(shù)與 lambda 函數(shù)一起使用更麻煩。因此,在創(chuàng)建涉及高階函數(shù)的列表時(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]

以上是“怎么寫好Python的Lambda函數(shù)”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI