执行高阶功能

时间:2020-05-15 01:31:11

标签: python python-3.x higher-order-functions first-class-functions

我正在学习Python中的一流函数和闭包的概念,我很想知道:

赋予高级功能:

def html_tag(tag):
    def wrap_text(text):
        print("<{0}>{1}</{0}>".format(tag, text))
    return wrap_text
  1. 这两种执行高阶函数的方法有什么区别。
  2. 使用一个相对于另一个有什么优势。
  3. 在程序中执行高阶函数的最佳方法是什么。

1。

print_h1 = html_tag('h1')
print_h1('Test Headline')
print_h1('Another Headline')

2。

html_tag('h1')('Test Headline')
html_tag('h1')('Another Headline')

3 个答案:

答案 0 :(得分:1)

我能想到的唯一优点是,在第一个示例中,通过将html_tag的返回值分配给变量,可以避免代码再次执行并每次返回一个新函数。在第二个示例中,您直接调用html_tag,并且每次都会产生一个新的函数引用,这将导致性能下降。

取决于您的用法,但是如果您将相同的参数传递给html_tag,那么我将举第一个示例。但是,如果您需要使用其他标记,那么显然您将不得不使用不同的参数再次调用html_tag

就函数的引用而言,这可能很重要,例如,如果出于某种原因将函数存储在dict中,那么您将无法将函数作为除非您一直引用相同的功能(如您的第一个示例)

答案 1 :(得分:1)

在您给出的示例中,结果没有差异。第二种方法效率较低,因为您要多次创建等效函数,所以很多余。

当您具有在两次运行之间保持状态的功能时,它将变得更加重要。

def counting_tag(tag):
    counter = 0
    def wrap_text(text):
        nonlocal counter
        counter += 1
        print("<{0}>{1}. {2}</{0}>".format(tag, counter, text))

每次调用counting_tag()时,它将返回一个计数器重置为0的函数。

print_h1 = counting_tag('h1')
print_h1('Test Headline')
print_h1('Another Headline')

这将打印

1. Test Headline
2. Another Headline

但是,如果您采用第二种方式:

counting_tag('h1')('Test Headline')
counting_tag('h1')('Another Headline')

你会得到

1. Test Headline
1. Another Headline

答案 2 :(得分:1)

您之所以拥有一个更高阶的函数,通常是因为您可以像在第一个示例中那样轻松生成诸如print_h1之类的命名辅助函数。这有两个好处:

  1. 您避免重复输入'h1'字符串。每当您必须在多个位置复制和粘贴字符串文字时,这都是由于输入错误而引起的错误的邀请!
  2. 少打字。 (这更像是不重复自己的第二个好处。)

如果您打算每次都重新调用html_tag,如第二个示例中所示,那么做一个高阶函数比简单地做没有好处:

def html_tag(tag, text):
    print("<{0}>{1}</{0}>".format(tag, text))


html_tag('h1', 'Test Headline')
html_tag('h1', 'Another Headline')