繁体   English   中英

高阶函数和类有什么区别?

What is the difference between a higher-order function and a class?

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我正在学习函数式编程的基础知识,最终接触到了高阶函数的概念。 我在Corey Schafer 的这个视频中看到了一个例子(从 11:00 开始),它显示了一个 Python 函数,可以将消息包装在任意 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 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!')

输出:

<h1>Test Headline!</h1>
<h1>Another Headline!</h1>
<p>Test Paragraph!</p>

高阶函数方法确实看起来更简洁,但除了美观之外,还有其他原因我可能更喜欢高阶函数而不是类吗? 例如,关于方面

  • 性能
  • 内存
  • ...
1 个回复

高阶函数采用和/或返回函数。 让我们来看看这两种情况。

将函数作为参数

在这里,一个 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的封装,以及一个对其进行处理的函数。

我认为,如果您希望在某些数据上定义多个函数,当封装的数据可以更改(您正在对状态机进行编码),或者当您希望操作特定于您的类时,类通常很有用(即您的类的用户需要知道在类上定义的操作)。

我会使用一个返回函数的函数,当我所做的相当于部分应用时,(我有一个接受多个参数的函数,我想预应用一些,比如“添加”)。 我也会使用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 还是使用类将从上下文中变得清晰。

1 高阶函数和装饰器有什么区别?

我确实理解高阶函数是将函数作为参数或返回函数的函数。 我也知道装饰器是向其他函数添加一些功能的函数。 他们究竟是什么。 它们是作为参数传入的函数还是它们本身是高阶函数? 注意:如果你给出一个例子,请用python给出 ...

2020-06-11 16:09:57 2 618   python
3 简单来说,thunk和高阶函数之间有什么区别?

我知道两者都是返回函数的函数。 到目前为止,我使用thunk的经验一直在使用它们返回函数而不仅仅是动作对象,这样我就可以在Redux处理异步请求。 闭包是一个高阶函数(HOF)的实现,以便为私有变量创建一个新的范围......对吗? HOF的其他示例包括map , reduce和f ...

4 回调、高阶函数、回调队列有什么区别

在这一点上,我有一个问题,什么是回调,什么使它与高阶函数不同,它与回调队列的概念有什么关系? 来自 MDN: 回调函数 回调函数是作为参数传递给另一个函数的函数,然后在外部函数内部调用该函数以完成某种例程或动作。 看起来与高阶函数的定义有重叠。 一个被传递(然后被调用)到另一个函数的函数。 ...

6 类的高阶函数示例

function fluent() { return function (...args) { console.log(args); }; } function Person() {} Person.prototype.setName = fluent(function (first, ...

9 currying和高阶函数之间的区别

看看Scala中的编程 (控件抽象)我看到这两个具有相同效果的例子: 1.高阶函数 2.卷曲功能 他们之间有什么区别? 我们能否始终以两种方式获得相同的结果? ...

2013-09-16 12:43:47 5 3024   scala
10 提升和高阶函数之间的区别

当人们谈论map , fold或bind ,我通常会听到“提升”一词,但基本上每个高阶函数不是某种提升吗? 为什么不能将filter设为从a -&gt; Bool到[a] -&gt; [a]的提升,甚至将bool函数(模拟if语句的模型)也视为从a -&gt; a到Bool -&gt; a ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM