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高阶函数和装饰器相关推荐

  1. 全阶滑模观测器程序_感应电动机全局高阶滑模观测器

    感应电动机全局高阶滑模观测器 史宏宇 ; 冯勇 ; 张袅娜 [期刊名称] <吉林大学学报(工学版) > [年 ( 卷 ), 期] 2013(043)003 [摘要] 提出了一种基于高阶滑模 ...

  2. python 生成器装饰器_七.python迭代器生成器装饰器

    1.迭代器 1.1 什么是可迭代对象(Iterable)? 定义:可以直接作用于for循环的对象统称为可迭代对象,即Iterable. 可迭代对象包括: 1.集合数据类型:如list.tuple.di ...

  3. python order函数_Python进阶内容(一)--- 高阶函数 High order function

    0. 问题 # 本文将围绕这段代码进行Python中高阶函数相关内容的讲解 # 文中所有代码的兼容性要求为:Python 3.6,IPython 6.1.0 def addspam(fn): def ...

  4. python数据可视化从入门到实战_《Python编程从入门到实践》json数据可视化练习详解...

    <Python编程从入门到实践>16.2中,计算收盘价均值的程序有些不易看懂,结合我自己的理解进行一些说明. 使用的数据集:join格式的数据, 数据集是由多个字典为元素组成的列表.每个字 ...

  5. Kotlin学习三:高阶函数

    目录 一.高阶函数的基本概念 二.常见高阶函数 1.关于list映射 2.flatMap 3.综合1 4.综合2 三.尾递归优化 四.闭包 五.函数复合 六.科理化 七.偏函数 八.小案例 一.高阶函 ...

  6. python中高阶函数改写学生信息管理程序_python利用高阶函数实现剪枝函数

    本文为大家分享了python利用高阶函数实现剪枝函数的具体代码,供大家参考,具体内容如下 案例: 某些时候,我们想要为多个函数,添加某种功能,比如计时统计,记录日志,缓存运算结果等等 需求: 在每个函 ...

  7. python 日志 装饰器_【Python】装饰器实现日志记录

    好的日志对一个软件的重要性是显而易见的.如果函数的入口都要写一行代码来记录日志,这种方式实在是太低效了,但一直没有找到更好的方法.后来用python写一些软件,了解到python的装饰器功能时,突然人 ...

  8. 带有返回值的装饰器_如何使用带有工厂功能的装饰器

    带有返回值的装饰器 Discover Functional JavaScript was named one of the best new Functional Programming books ...

  9. python类修饰器_《Python有什么好学的》之修饰器

    "Python有什么好学的"这句话可不是反问句,而是问句哦. 主要是煎鱼觉得太多的人觉得Python的语法较为简单,写出来的代码只要符合逻辑,不需要太多的学习即可,即可从一门其他语 ...

最新文章

  1. 深度学习加速器堆栈Deep Learning Accelerator Stack
  2. 盘点3个提升技能的AI项目,NLP/CV/BI,3个方向
  3. 一个不错的命令行解析类
  4. 用python画猫咪怎么画-如何用Python实现可视化地图
  5. BugkuCTF-Misc:多种方法解决
  6. python父类的类成员怎么定义_python如何找到哪些父类定义子对象的方法
  7. 技术和赚钱真的冲突吗?
  8. 单片机STM8S测量电压电路_单片机设计的胶带输送机智能模糊检测系统,准确性高,胶带寿命长...
  9. 2005毕业生薪酬预测女超男
  10. 【联合仿真】Adams六关节机械臂与Matlab/Simulink的联合仿真(下)
  11. matlab红色爱心,心形图的matlab实现
  12. 用单片机控制直流电机
  13. mysql 优化sql语句的几种方法
  14. python函数速查手册_Pandas常用函数速查手册中文版
  15. 系统辨识(一):相关概念
  16. JSP入门之表格以及常用表单元素(总结自身编程经验以及多本教科书)
  17. cnBeta.COM 2010年度精彩评论
  18. Android JetPack Room
  19. 牛客练习赛$18E\ pocky$游戏 状压$dp$
  20. 捡到的苹果6plus怎么解id要多少钱

热门文章

  1. MySQL表碎片化(Table Fragmentation)以及处理
  2. 数据结构与算法之二分查找法
  3. 《软件工程》实验报告——软件设计
  4. Python——基本统计值计算
  5. CG CTF WEB 伪装者
  6. [USACO1.2]回文平方数 Palindromic Squares
  7. linux 访问磁盘bin,zabbix应用之Low-level discovery监控磁盘IO
  8. 2021 考研 基本常识
  9. MyBatis-学习笔记02【02.Mybatis入门案例】
  10. GitHub 实现多人协同提交代码并且权限分组管理