<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          通過“四不要”,掌握 Python 的 Lambda 函數(shù)

          共 3514字,需瀏覽 8分鐘

           ·

          2020-11-12 15:35




          原文地址:Master Python Lambda Functions With These 4 Don’ts

          原文作者:Yong Cui, Ph.D.

          譯文出自:掘金翻譯計(jì)劃

          本文永久鏈接:https://github.com/xitu/gold-miner/blob/master/article/2020/master-python-lambda-functions-with-these-4-donts.md

          譯者:loststar??校對(duì)者:luochen1992

          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?"",?line?1
          ????sorted(integers,?key=lambda?x:?return?x[-1])
          ???????????????????????????????????^
          SyntaxError:?invalid?syntax

          該錯(cuò)誤可能是由于無法區(qū)分表達(dá)式和語句而引起的。像是包含 returntrywith 以及 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 庫來處理數(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ù)——可以被調(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?"",?line?1,?in?
          ??File?"",?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?"",?line?1,?in?
          ??File?"",?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ù)一起使用,比如 mapfilter。思考下面用法示例:

          >>>?#?創(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)式相比,之前將 mapfilter 函數(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]

          結(jié)論

          在本文中,我們回顧了使用 lambda 函數(shù)可能會(huì)犯的四個(gè)常見錯(cuò)誤。通過避免這些錯(cuò)誤,您應(yīng)該能在代碼中正確使用 lambda 函數(shù)。

          使用 lambda 函數(shù)的經(jīng)驗(yàn)準(zhǔn)則是保持簡(jiǎn)單以及只在本地使用一次。


          文末福利

          后臺(tái)回復(fù)關(guān)鍵字:破解,獲取Pycharm 破解版,親測(cè)有效哦
          后臺(tái)回復(fù)關(guān)鍵字:自學(xué),獲取一份精心整理的 5本 Python 經(jīng)典用書
          后臺(tái)回復(fù)關(guān)鍵字:國慶,獲取50本電子書。


          對(duì)了,看完記得一鍵四連,這個(gè)對(duì)我真的很重要。


          瀏覽 84
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  我爱草逼网 | 国产精品国产三级国芦专播精品人 | 日本高清在线一区 | 欧美系列黄色免费 | 小嫩逼久久 |