我正在学习Python中的第一类函数和闭包的概念,我很想知道:
给出了一个高阶函数:
def html_tag(tag):
def wrap_text(text):
print("<{0}>{1}</{0}>".format(tag, text))
return wrap_text1.
print_h1 = html_tag('h1')
print_h1('Test Headline')
print_h1('Another Headline')2.
html_tag('h1')('Test Headline')
html_tag('h1')('Another Headline')发布于 2020-05-15 01:39:19
在你给出的例子中,结果是没有区别的。第二种方法效率较低,因为您要多次创建等效函数,这是多余的。
当您拥有在运行之间保持状态的函数时,它变得更加相关。
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发布于 2020-05-15 01:34:51
我能想到的唯一优点是,通过将html_tag的返回值赋值给第一个示例中的变量,可以避免代码每次都必须再次执行并返回一个新函数。而在第二个示例中,您直接调用html_tag,它每次都会生成一个新的函数引用,这将导致性能下降。
这取决于您的用法,但是如果您将相同的参数传递给html_tag,那么我将使用您的第一个示例。但是,如果您需要使用不同的标记,那么显然您必须使用不同的参数重新调用html_tag。
就函数的引用而言,这可能很重要,例如,如果您出于某种原因将函数存储在dict中,那么除非您保持对同一个函数的引用(如您的第一个示例),否则您将无法将该函数作为键查找。
发布于 2020-05-15 01:39:30
使用高阶函数的原因通常是为了方便地生成像print_h1这样的命名助手函数,如第一个示例所示。这有两个好处:
'h1'字符串。每当您必须复制和粘贴字符串文本的多个位置时,都会邀请错误发生,原因是输入错误!。
如果您每次都要重新调用html_tag,如您的第二个示例所示,那么做一个更高级的函数就不会比简单地执行以下操作更有好处:
def html_tag(tag, text):
print("<{0}>{1}</{0}>".format(tag, text))
html_tag('h1', 'Test Headline')
html_tag('h1', 'Another Headline')https://stackoverflow.com/questions/61810217
复制相似问题