Python中高阶函数的优点

2024-05-28 12:04:26 发布

您现在位置:Python中文网/ 问答频道 /正文

为了实现漂亮的xml,我编写了以下代码

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 \u by \u response和prettify \u by \u str函数中,我传递函数make \u pretty \u xml作为参数

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

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

将函数作为参数传递给这些函数而不是直接调用该函数的一个优点是,该函数不是紧密耦合的,从而使xml函数更漂亮。你知道吗

还有什么其他的优势或者我在增加额外的复杂性?你知道吗


Tags: 函数makebyreturnresponsedefprettyroot
1条回答
网友
1楼 · 发布于 2024-05-28 12:04:26

这似乎很开放的偏见的答案,我会尽量公正,但我不能作出任何承诺。你知道吗

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

回调

回调是阻止呼叫的一种解决方案。我需要B发生在A之后,所以我调用阻塞在A上的东西,然后调用B。这种性质会导致这样的问题,嗯,我的系统会浪费很多时间等待事情发生。如果不用等待,我可以把我需要做的事情作为论据来传递呢。任何新的技术,在没有被扩展之前,都是一个好主意。你知道吗

回调在事件系统中非常常见。如果你用javascript编写每一个代码,你就知道我在说什么了。你知道吗

算法抽象

一些设计,主要是行为设计,可以利用HoF在运行时选择一些算法。你可以有一个高级算法来接收处理低级内容的函数。这将导致更多的抽象代码重用和可移植代码。在这里,可移植意味着您可以编写代码来处理新的低级别,而不必更改高级别。这与HoF无关,但可以利用它们提供很大的帮助。你知道吗

将行为附加到其他函数

这里的ideia是将函数作为参数,并返回一个函数,该函数的作用与参数函数的作用完全相同,另外还有一些附加的行为。我认为这是霍夫真正闪耀的地方。你知道吗

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

@foo
def bar(*args):
   ...

是相同的

def bar(*args):
    ...
bar = foo(bar)

现在,反思一下这个代码

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只是一个斐波那契函数。它计算Fibonacci数直到n。现在lru_cache附加一个新的行为,为先前计算的值缓存结果。fib函数中的逻辑不受LRU缓存逻辑的影响。我们这里有多么美丽的抽象。你知道吗

应用型编程或无点编程

这里的想法是去除变量或点,并结合函数应用程序来表达算法。我相信在这方面有很多人比我强。你知道吗

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

for i in it:
    func(i)
from functools import partial

mapped_it = map(func, it)

在第二个示例中,我们删除了i变量。这在解析世界上很常见。作为另一个侧节点,map函数在python中是惰性的,因此第二个示例只有在迭代mapped_it时才会生效

你的案子

在您的例子中,您将返回回调调用的值。实际上,您不需要回调,您只需像以前那样排列调用,对于这种情况,您不需要HoF。你知道吗

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

敬礼

相关问题 更多 >