【问题标题】:Write pure and functional code in Python using the concept higher-order functions like in JavaScript使用 JavaScript 中的高阶函数概念在 Python 中编写纯函数式代码
【发布时间】:2013-12-02 19:25:04
【问题描述】:

如何在 Python 中使用高阶函数(返回其他函数的函数)?

这是我的 JavaScript 示例,我也想在 Python 中使用它的编程概念。 例如,假设我想在 HTML 元素中包装一个字符串。在 JavaScript 中,它看起来像这样:

var wrapInElement = function(ele) {
    return function(inp) {
        return "<" + ele + ">" + inp + "</" + ele + ">";
    };
};

然后我会这样使用它:

var names = ["Mike", "Tony", "John"];
names.map(wrapInElement("p"));

这在 Python 中是怎样的?有没有办法像上面的例子一样编写返回自定义函数的函数?也可以用 Python 编写一个类来完成这项任务,但对于这样一项基本任务来说,这不是太多了吗?

【问题讨论】:

  • 您是否尝试过将您的 JS 代码翻译成 Python?你有没有尝试过任何东西?
  • 实际上,我很确定它不会那样工作,所以我没有尝试提供的解决方案。我可能应该这样做,因为真的可以一对一翻译。

标签: javascript python functional-programming higher-order-functions


【解决方案1】:

在python中,函数是一等公民,就像在javascript中一样:

def adder(n):
    def add_func(x):
        return x + n
    return add_func

add3 = adder(3)
print map(add3, [1,2,3])  # [4, 5, 6]

这不是唯一的选择,例如adder也可以写成:

def adder(n):
    return lambda x: x + n

请注意,函数式风格并不完全是 Pythonic,如果可能,我们更喜欢推导式和生成器而不是高阶函数:

wrapped = ["<p>{}</p>".format(name) for name in names]

【讨论】:

    【解决方案2】:

    您的 JavaScript 示例可以使用 partial application 重写(可以说更干净):

    // depends on `_` -- see link above
    function wrapInElement(ele, inp) {
        return "<" + ele + ">" + inp + "</" + ele + ">";
    };
    
    var f = _.partial(wrapInElement, "p")
    
    ... then use f as a normal function ...
    

    在 Python 中的方式几乎相同:

    from functools import partial
    
    def wrap_in_element(ele, inp):
        return "<%s>%s</%s>" % (ele, inp, ele)
    
    f = partial(wrap_in_element, "p")
    
    ... then use f as a normal function ...
    

    虽然可以,在 Python 和 JavaScript 中都可以使用高阶函数,但如果你发现自己返回函数是为了滚动你自己的部分应用机制,你应该意识到这种丑陋(出现在两种语言的示例中)是不必要的,这要归功于那里很棒的库。

    【讨论】:

    • 请让我强调一个事实,即该解决方案比我标记为正确答案的解决方案更简单。我不知道部分应用程序,无论是 JavaScript 还是 Python。这很有趣。谢谢。
    猜你喜欢
    • 2019-10-09
    • 1970-01-01
    • 2022-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多