簡體   English   中英

Python 中的“lambda”到底是什么?

[英]What exactly is "lambda" in Python?

我想知道lambda中的 lambda 到底是什么? 以及在哪里以及為什么使用它。 謝謝

Lambda 更像是一種概念或編程技術,而不是其他任何東西。

基本上它的想法是你得到一個函數(python 中的第一類對象)作為另一個函數而不是對象或原始類型的結果返回。 我知道,這很混亂。

python 文檔中查看此示例:

def make_incrementor(n):
  return lambda x: x + n
f = make_incrementor(42)
f(0)
>>> 42
f(1)
>>> 43

所以 make_incrementor 創建了一個在結果中使用 n 的函數。 您可以擁有一個將參數增加 2 的函數,如下所示:

f2 = make_incrementor(2)
f2(3)
>>> 5

這是函數式編程和函數式編程語言(如 lisp 和 scheme)中非常強大的想法。

希望這可以幫助。

Lambda 不是匿名函數。 Lambda 是匿名表達式

它們像函數一樣被訪問,但它們不是一回事。 函數允許復雜的任務:流控制、變量聲明和包含表達式的語句列表。 表達式只是函數的一部分,而這正是 lambda 所提供的。 與功能相比,它們受到嚴重限制。

Python 不支持匿名函數。 有關執行此操作的語言的示例,請參閱 Javascript 和 Lua。

(注意:在函數語言中調用 lambdas 匿名函數是正確的,其中使用了“函數”的數學定義,但在過程語言中,這個詞的含義與數學中的含義大不相同。)

lambda允許您在代碼中定義簡單的未命名函數,例如作為參數。 如果您打算只使用該函數一次,因此不希望使用命名函數使您的代碼混亂,這將非常有用。

假設您有一個數字列表 ( thelist ),並且您想獲得一個長度相同的列表,每個數字都加倍。 與其定義times_two函數, times_two執行以下操作:

map(lambda x: x * 2, thelist)

lambda還使Currying更加方便。

Lambda 函數不是 Python 特定的概念,而是匿名函數(即沒有名稱的函數)的通用編程術語。 在 Python 中,它們通常用於需要將一個簡單函數作為參數傳遞給另一個函數的地方。

列表上的sort方法接受一個參數key ,它是一個函數,用於計算列表排序的值。 想象一下,您正在對一個包含兩個元素元組的列表進行排序,並且您想根據第一個元素對列表進行排序。 您需要將一個函數傳遞給返回第一個元素的key 你可以這樣做:

def first_element(x):
    return x[0]
my_list.sort(key=first_element)

或者,您可以更簡潔地執行以下操作:

my_list.sort(key=lambda x: x[0])

lambda構造是定義計算單個表達式的簡單函數的一種更短的方法。 def語句可能很不方便,並且會使代碼變得更長、更分散並且更難閱讀。 兩者創建的函數的工作方式幾乎相同,不同之處在於lambda僅限於返回其值的單個表達式,而def為函數分配一個名稱並將其添加到局部變量中同名。 也可以直接在表達式中使用lambda ,而def是一個語句。

def f(x, y):
    return x + y

會給你幾乎相同的結果

f = lambda x, y: x + y

你可以直接在表達式中使用它

g(5, 6, helper=lambda x, y: x + y)

使用def會不那么簡潔

def helper_function(x + y):
    return x + y

g(5, 6, helper=helper_function)

lambda是一種定義匿名內聯函數來完成某些任務的方法,而不是使用def關鍵字定義它並調用它。 將其視為不需要重用函數時可以使用的速記。 在您使用 lambda 的任何地方,您都可以替換一個顯式調用的函數:它的使用是完全可選的,並作為編碼風格的問題留給程序員。

示例代碼(沒有 lambda):

def numSquared(num):
    return num**2

for i in range(1,11):
    print numSquared(i)

示例代碼(使用 lambda):

for i in range(1,11):
    print (lambda x: x**2)(i)

一個很好的lambda初學者討論: DiveIntPython.org - Lambda

谷歌搜索“python lambda”返回的第一個鏈接指向一個頁面,該頁面的第一段回答了您的問題。 我可以復制並粘貼它的內容,但我認為這不公平:)

Lambda 可以直觀地解釋為代數函數。

假設一個基本代數 y = x**2 + 1 如果直接輸入,

>>> y = x**2 + 1
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'x' is not defined

發生錯誤並報告應首先定義變量“x”。 盡管如此,'x' 是未知的,它怎么可能被預先定義。

Lambda 有助於:

python
>>> y = lambda x: x**2 + 1  # no errors reports
>>> y(3)
10

這是 lambda 的核心,

用編程語言編寫內聯函數。

Lambda 是 Python 編程語言中的匿名函數,前面沒有 def 語句,而是簡單地調用並編寫為 lambda。

def mult2(x):
    return x*2

print(mult2(2))

# 返回 4

與 lambda 函數完全相同。

lam = lambda x : x*2
print(lam(2))

#returns 4有關更多詳細信息,您可以在此博客文章中查找。 http://friendlypython.herokuapp.com/2017/1/anonymous-function-lambda/這里

這是一個內聯匿名函數。

lambda是一個匿名函數,通常用於需要計算的快速操作。

示例(這在 LexYacc 命令解析器中使用):

assign_command = lambda dictionary, command: lambda command_function: dictionary.setdefault(command, command_function)

這是一個裝飾器。 放在我們從 LexYacc 解析器獲得的命令之前: @assign_command(_command_handlers, 'COMMAND')

這實質上是從定義的 LexYacc 語言構建一個 python 腳本。

或者,更簡單一點:

`x = lambda x: 返回 x > 0 和 x & (x-1) == 0

我想從使用的角度用一點外行的方法來解釋這一點,因為所有的技術點都已經涵蓋了。

A lambda function is just like any other function, only thing that makes it different (other than the syntax and the fact that it can't be reused), is that it is used when we want to quickly write a function which takes an argument並且只使用一個表達式返回一個值。

For instance: If all that a function does is take a argument and add 1 to it then using a lambda function is a better approach than a normal function. 但是如果你的 function 在返回值之前需要多行處理,那么我們需要使用一個普通的 function 定義然后調用它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM