我正在学习functional 的基础知识,并最终理解了高阶函数的概念。我在这个Corey Schafer拍摄的视频中看到了一个示例(从11:00开始),它显示了一个可以将消息包装在任意HTML标记中的函数:
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!')输出:
<h1>Test Headline!</h1>
<h1>Another Headline!</h1>
<p>Test Paragraph!</p>我知道它为您提供了为不同目的重用相同函数的灵活性(在本例中是不同的标记)。但是,您也可以使用Python类实现相同的结果:
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!')输出:
<h1>Test Headline!</h1>
<h1>Another Headline!</h1>
<p>Test Paragraph!</p>高阶函数方法看起来确实更清晰,但是除了美学之外,还有什么其他的原因我可能希望更喜欢高阶函数而不是类呢?例如,关于以下方面
发布于 2021-01-26 12:54:11
高阶函数接受和/或返回函数。让我们看看这两种情况。
以函数作为参数
在这里,HOF绝对是该走的路。类版本相当于具有额外步骤的HOF。对于类版本,您需要预先协商函数可调用的密钥。这真的是一个无用的包装的肉,你想要完成的。
霍夫
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的封装,以及一个在它之上工作的函数。
我认为,如果您希望在某些数据上定义多个函数,当封装的数据可能发生更改(您正在编码状态机),或者希望操作特定于您的类时,类通常是有用的。类的用户需要知道在类上定义的操作)。
当我所做的工作相当于部分应用程序时,我会使用一个返回函数的函数(我有一个接受多个参数的函数,我想预先应用一些函数,比如'add')。我也会使用functools.partial来完成这个任务。
def adder(a):
return lambda b: a + bclass adder_class:
def __init__(self, a):
self.a = a
def add(self, b):
return a + b最终,无论是最好使用HOF还是使用类,从上下文中都会变得清楚。
https://stackoverflow.com/questions/65891682
复制相似问题