簡體   English   中英

使用概念高階函數(如JavaScript)在Python中編寫純函數代碼

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

在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中使用高階函數,但是如果發現自己為了返回自己的部分應用程序機制而返回函數,則應該意識到這種丑陋(在兩種語言的示例中都出現了)不需要了,因為那里有很棒的庫。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM