繁体   English   中英

在 python 中使用 lambda function

[英]Using a lambda function in python

有没有办法将 function 转换为 lambda function(自动)在 Z23EEEB7347BDD756BDDFC 中? 就像是:

def func(arg):
    print("Hi", arg)

==>

lambda arg: compile(func) # <== something like this

Python 中的函数是该语言的一等公民。 这意味着 function 可以像数据值一样进行操作。 因此,可以将 function 作为参数传递给另一个 function,或者作为结果从 function 返回。 这被称为高阶编程

现在, deflambda关键字都定义了这样的 function 值。 主要区别在于def为这样的 function 分配了一个名称,而 lambda 是匿名函数。 另一个区别是 lambdas 仅限于一行代码(尽管有些语言不是这种情况)。

例如,这里有两个等价的函数,一个用def定义,另一个用lambda

def say_hello(name):
    print('Hi ', name)

lambda name: print('Hi ', name)

def关键字的另一种解释方法如下:

say_hello = lambda name: print('Hi ', name)

尽管强烈建议不要使用此类代码。

本质上,这两个函数都是(几乎)等价的数据值,但在上面的代码片段中,用def定义的函数稍后可以被调用,因为它有一个名称,因此我们可以稍后访问它。 lambda定义的那个不能,因为它没有名称,因此如果没有分配给变量或传递给另一个 function(例如f )作为参数,它会立即丢失,然后在f中给它一个名称本地 scope 根据f的参数。

然而,在我们不想用新的、短的函数来混淆 scope 的情况下,lambdas 很有用,这些函数只作为参数传递给另一个 function:

map(lambda x: x * 2, [1, 2, 3])
# >>> [2, 4, 6]

如果您已经有一个用def定义的 function ,它会执行上面显示的乘法运算,就像您的示例中的情况一样,例如:

def double(x):
    return x * 2

然后您可以在对 map 的调用中按名称简单地引用此 function:

map(double, [1, 2, 3])
# >>> [2, 4, 6]

简而言之:没有必要“将 function 编译为 lambda”,lambda 只是 function 的特例,没有给出名称。 请按名称参阅您的 function。

PS:不要使用mapfilter ,而是使用列表推导,因为它们被认为更 Pythonic。

您可以轻松制作:

def auto_lam(f):
  return lambda *args, **kwargs: f(*args, **kwargs)

然后使用它:

mylam = auto_lam(func)

在这种形式中,您可以看到这是非常没用的,因为您只是调用了相同的 function,但包装函数在 python 中非常常见,因为它允许我们修改 ZC1C425268E683985D14ZA504F 的行为。 这些被称为装饰器函数

例如:

def logging_func(f):
    def do_work(*args, **kwargs):
        print ("You called me")
        res = f(*args, **kwargs)
        print ("Finished")
        return res
    return do_work

现在你可以用这个包装现有的 function ,如下所示:

@logging_func
def func(arg):
   print("Hi", arg)

现在每次调用func时,它都会在前后记录一些内容。 我认为这是对 function 包装器的更好使用,而不是简单地返回相同的 function 包装器。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM