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

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

Stack Overflow用户
提问于 2020-06-11 16:09:57
回答 2查看 2.2K关注 0票数 7

我理解高阶函数是以函数作为参数或返回函数的函数。我还知道装饰器是为其他函数添加一些功能的函数。他们到底是什么。它们是作为参数传入的函数还是高阶函数本身?

注意:如果要给出一个示例,请在python中给出。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-06-11 16:16:01

高阶函数是将函数作为参数或*返回函数的函数。

Python中的装饰器(通常)是一个高阶函数的示例,但也有不是的装饰器(类装饰器**,以及不是函数的装饰器),还有一些高阶函数不是装饰器,例如那些带有两个必需参数的函数。

不是装饰师,不是高阶函数:

代码语言:javascript
复制
def hello(who):
    print("Hello", who)

不是装饰师,而是高阶函数:

代码语言:javascript
复制
def compose(f, g):
    def wrapper(*args, **kwargs):
        return g(f(*args, **kwargs))
    return wrapper

装饰师,而不是高阶函数:

代码语言:javascript
复制
def classdeco(cls):
    cls.__repr__ = lambda self: "WAT"
    return cls

# Usage:
@classdeco
class Foo:
    pass

装饰师,高阶函数:

代码语言:javascript
复制
def log_calls(fn):
    def wrapper(*args, **kwargs):
        print("Calling", fn.__name__)
        return fn(*args, **kwargs)
    return wrapper

*不是异或

**你是否认为类装饰师是高阶函数,因为类是可调用的等等,我想是值得讨论的。

票数 10
EN

Stack Overflow用户

发布于 2020-06-11 16:26:40

高阶函数是以函数作为参数或返回函数的函数。

修饰器语法是一种语法快捷方式:

代码语言:javascript
复制
@f
def g(...):
    ...

只是一个方便的缩写

代码语言:javascript
复制
def g(...):
    ...
g = f(g)

因此,装饰师实际上只是一个以另一个函数作为参数的函数。谈论使用f作为装饰师比说f是装饰师要准确得多。

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

https://stackoverflow.com/questions/62328661

复制
相关文章

相似问题

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