首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >高阶函数和类的区别是什么?

高阶函数和类的区别是什么?
EN

Stack Overflow用户
提问于 2021-01-25 20:05:17
回答 1查看 224关注 0票数 2

我正在学习functional 的基础知识,并最终理解了高阶函数的概念。我在这个Corey Schafer拍摄的视频中看到了一个示例(从11:00开始),它显示了一个可以将消息包装在任意HTML标记中的函数:

代码语言:javascript
复制
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!')

输出:

代码语言:javascript
复制
<h1>Test Headline!</h1>
<h1>Another Headline!</h1>
<p>Test Paragraph!</p>

我知道它为您提供了为不同目的重用相同函数的灵活性(在本例中是不同的标记)。但是,您也可以使用Python类实现相同的结果:

代码语言:javascript
复制
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!')

输出:

代码语言:javascript
复制
<h1>Test Headline!</h1>
<h1>Another Headline!</h1>
<p>Test Paragraph!</p>

高阶函数方法看起来确实更清晰,但是除了美学之外,还有什么其他的原因我可能希望更喜欢高阶函数而不是类呢?例如,关于以下方面

  • 性能
  • 内存
  • ..。
EN

回答 1

Stack Overflow用户

发布于 2021-01-26 12:54:11

高阶函数接受和/或返回函数。让我们看看这两种情况。

以函数作为参数

在这里,HOF绝对是该走的路。类版本相当于具有额外步骤的HOF。对于类版本,您需要预先协商函数可调用的密钥。这真的是一个无用的包装的肉,你想要完成的。

霍夫

代码语言:javascript
复制
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]

类版本

代码语言:javascript
复制
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来完成这个任务。

代码语言:javascript
复制
def adder(a):
  return lambda b: a + b
代码语言:javascript
复制
class adder_class:
  def __init__(self, a):
    self.a = a

  def add(self, b):
    return a + b

最终,无论是最好使用HOF还是使用类,从上下文中都会变得清楚。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65891682

复制
相关文章

相似问题

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