首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >执行高阶函数

执行高阶函数
EN

Stack Overflow用户
提问于 2020-05-15 01:31:11
回答 3查看 212关注 0票数 0

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

给出了一个高阶函数:

代码语言:javascript
复制
def html_tag(tag):
    def wrap_text(text):
        print("<{0}>{1}</{0}>".format(tag, text))
    return wrap_text

  1. 这两种执行高阶函数的方法的区别是什么?
  2. 有一个比另一个好吗?
  3. 在程序中执行高阶函数的最佳方法是什么?

1.

代码语言:javascript
复制
print_h1 = html_tag('h1')
print_h1('Test Headline')
print_h1('Another Headline')

2.

代码语言:javascript
复制
html_tag('h1')('Test Headline')
html_tag('h1')('Another Headline')
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-05-15 01:39:19

在你给出的例子中,结果是没有区别的。第二种方法效率较低,因为您要多次创建等效函数,这是多余的。

当您拥有在运行之间保持状态的函数时,它变得更加相关。

代码语言:javascript
复制
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的函数。

代码语言:javascript
复制
print_h1 = counting_tag('h1')
print_h1('Test Headline')
print_h1('Another Headline')

这个会打印出来

代码语言:javascript
复制
1. Test Headline
2. Another Headline

但如果你用第二种方式来做:

代码语言:javascript
复制
counting_tag('h1')('Test Headline')
counting_tag('h1')('Another Headline')

你会得到

代码语言:javascript
复制
1. Test Headline
1. Another Headline
票数 1
EN

Stack Overflow用户

发布于 2020-05-15 01:34:51

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

这取决于您的用法,但是如果您将相同的参数传递给html_tag,那么我将使用您的第一个示例。但是,如果您需要使用不同的标记,那么显然您必须使用不同的参数重新调用html_tag

就函数的引用而言,这可能很重要,例如,如果您出于某种原因将函数存储在dict中,那么除非您保持对同一个函数的引用(如您的第一个示例),否则您将无法将该函数作为键查找。

票数 1
EN

Stack Overflow用户

发布于 2020-05-15 01:39:30

使用高阶函数的原因通常是为了方便地生成像print_h1这样的命名助手函数,如第一个示例所示。这有两个好处:

  1. 您避免重复'h1'字符串。每当您必须复制和粘贴字符串文本的多个位置时,都会邀请错误发生,原因是输入错误!
  2. Less类型。(这更像是不重复自己的第二个好处。)

如果您每次都要重新调用html_tag,如您的第二个示例所示,那么做一个更高级的函数就不会比简单地执行以下操作更有好处:

代码语言:javascript
复制
def html_tag(tag, text):
    print("<{0}>{1}</{0}>".format(tag, text))


html_tag('h1', 'Test Headline')
html_tag('h1', 'Another Headline')
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61810217

复制
相关文章

相似问题

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