在函数中使用 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
传递。
mydoubler
是 lambda a: a * n
,因此 11 是 a
,这是该 lambda 的唯一参数。
你实际上是在这里制作一个柯里化函数
【参考方案1】:
mydoubler
是 myfunc(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
但是当输入是 array
或 string
时,您会期待什么?
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
在上面的示例中,变量n
在myfunc
中声明,在您的情况下,n
是myfunc
的参数,它被传递给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的主要内容,如果未能解决你的问题,请参考以下文章
在单个AWS Lambda中使用两个python函数boto3
python编写自定义lambda函数使用numpy中的np.vectorize函数在numpy数组中的每个元素上施加应用自定义lambda函数生成新的numpy数组