首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python中高阶函数的优点

Python中高阶函数的优点
EN

Stack Overflow用户
提问于 2019-07-04 08:50:42
回答 1查看 412关注 0票数 1

为了实现美化的xml,我编写了以下代码

代码语言:javascript
复制
def prettify_by_response(response, prettify_func):
    root = ET.fromstring(response.content)
    return prettify_func(root)

def prettify_by_str(xml_str, prettify_func):
    root = ET.fromstring(xml_str)
    return prettify_func(root)

def make_pretty_xml(root):
    rough_string = ET.tostring(root, "utf-8")
    reparsed = minidom.parseString(rough_string)
    xml = reparsed.toprettyxml(indent="\t")
    return xml

def prettify(response):
    if isinstance(response, str) or isinstance(response, bytes):
        return prettify_by_str(response, make_pretty_xml)
    else:
        return prettify_by_response(response, make_pretty_xml)

在prettify_by_response和prettify_by_str函数中,我将make_pretty_xml函数作为参数传递

我可以简单地调用该函数,而不是将函数作为参数传递。

代码语言:javascript
复制
def prettify_by_str(xml_str, prettify_func):
   root = ET.fromstring(xml_str)
   return make_pretty_xml(root)

与直接调用函数相比,将函数作为参数传递给这些函数优点之一是,该函数与make_pretty_xml函数没有紧密耦合。

还会有什么其他优势,或者我会增加额外的复杂性?

EN

回答 1

Stack Overflow用户

发布于 2019-07-04 10:50:33

这似乎对有偏见的答案非常开放,我将努力做到公正,但我不能做出任何承诺。

首先,高阶函数是接收和/或返回函数的函数。优点是值得怀疑的,我将尝试列举HoF的用法,并阐明每种用法的优缺点

回调

回调是作为阻塞调用的解决方案出现的。我需要在A之后执行B,所以我调用在A上阻塞的东西,然后调用B。这自然会导致这样的问题,嗯,我的系统浪费了很多时间等待事情发生。如果我可以将需要做的事情作为参数传递,而不是等待会怎样呢?因为技术中任何新的东西都还没有扩展,在扩展之前似乎是一个好主意。

回调在事件系统中非常常见。如果你用javascript编写每一段代码,你就会明白我在说什么。

算法抽象

一些设计,主要是行为设计,可以在运行时利用HoF选择某种算法。您可以有一个高级算法,它接收处理低级内容的函数。这导致了更多的抽象、代码重用和可移植代码。在这里,可移植意味着您可以编写代码来处理新的低级,而无需更改高级级别。这与HoF无关,但可以利用它们来获得极大的帮助。

将行为附加到另一个函数

这里的想法是将一个函数作为参数,并返回一个函数,该函数执行参数函数所做的事情,外加一些附加的行为。这就是(我认为) HoF真正闪亮的地方。

Python装饰器就是一个很好的例子。它们将一个函数作为参数,然后返回另一个函数。此函数附加到与第一个函数相同的标识符

代码语言:javascript
复制
@foo
def bar(*args):
   ...

是相同的

代码语言:javascript
复制
def bar(*args):
    ...
bar = foo(bar)

现在,思考一下这段代码

代码语言:javascript
复制
from functools import lru_cache

@lru_cache(maxsize=None)
def fib(n):
    if n < 2:
        return n
    return fib(n-1) + fib(n-2)

fib只是一个斐波纳契函数。它计算直到n的斐波纳契数。现在lru_cache附加了一个新的行为,缓存先前已经计算过的值的结果。fib函数内部的逻辑不受LRU缓存逻辑的影响。我们在这里有一个多么漂亮的抽象。

应用型编程或无指针编程

这里的想法是删除变量或点,并结合函数应用程序来表示算法。我相信有很多人在这个话题上比我更好,如此漫游。

顺便说一句,这在python中不是很常见的样式。

代码语言:javascript
复制
for i in it:
    func(i)
代码语言:javascript
复制
from functools import partial

mapped_it = map(func, it)

在第二个示例中,我们删除了i变量。这在解析世界中很常见。作为另一个副节点,map函数在Python语言中是惰性的,因此直到遍历mapped_it时,第二个示例才会生效

你的案例

在本例中,您将返回回调调用的值。实际上,您不需要回调,您可以像以前一样简单地排列调用,对于这种情况,您不需要HoF。

我希望这能有所帮助,也希望有人能展示更好的应用风格的例子:)

问候

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56879453

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档