翼度科技»论坛 编程开发 python 查看内容

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

3

主题

3

帖子

9

积分

新手上路

Rank: 1

积分
9
1高阶函数

1.1 数学概念

回顾下数学知识:
  1. y=f(x) 这是最开始接触的普通函数
  2. y=g(f(x)) 这个就是我们接触到的高阶函数
  3. 在数学和计算机科学中,高阶函数至少应当是满足下面一个条件的函数:
  4. 1)接受一个或者多个函数作为参数
  5. 2)输出一个函数
  6. 程序中我们的高阶函数也类似
复制代码
示例计数器的函数:
  1. def counter(base):
  2.     def inc(step=1):
  3.         nonlocal base
  4.         base += step
  5.         return base
  6.     return inc
复制代码
1.2 内建函数应用高阶函数举例
  1. sorte(iterable[,key][,reverse]) 排序,返回一个列表
  2. filter(function, iterable) 过滤可迭代对象的元素,返回一个迭代器
  3. map(function, *iterable) -->map object 对多个可迭代对象的元素按照指定的函数进行映射,返回一个迭代器
复制代码
2 装饰器

2.1 自定义高阶函数

柯里化Currying
自定义高阶函数前,先了解下柯里化Currying:
柯里化:指的是将原来接受两个参数的函数变成新的接收一个参数的函数,新的函数返回一个以原有第二个参数为参数的函数
  1. z = f(x, y)转换成z=f(x)(y)
复制代码
通过嵌套函数就可以把函数转换成柯里化函数
举例
  1. def add(x,y):
  2.     return x+y
复制代码
改变后
  1. def add(x):
  2.     def _add(y):
  3.         nonlocalt x
  4.         retrun x+y
  5.     return _add
复制代码
这就是一个简单的高阶函数
2.2 高阶函数应用--装饰器

引入:
存在一个add函数。
  1. def add(x, y):
  2.     return x + y
复制代码
这个add()太low了,我需要增强他的功能,譬如加入信息输出功能:
  1. def add(x, y):
  2.     print("call add, {}+{}".format(x,y))
  3.     return x + y
复制代码
上面的加法函数实现我的需求,但还是不够好,存在以下缺点:
1)打印语句的耦合太高。
2)add()属于业务功能,而输出信息属于非业务功能代码,类似日志的东东,放在add()函数不太合适。
那么改进下:
  1. def add(x, y):
  2.     return x + ydef logger(fn):    print("开始业务执行")    x = fn(4, 5)    print("执行结束,结果:", x)print(logger(add))
复制代码
好了一些,那继续改进
  1. def add(x,y):
  2.     return x+ydef logger(fn,x,y):    print("开始业务执行")    ret = fn(x,y)    print("执行结束",)    return ret
复制代码
改进后,fn的参数仍受限制,只能针对含有两个参数的add,我想让logger适用的范围更大一些,譬如我有一个sum(x,y,z)
继续改进
  1. def logger(fn,*args,**kwargs):
  2.     print("开始业务执行")
  3.     ret = fn(*args,**kwargs)
  4.     print("执行结束")
  5.     return ret
复制代码
这个时候,进行柯里化
  1. def logger(fn):
  2.     def _logger(*args, **kwargs):
  3.         print('before')
  4.         ret = fn(*args, **kwargs)
  5.         print('after')
  6.         return ret
  7.     return _logger
  8. # 如下调用,python学习交流群:489111204
  9. add = logger(add)  # 因为函数调用的关系,参数add的引用用在函数内部保存
  10. add(4, 5) # 调用的是内部保存的add引用,而非原本的add函数
复制代码
Python将其改进为装饰器
  1. #Python学习交流QQ群:489111204def logger(fn):    def _logger(*args, **kwargs):        print('before')        ret = fn(*args, **kwargs)        print('after')        return ret    return _logger@loggerdef add(x,y):
  2.     return x+yprint(add(4, 10))
复制代码
装饰器是高阶函数一个重要应用,是对传入函数的功能装饰或者是功能增强。

来源:https://www.cnblogs.com/python1111/p/17041319.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具