使用JavaScript中的高阶函数概念,用Python编写纯函数代码

Write pure and functional code in Python using the concept higher-order functions like in JavaScript

本文关键字:函数 Python 代码 JavaScript 高阶 使用      更新时间:2023-09-26

如何在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编写一个类来完成这项任务,但对于这样一个基本任务来说,这不是太多了吗?

在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

请注意,函数风格并不完全是Python风格,在可能的情况下,我们更喜欢理解和生成器,而不是高阶函数:

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

您的JavaScript示例可以使用部分应用程序重写(可以说更干净)

// 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中都可以使用高阶函数,如果你发现自己返回函数来滚动自己的部分应用程序机制,你应该意识到,由于有很棒的库,这种丑陋(出现在两种语言的示例中)是不必要的。