python中的lambda

Posted

技术标签:

【中文标题】python中的lambda【英文标题】:lambda in python 【发布时间】:2011-12-19 22:34:22 【问题描述】:

我正在重新审视 python 中的一些方案练习(如果有意义的话),以了解 python 在 FP 方面可以做什么。我的问题涉及 python 中的 lambda: 我可以在 python 中定义一个带有运算符作为参数之一的通用函数吗?

这样想:

def f (op,x,y):
    #return some lambda function that combines x and y in the appropriate way
    #i.e if op is +, then return x+y, if op is -, then return x-y etc

#Edit : added usage
#this should be called like this:
f(+, 1,2) #should return 3

我知道这在方案中是可能的,但是在 python 中有没有等价的东西?我的印象是,python 中的 lambda 只是定义方法的一种更短的方式,而我还没有找到任何方法来定义 python 中的通用组合函数。

【问题讨论】:

值得注意的是,lambda的最大用途有built-in functions:sum()any()all() 【参考方案1】:

我可以看到你的问题中的一些要点,让我们按顺序进行:

1。我可以将函数作为参数传递给某人吗?

是的:

def f(op, x, y):
    return op(x, y)

def add(x, y):
    return x + y

f(add, 10, 7) #gives 17

2。那么运营商呢?

与 scheme 不同,Python 运算符不是函数,因此您不能直接将它们作为参数传递。您可以自己创建包装函数,也可以从标准库中导入 operator 模块。

import operator

operator.add(1, 2)
(lambda x,y : x+y)(1, 2)

在大多数情况下,运算符不是真正的函数有点令人难过,但至少 Python 为我们提供了像 10 <= x < 100 这样的链式比较作为交换...

3。那么Python和Scheme有什么区别呢?

在一般意义上,Python 中的函数与 Scheme 中的函数一样强大,但是有一些需要注意的地方:

lambda 关键字是有限的

你只能有一个表达式作为函数体

f = lambda x, y: x + y

由于 Python 中有很多东西是语句而不是表达式(赋值、2.x print、...),因此您通常需要转而使用命名函数。

有闭包

def make_printer(msg):
    def printer():
        print msg
    return printer

printer('a message')()

但是在其中改变变量是一种痛苦

这不起作用。它尝试为内部函数绑定一个新的 n 而不是使用外部函数

def make_counter(n):
    def inc():
        n = n + 1
        return n
    return inc

新的 3.x 非本地关键字

def make_counter(n):
    def inc():
        nonlocal n
        n = n + 1
        return n
    return inc

使用可变对象的解决方法

def make_counter(n):
    nw = [n]
    def inc():
       nw[0] = nw[0] + 1
       return nw[0]
    return inc

对象而不是闭包。使用神奇的__call__ 方法来假装它是一个函数

class Counter:
    def __init__(self, n):
        self.n = n
    def __call__(self):
        self.n += 1
        return self.n

【讨论】:

谢谢,我明白如何做一些与方案等效的事情(但不那么优雅) "你只能有一个表达式作为函数体" 好吧,从技术上讲,在 Scheme 中,everything 是一个表达式(set! 调用是一个表达式;而你可以使用begin 将多个“语句”链接在一起,这也会产生一个表达式)。所以在这方面并没有什么不同 @newacct:是的,但是很多在scheme中是表达式的东西在python中不是表达式。 Python lambda 的功能更加有限。【参考方案2】:

操作符在 python 中并不是真正的函数,更像是方法——x + yx.__add__(y)y.__radd__(x) 的缩写。您可以使用operator module 中的函数来模拟您想要的行为。

【讨论】:

好答案。考虑添加一个例子 f=lambda op,x,y: op(x,y); f(operator.add, 1, 2)【参考方案3】:

我认为您最好的选择是创建一个执行操作符的函数,然后将其传递:

def f(op, x, y):
    return op(x, y)

f(lambda x, y: x + y, 1, 2)

虽然可以这样做,但看起来有点多余:

f = lambda x, y: x + y

f(1, 2)

【讨论】:

没有。这些函数已经全部存在于operator 模块中。【参考方案4】:

你不能在 python 中通过语法传递一个操作符。例如。 f(+) 是语法错误。但是,如果您认为 op 是任何函数,则可以使用 def 或 lambda:

def f(op, x, y):
  def op_func():
    return op(x, y)

  return op_func

or

def f(op, x, y):
  op_func = lambda: op(x, y)

  return op_func

在您的情况下,您希望评估函数:

def f(op, x, y):
    return op(x, y)

请记住,Python 是解释型的,因此即使是 def 语句也会在运行时进行评估。

[如果出于某种原因需要,您可以使用 operator 模块将内置运算符作为函数访问:http://docs.python.org/library/operator.html]

【讨论】:

【参考方案5】:

检查operator 模块。所有 python 运算符都以函数的形式提供。 示例:

import operator    
operate = lambda op, x, y: op(x, y)
operate(operator.add, 1, 2)

【讨论】:

您的回答是有效的,但它没有回答我的问题。更准确地说,我的问题是如何以及是否可以在 python 中定义一个通用的组合器函数 :) 我希望按照折叠的方式做一些事情(除了我只想为 2 个变量而不是数据结构做这件事): haskell.org/haskellwiki/Fold

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

python中的lambda

Python中的匿名函数——lambda函数

Python中的lambda

关于Python中的lambda

Python 中的 @ 和 lambda 是啥意思? [复制]

Python(lambda)中的匿名函数