我确实理解高阶函数是将函数作为参数或返回函数的函数。 我也知道装饰器是为其他函数添加一些功能的函数。 它们到底是什么。 它们是作为参数传入的函数,还是它们本身的高阶函数? 注意:如果您要举个例子,请在 python 中给出 ...
提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供 中文繁体 英文版本 中英对照 版本,有任何建议请联系yoyou2525@163.com。
我正在学习函数式编程的基础知识,最终遇到了高阶函数的概念。 我在Corey Schafer 的这个视频中看到了一个例子(从 11:00 开始),它显示了一个 Python function 可以将消息包装在任意 Z4C4AD5FCA2E7A3F74DBB1CED0038 标签中:
def html_tag(tag):
def wrap_text(msg):
print('<{0}>{1}</{0}>'.format(tag, msg))
return wrap_text
print_h1 = html_tag('h1')
print_h1('Test Headline!')
print_h1('Another Headline!')
print_p = html_tag('p')
print_p('Test Paragraph!')
Output:
<h1>Test Headline!</h1>
<h1>Another Headline!</h1>
<p>Test Paragraph!</p>
我知道它使您可以灵活地重新使用相同的 function 用于不同的目的(在本例中为不同的标签)。 但是您也可以使用 Python classes获得相同的结果:
class HTML_tag:
def __init__(self, tag):
self.tag = tag
def wrap_text(self, msg):
print('<{0}>{1}</{0}>'.format(self.tag, msg))
print_h1 = HTML_tag('h1')
print_h1.wrap_text('Test Headline!')
print_h1.wrap_text('Another Headline!')
print_p = HTML_tag('p')
print_p.wrap_text('Test Paragraph!')
Output:
<h1>Test Headline!</h1>
<h1>Another Headline!</h1>
<p>Test Paragraph!</p>
高阶 function 方法肯定看起来更干净,但除了美观之外,还有其他原因我可能想要高阶 function 而不是 class? 例如,关于诸如
高阶函数采用和/或返回函数。 让我们看看这两种情况。
在这里,HOF 绝对是通往 go 的方式。 class 版本相当于一个带有额外步骤的 HOF。 对于 class 版本,您需要预先协商 function 可调用的密钥。 它实际上是您要完成的内容的无用包装。
def my_map(fn, arr):
result = []
for a in arr:
result.append(fn(a))
return result
my_map(lambda a: a + 1, [1, 2, 3]) # [2, 3, 4]
def my_map(inst, arr):
result = []
for a in arr:
result.append(inst.fn(a))
return result
class my_mapper:
def fn(self, a):
return a + 1
my_map(my_mapper(), [1, 2, 3]) # [2, 3, 4]
在这两个版本中,我们正在做的是创建一些值a
的封装,以及在其上工作的 function。
I think that a class is generally useful if you want more than one function to be defined over some data, when the encapsulated data can change (you're encoding a state machine), or when you expect operations to be specific to your class (即 class 的用户需要知道在类上定义的操作)。
我会使用返回 function 的 function,当我所做的相当于部分应用程序时,(我有一个 function,有些需要多个参数,比如预应用程序, 我也会使用functools.partial
来做到这一点。
def adder(a):
return lambda b: a + b
class adder_class:
def __init__(self, a):
self.a = a
def add(self, b):
return a + b
最终,最好使用 HOF 还是 class 将从上下文中变得清楚。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.