我正在学习Python中的一流函数和闭包的概念,我很想知道:
赋予高级功能:
def html_tag(tag):
def wrap_text(text):
print("<{0}>{1}</{0}>".format(tag, text))
return wrap_text
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')
答案 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
之类的命名辅助函数。这有两个好处:
'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')