Python中高阶函数与装饰器教程

1高阶函数

1.1 数学概念

回顾下数学知识:

y=f(x) 这是最开始接触的普通函数
y=g(f(x)) 这个就是我们接触到的高阶函数

在数学和计算机科学中,高阶函数至少应当是满足下面一个条件的函数:
1)接受一个或者多个函数作为参数
2)输出一个函数

程序中我们的高阶函数也类似

示例计数器的函数:

def counter(base):
    def inc(step=1):
        nonlocal base
        base += step
        return base
    return inc

1.2 内建函数应用高阶函数举例

sorte(iterable[,key][,reverse]) 排序,返回一个列表
filter(function, iterable) 过滤可迭代对象的元素,返回一个迭代器
map(function, *iterable) -->map object 对多个可迭代对象的元素按照指定的函数进行映射,返回一个迭代器

2 装饰器

2.1 自定义高阶函数

柯里化Currying

自定义高阶函数前,先了解下柯里化Currying:
柯里化:指的是将原来接受两个参数的函数变成新的接收一个参数的函数,新的函数返回一个以原有第二个参数为参数的函数

z = f(x, y)转换成z=f(x)(y)

通过嵌套函数就可以把函数转换成柯里化函数

举例

def add(x,y):
    return x+y

改变后

def add(x):
    def _add(y):
        nonlocalt x
        retrun x+y
    return _add

这就是一个简单的高阶函数

2.2 高阶函数应用--装饰器

引入:
存在一个add函数。

def add(x, y):
    return x + y

这个add()太low了,我需要增强他的功能,譬如加入信息输出功能:

def add(x, y):
    print("call add, {}+{}".format(x,y))
    return x + y

上面的加法函数实现我的需求,但还是不够好,存在以下缺点:
1)打印语句的耦合太高。
2)add()属于业务功能,而输出信息属于非业务功能代码,类似日志的东东,放在add()函数不太合适。

那么改进下:

def add(x, y):
    return x + y

def logger(fn):
    print("开始业务执行")
    x = fn(4, 5)
    print("执行结束,结果:", x)

print(logger(add))

好了一些,那继续改进

def add(x,y):
    return x+y

def logger(fn,x,y):
    print("开始业务执行")
    ret = fn(x,y)
    print("执行结束",)
    return ret

改进后,fn的参数仍受限制,只能针对含有两个参数的add,我想让logger适用的范围更大一些,譬如我有一个sum(x,y,z)
继续改进

def logger(fn,*args,**kwargs):
    print("开始业务执行")
    ret = fn(*args,**kwargs)
    print("执行结束")
    return ret

这个时候,进行柯里化

def logger(fn):
    def _logger(*args, **kwargs):
        print('before')
        ret = fn(*args, **kwargs)
        print('after')
        return ret
    return _logger
# 如下调用,python学习交流群:489111204
add = logger(add)  # 因为函数调用的关系,参数add的引用用在函数内部保存
add(4, 5) # 调用的是内部保存的add引用,而非原本的add函数

Python将其改进为装饰器

#Python学习交流QQ群:489111204
def logger(fn):
    def _logger(*args, **kwargs):
        print('before')
        ret = fn(*args, **kwargs)
        print('after')
        return ret
    return _logger

@logger
def add(x,y):
    return x+y

print(add(4, 10))

装饰器是高阶函数一个重要应用,是对传入函数的功能装饰或者是功能增强。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python中高阶函数与装饰器教程 - Python技术站

(0)
上一篇 2023年3月31日
下一篇 2023年3月31日

相关文章

  • Python迭代器是啥?

    迭代器:迭代的工具。迭代是更新换代,如你爷爷生了你爹,你爹生了你,迭代也可以说成是重复,并且但每一次的重复都是基于上一次的结果来的。如计算机中的迭代开发,就是基于软件的上一个版本更新。以下代码就不是迭代,它只是单纯的重复 while True: print(‘*’*10) 一、可迭代对象 python中一切皆对象,如 x = 1 name = ‘nick’ …

    Python开发 2023年3月31日
    00
  • python教程:函数的return语句运用

    return语句用于退出函数,向调用方返回一个表达式。 return在不带参数的情况下(或者没有写return语句),默认返回None。 None是一个特殊的值,它的数据类型是NoneType。NoneType是Python的特殊类型,它只有一个取值None。 它不支持任何运算也没有任何内建方法,和任何其他的数据类型比较是否相等时永远返回false,也可以将…

    Python开发 2023年4月2日
    00
  • Python中logging模块用法

    一、低配logging 日志总共分为以下五个级别,这个五个级别自下而上进行匹配 debug–>info–>warning–>error–>critical,默认最低级别为warning级别。 1.v1 import logging logging.debug(‘调试信息’) logging.info(‘正常信息’) loggi…

    Python开发 2023年3月31日
    00
  • python中如何修改文件?

    修改的概念:对于硬盘上数据的修改, 根本没有改的操作, 只有覆盖操作 修改的流程:文件的修改都是数据加载到内存中, 在内存中修改完再覆盖入硬盘 一.修改方式一 1.修改过程 先以 r 模式打开源文件,将源文件内容全部读入内存 然后在内存中完成修改 再以 w 模式打开源文件,将修改后的内容覆盖入源文件 2.优缺点 优点 : 不须要硬盘预留足够的空间 缺点 : …

    python 2023年4月17日
    00
  • Python类和对象的绑定方法及非绑定方法

    类中定义的方法大致可以分为两类:绑定方法和非绑定方法。其中绑定方法又可以分为绑定到对象的方法和绑定到类的方法。 一、绑定方法 1 对象的绑定方法 在类中没有被任何装饰器修饰的方法就是 绑定到对象的方法,这类方法专门为对象定制。 class Person: country = “China” def __init__(self, name, age): sel…

    Python开发 2023年3月31日
    00
  • Python学习:import的正确用法

    import语句用来导入其他python文件(称为模块module),使用该模块里定义的类、方法或者变量,从而达到代码复用的目的。 将要建立文件的结构为: Tree |____ m1.py |____ m2.py |____ Branch |____m3.py |____m4.py 首先,先建立一个文件夹Tree作为工作目录,并在其内建立两个文件m1.py和…

    Python开发 2023年4月2日
    00
  • Http和Https的区别?

    1.HTTP是什么? http是超文本传输协议用来在web浏览器和网站服务器之间传递数据信息,http以明文的方式发送内容,不提供任何方式的数据加密,如果攻击者截获了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此,HTTP协议不适合传输一些敏感信息,比如:信用卡号、密码等支付信息。为了解决http协议的这一缺陷,需要使用另一种协议:安…

    Python开发 2023年4月2日
    00
  • 获取Python函数信息的方法

    Python的反射机制可以动态获取对象信息以及动态调用对象,本文介绍如何获取对象中的函数注释信息以及参数信息。 定义一个Person类: class Person(): def talk(self, name, age, height=None): “””talk function :return: “”” print(f”My name is {name}…

    python 2023年4月18日
    00
合作推广
合作推广
分享本页
返回顶部