如何以最简单的方式返回闭包?

时间:2015-12-11 12:56:32

标签: python coding-style

让我们说我想要一个产生函数(闭包)的函数,它将它们的参数乘以工厂函数的参数。

JavaScript中的示例:

function get_mult_by(m) {
    return function(x) {
        return m * x;
    }
}

在Python中,我可以返回lambda

def get_mult_by(m):
    return lambda x: m * x

但是如果我想返回一个正常的函数,事情会变得更复杂,也不那么简单(从命名函数的必要性开始):

def get_mult_by(m):
    def mult(x):
        # do something else
        return m * x
    return mult

这方面的最佳做法是什么?

2 个答案:

答案 0 :(得分:1)

我认为这没什么大不了的。如果函数是一个简单的表达式,我可能会像第一个例子中那样返回lambda,但使用命名函数应该不是问题。与命名函数大小写相当的JavaScript将是:

function get_mult_by(m) {
    var mult;
    mult = function(x) {
        return m * x;
    }
    return mult;
}

换句话说,只需将其视为用于创建返回值的本地。

答案 1 :(得分:0)

他们是一样的。对你提问,我认为使用lambda更加pythonic。 实际上,如果您不导入其他包,则甚至无法使用类型函数区分它们:

In [4]: type(lambda x: 1)
Out[4]: function

In [5]: def f():
   ...:     pass
   ...:

In [6]: type(f)
Out[6]: function

如果您认为复杂的方式更好,那就干一切顺其自然。