如何调用lambda而不将其定义为函数?



对于以下代码中的lambda函数,

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

我试图理解为什么mydoubler变成<class 'function'>,以及我如何在不将其定义为函数的情况下调用mydoubler(11)

lambda是一个函数,但只有一个表达式(行代码)。该表达式在调用函数时执行,并返回结果。

所以等价于这个:

double = lambda x: x * 2

def函数:

def double(x):
return x * 2

你可以在这里阅读更多

lambda是一个函数,因此您的代码将执行类似

的操作
def myfunc(n):
def result(a):
return a * n
return result # returns a function
mydoubler = myfunc(2)
print(f(11))

你问如何调用mydoubler而不将其定义为函数,这不是最清楚的问题,但你可以调用它而不像这样命名

print( myfunc(2)(11) )

您的myfunc返回一个lambda。Lambda是一个小的匿名函数。lambda可以接受任意数量的参数,但只能有一个表达式。

所以在执行第三行之后,你的mydoubler将变成一个lambda,这就是为什么当你尝试print(type(mydoubler))时,它将返回<class 'function'>

同样,为了用11调用mydoubler,它必须是function。

lambda表达式与def语句一样,定义函数。您的代码可以等效地写成

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

因为内部函数足够简单,可以定义为单个表达式,所以使用lambda表达式可以省去使用def语句所需要的未使用的名称的麻烦。

这里的关键是内部函数n的值关闭,因此myfunc返回的函数保留了对传递给myfunc的参数值的引用。也就是说,mydoubler是硬编码的,将参数乘以2,而不是n以后可能得到的任何值。(实际上,闭包的目的是创建一个新的变量n,供内部函数使用,它不能轻易地从外部myfunc更改。)

使用decorator可以实现这个

from functools import wraps
def decorator_func_with_args(arg1):
def decorator(f):
@wraps(f)
def wrapper(val):
result = f(val)
return result(arg1)
return wrapper
return decorator

@decorator_func_with_args(arg1=2)
def myfunc(n):
return lambda arg:arg*n

result = myfunc(1211)
print(result)

输出2422

你是这个意思吗?

mydoubler = lambda a : a * 2
mydoubler(11)

最新更新