对于以下代码中的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)