lambda中的lambda

Arn*_*tta 16 python lambda functional-programming

我正在重新审视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
Run Code Online (Sandbox Code Playgroud)

我知道这在方案中是可行的,但在python中是否有相同的东西?我得到的印象是python中的lambda只是定义方法的一种较短的方式,我没有找到任何方法在python中定义一般的组合器函数.

hug*_*omg 14

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

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

是:

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

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

f(add, 10, 7) #gives 17
Run Code Online (Sandbox Code Playgroud)

那么运营商呢?

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

import operator

operator.add(1, 2)
(lambda x,y : x+y)(1, 2)
Run Code Online (Sandbox Code Playgroud)

在大多数情况下,操作员不是真正的功能有点令人伤心,但至少Python给了我们链接比较,比如10 <= x < 100交换......

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

在一般意义上,Python中的函数与Scheme中的函数一样强大,但是有一些注意事项:

lambda关键字是有限的

您只能将一个表达式作为函数体

f = lambda x, y: x + y
Run Code Online (Sandbox Code Playgroud)

由于Python中有很多东西是语句而不是表达式(赋值,2.x print,...),所以通常需要回退到命名函数.

有封闭

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

printer('a message')()
Run Code Online (Sandbox Code Playgroud)

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

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

def make_counter(n):
    def inc():
        n = n + 1
        return n
    return inc
Run Code Online (Sandbox Code Playgroud)

新的3.x非本地关键字

def make_counter(n):
    def inc():
        nonlocal n
        n = n + 1
        return n
    return inc
Run Code Online (Sandbox Code Playgroud)

具有可变对象的解决方法

def make_counter(n):
    nw = [n]
    def inc():
       nw[0] = nw[0] + 1
       return nw[0]
    return inc
Run Code Online (Sandbox Code Playgroud)

对象而不是闭包.使用魔术__call__方法假装它的功能

class Counter:
    def __init__(self, n):
        self.n = n
    def __call__(self):
        self.n += 1
        return self.n
Run Code Online (Sandbox Code Playgroud)


Ism*_*awi 8

运算符在python中并不是真正的函数,更像是方法 - x + y简称x.__add__(y)或者y.__radd__(x).您可以使用operator模块中的函数来模拟所需的行为.