python中高阶函数和装饰器_三.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) 排序,返回一个列表
filter(function, iterable) 过滤可迭代对象的元素,返回一个迭代器
map(function, *iterable) -->map object 对多个可迭代对象的元素按照指定的函数进行映射,返回一个迭代器
2 装饰器
2.1 自定义高阶函数
2.1.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
# 如下调用
add = logger(add) # 因为函数调用的关系,参数add的引用用在函数内部保存
add(4, 5) # 调用的是内部保存的add引用,而非原本的add函数
Python将其改进为装饰器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高阶函数和装饰器相关推荐
- 全阶滑模观测器程序_感应电动机全局高阶滑模观测器
感应电动机全局高阶滑模观测器 史宏宇 ; 冯勇 ; 张袅娜 [期刊名称] <吉林大学学报(工学版) > [年 ( 卷 ), 期] 2013(043)003 [摘要] 提出了一种基于高阶滑模 ...
- python 生成器装饰器_七.python迭代器生成器装饰器
1.迭代器 1.1 什么是可迭代对象(Iterable)? 定义:可以直接作用于for循环的对象统称为可迭代对象,即Iterable. 可迭代对象包括: 1.集合数据类型:如list.tuple.di ...
- python order函数_Python进阶内容(一)--- 高阶函数 High order function
0. 问题 # 本文将围绕这段代码进行Python中高阶函数相关内容的讲解 # 文中所有代码的兼容性要求为:Python 3.6,IPython 6.1.0 def addspam(fn): def ...
- python数据可视化从入门到实战_《Python编程从入门到实践》json数据可视化练习详解...
<Python编程从入门到实践>16.2中,计算收盘价均值的程序有些不易看懂,结合我自己的理解进行一些说明. 使用的数据集:join格式的数据, 数据集是由多个字典为元素组成的列表.每个字 ...
- Kotlin学习三:高阶函数
目录 一.高阶函数的基本概念 二.常见高阶函数 1.关于list映射 2.flatMap 3.综合1 4.综合2 三.尾递归优化 四.闭包 五.函数复合 六.科理化 七.偏函数 八.小案例 一.高阶函 ...
- python中高阶函数改写学生信息管理程序_python利用高阶函数实现剪枝函数
本文为大家分享了python利用高阶函数实现剪枝函数的具体代码,供大家参考,具体内容如下 案例: 某些时候,我们想要为多个函数,添加某种功能,比如计时统计,记录日志,缓存运算结果等等 需求: 在每个函 ...
- python 日志 装饰器_【Python】装饰器实现日志记录
好的日志对一个软件的重要性是显而易见的.如果函数的入口都要写一行代码来记录日志,这种方式实在是太低效了,但一直没有找到更好的方法.后来用python写一些软件,了解到python的装饰器功能时,突然人 ...
- 带有返回值的装饰器_如何使用带有工厂功能的装饰器
带有返回值的装饰器 Discover Functional JavaScript was named one of the best new Functional Programming books ...
- python类修饰器_《Python有什么好学的》之修饰器
"Python有什么好学的"这句话可不是反问句,而是问句哦. 主要是煎鱼觉得太多的人觉得Python的语法较为简单,写出来的代码只要符合逻辑,不需要太多的学习即可,即可从一门其他语 ...
最新文章
- 深度学习加速器堆栈Deep Learning Accelerator Stack
- 盘点3个提升技能的AI项目,NLP/CV/BI,3个方向
- 一个不错的命令行解析类
- 用python画猫咪怎么画-如何用Python实现可视化地图
- BugkuCTF-Misc:多种方法解决
- python父类的类成员怎么定义_python如何找到哪些父类定义子对象的方法
- 技术和赚钱真的冲突吗?
- 单片机STM8S测量电压电路_单片机设计的胶带输送机智能模糊检测系统,准确性高,胶带寿命长...
- 2005毕业生薪酬预测女超男
- 【联合仿真】Adams六关节机械臂与Matlab/Simulink的联合仿真(下)
- matlab红色爱心,心形图的matlab实现
- 用单片机控制直流电机
- mysql 优化sql语句的几种方法
- python函数速查手册_Pandas常用函数速查手册中文版
- 系统辨识(一):相关概念
- JSP入门之表格以及常用表单元素(总结自身编程经验以及多本教科书)
- cnBeta.COM 2010年度精彩评论
- Android JetPack Room
- 牛客练习赛$18E\ pocky$游戏 状压$dp$
- 捡到的苹果6plus怎么解id要多少钱