Python中的lambda

2024-05-23 21:48:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我将重新访问python中的一些scheme练习(如果这有意义的话),以了解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

我知道这在scheme中是可能的,但是python中是否有类似的东西?我的印象是,python中的lambda只是定义方法的一种较短的方法,我还没有找到任何方法来定义python中的一般组合器函数。


Tags: 方法lambda函数参数returnif定义is
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)

我可以看出你的问题中的一些要点,让我们按顺序来讨论一下:

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

是的:

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作为交换。。。

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

一般来说,Python中的函数和Scheme中的函数一样强大,但是需要注意的是:

lambda关键字是有限的

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

f = lambda x, y: x + y

由于Python中有很多东西是语句而不是表达式(赋值,2.xprint,…),因此通常需要返回到命名函数。

有闭包

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

对象而不是闭包。使用magic__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)的缩写。可以使用^{} module中的函数模拟所需的行为。

相关问题 更多 >