繁体   English   中英

lambda中的lambda

[英]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中定义一般的组合器函数。

我可以在你的问题中看到一些要点,让我们按顺序浏览它们:

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

是:

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有什么区别呢?

在一般意义上,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 + yx.__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.

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