在函数中使用 lambda

Posted

技术标签:

【中文标题】在函数中使用 lambda【英文标题】:Using lambda inside a function 【发布时间】:2019-07-10 15:05:03 【问题描述】:

我正在通过在线教程学习 Python 中的 lambda 函数。我明白它是如何工作的,但我遇到了一个让我困惑的例子(this page):

def myfunc(n):
    return lambda a : a * n

mydoubler = myfunc(2)
print(mydoubler(11))

我不明白mydoubler 函数在这里是如何工作的。之前没有定义的 11 怎么作为参数呢?

【问题讨论】:

mydoubler 是对 myfunc 返回的 lambda 的引用,并将 a 作为输入。 11 作为 a 传递。 mydoublerlambda a: a * n,因此 11 是 a,这是该 lambda 的唯一参数。 你实际上是在这里制作一个柯里化函数 【参考方案1】:

mydoublermyfunc(2) 返回的内容。它返回一个接受单个参数的 lambda,a

当您调用这样的函数时:myfunction(this_argument),它将解析到该位置返回的内容。所以这实际上与写mydoubler = lambda a : a * 2

【讨论】:

【参考方案2】:

lambda 函数是一个小型匿名函数。在你的例子中

myfunc(2) # lambda a: a * 2

您将其翻译为在每个输入元素上应用一个函数。例如,当输入只是一个标量时,这一点非常明显

mydoubler(11) #outputs 11 * 2 = 22

但是当输入是 arraystring 时,您会期待什么?

mydoubler([1,1,1]) #outputs [1,1,1] * 2 = [1,1,1,1,1,1]
mydoubler("str") #outputs "str" * 2 = "strstr"

【讨论】:

【参考方案3】:

您的示例有两个函数:外部函数myfunc 和内部函数lambda。一般可以直接调用lambda函数:

n = 2
print((lambda a: a * n)(11))
# 22

或者你可以给这个函数分配一些变量,然后通过这个变量调用它:

inner = lambda a: a * n
print(inner(11))
# 22

你也可以定义一些外部函数,它会返回内部的lambda函数:

def myfunc():
    n = 2
    return lambda a: a * n

mydoubler = myfunc()
print(mydoubler(11))
# 22

相当于:

mydoubler = lambda a: a * 2
print(mydoubler(11))
# 22

在上面的示例中,变量nmyfunc 中声明,在您的情况下,nmyfunc 的参数,它被传递给lambda 函数。函数myfunc 返回lambda 函数,其中n 等于您通过函数调用传递给myfunc 的参数。所以函数调用myfunc(2) 返回函数lambda a: a * 2

【讨论】:

【参考方案4】:

正如 Python 文档所说,lambda 只是匿名函数

Lambda 表达式(有时称为 lambda 形式)用于创建匿名函数。表达式 lambda 参数:表达式产生一个函数对象。

你可以在here看到它

在您的代码 sn-p 中发生的情况是,您的 myfunc 函数使用 n 作为新匿名函数的常量,该函数接收一个名为 a 的参数并返回 a 与 @ 的乘积987654326@。 在您调用n 时,值是2,结果是您调用myfunc(2)。 当您调用 mydoubler(11) 时,当 a 具有值 11 时,您将调用新的匿名函数

【讨论】:

【参考方案5】:

根据https://pythonreference.readthedocs.io/en/latest/docs/operators/lambda.html 中的 lambda 文档

lambda 返回一个匿名函数。

在上述例子中,lambda 函数是 lambda a : a * n 和 lambda 本身返回一些匿名函数,该函数必须类似于

def mydoubler(a, n):
    return a*n
但是在这里,由于我们在调用 myfun() 时已经传递了 n=2,因此执行 mydoubler(a) 只会返回 a*2(此处为 n=2)并因此返回结果。

【讨论】:

【参考方案6】:

这里 mydoubler=myfunc(2) #myfunc(2) 将 lambda 函数返回给 mydoubler

 mydoubler=lambda a:a*2
 # it is similar to x=lambda a:a*2

 print(mydoubler(11)
 # it is similar to print(x(11))

【讨论】:

【参考方案7】:

当您在分配 mydoubler 后调用该函数时,它返回一个函数,即 lambda FUNCTION,因此,mydoubler 本身变成了一个函数并且可以传入参数。

【讨论】:

嗨@rajs 欢迎来到***。这更像是一个评论而不是一个答案。您还应该查看how to answer 页面。【参考方案8】:

有同样的问题并通过谷歌搜索登陆这里。一开始似乎很难,但一旦理解了就会清晰。

myfunc 定义了一个带有参数 n 的 lambda 函数,该参数未知。

mydoubler 通过给参数 n=2 赋值,使用 myfunc 定义了一个 lambda 函数。

请记住,mydoubler 仍然是一个 lambda 函数,因此它需要变量才能工作,这里位于打印函数 a=11 中。

【讨论】:

【参考方案9】:

我们如何在简单的 1 行中编写 lambda func,即 考虑:

x = lambda a: a*3
print(x(2))

我们期望的输出是2*3 =6

这里的第 2 行 print(x(2)) 只是一个要考虑的值,如果你写 print(x) 它会显示错误为 <function myfunc.<locals>.<lambda> at 0x000001F2D170AD40> 或其他东西。

同样的事情

def myfunc(n):
    return lambda a : a * n

mydoubler 只不过是(x) = myfunc(2) 只不过是(lambda a:a*2) func,只是使用的名称不同。 print(mydoubler(11)) 类似于 print(x(valueof a))

【讨论】:

【参考方案10】:

为了理解这个概念,上面的代码可以简化如下:

def myfunc(n):
    return lambda a : a*n
mydoubler = myfunc(2)
mydoubler(11)

这只是因为 lambda 本身就是一个函数。 myfunc(2) 被调用并存储在 mydoubler 中。 myfunc(2) 也与 lambda 共享参数,即 2。 Lambda 和 mydoubler 通过 myfunc(2) 连接。当 mydoubler 被调用并以相等的参数传递给 lambda 时,会自动调用 Lambda 函数。

Lambda 函数是没有名称定义的函数。在那里它也被称为匿名函数。

【讨论】:

在此代码中,myfunc 不返回任何内容,mydoubler 未定义。 与@wjandrea 相同,您能否详细说明 myfunc(2) 或 mydoubler(11) 将说明这些概念吗?

以上是关于在函数中使用 lambda的主要内容,如果未能解决你的问题,请参考以下文章

如何在python中使用lambda函数[重复]

Python lambda函数

在单个AWS Lambda中使用两个python函数boto3

c++基础(lambda)

在Lambda函数中查找请求的URL

python编写自定义lambda函数使用numpy中的np.vectorize函数在numpy数组中的每个元素上施加应用自定义lambda函数生成新的numpy数组