首页 > 编程语言 >Python中高阶函数与装饰器教程

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

时间:2023-01-10 20:45:37浏览次数:32  
标签:教程 return 函数 Python add print logger 高阶 def

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))

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

标签:教程,return,函数,Python,add,print,logger,高阶,def
From: https://www.cnblogs.com/python1111/p/17041319.html

相关文章

  • python词典(Dictionary)的get()用法
    get()方法语法:dict.get(key,default=None)1.先定义字典>>>dict={'A':1,'B':2}2.当key值存在于dict.keys()中时,调用get()方法,返回的是对应的value值>>>print(d......
  • Python中的异常处理总结
    1.异常分类错误Error:原因示例笔误像变量名写错,造成的语法错误逻辑错误算法写错了,例如原本逻辑是求和,但写成了乘积函数或者类使用错误这类也归为逻辑错......
  • 【LabVIEW】调用Python节点
    系统环境LabVIEW202264bit英文版Python3.6.864bitPython节点简介Python节点可直接调用Python函数。Python节点为可扩展函数,可显示已连线的输入端和输出端的......
  • GPS转化ECEF坐标系(0) python和c++代码
    https://www.cxyzjd.com/article/taiyang1987912/112982150 importmatha=6378137b=6356752.3142f=(a-b)/ae_sq=f*(2-f)pi=3.14159265359'''......
  • python读取大文件
    """每次固定读取10000行"""withopen(filename)asf:whileTrue:next10k=list(islice(f,10000))#needlisttodolen,3linesdownfor......
  • 【python小课堂专栏】python小课堂24 - 正则表达式(二)
    python小课堂24-正则表达式(二)前言今天继续来介绍一下python的正则表达式,回顾一下上次介绍的re模块整篇文章围绕着re.findall()来进行实例的讲解,也就是所谓的查询操作。......
  • python:reshape()函数
    a.reshape(m,n)表示将原有数组a转化为一个m行n列的新数组,a自身不变。m与n的乘积等于数组中的元素总数reshape(m,n)中参数m或n其中一个可写为"-1","-1"的作用在于计算机根据......
  • python 使用函数名的字符串调用函数(4种方法)
    先看一个例子:>>>deffoo():print"foo">>>defbar():print"bar">>>func_list=["foo","bar"]>>>forfuncinfunc_list:func()TypeError......
  • pycharm:无法加载文件 C:\Users\admin\PycharmProjects\pythonProject1\venv\Scr
    以前一直在vmware虚机上用pycharm,这次想在win10pc上试试 安装pycharm后,打开终端直接报错:无法加载文件C:\Users\admin\PycharmProjects\pythonProject1\venv\Scripts......
  • 用python做个简单的监控
    今天在看博客园的时候看到一篇文章,忘记是什么地址了,之前我也做过一个类似的监控,不过不好控制。之前的模式是通过内网地址访问相应的php程序,php调用python程序,能捕获到摄像......