[英]lambda in python
我正在重新审视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中定义一般的组合器函数。
我可以在你的问题中看到一些要点,让我们按顺序浏览它们:
是:
def f(op, x, y):
return op(x, y)
def add(x, y):
return x + y
f(add, 10, 7) #gives 17
与scheme不同,Python运算符不是函数,因此您不能将它们作为参数直接传递。 您可以自己创建包装函数,也可以从标准库中导入操作符模块。
import operator
operator.add(1, 2)
(lambda x,y : x+y)(1, 2)
在大多数情况下,操作符不是真正的函数有点令人伤心,但至少Python给我们链式比较,如10 <= x < 100
作为交换......
在一般意义上,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
w /可变对象的解决方法
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
运算符在python中并不是真正的函数,更像是方法 - x + y
是x.__add__(y)
或y.__radd__(x)
。 您可以使用operator
模块中的功能来模拟所需的行为。
我认为你最好的选择是创建一个运算符的函数,然后传递:
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)
你不能在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语句。
[如果出于某种原因需要,可以使用运算符模块访问内置运算符作为函数: http : //docs.python.org/library/operator.html ]
检查operator
模块。 所有python操作符都以函数的形式提供。 例:
import operator
operate = lambda op, x, y: op(x, y)
operate(operator.add, 1, 2)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.