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 + y
是 x.__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的主要内容,如果未能解决你的问题,请参考以下文章