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