Python3(5)Python 函数式编程

本系列主要学习Python的基本使用和语法知识,后续可能会围绕着AI学习展开。

Python3 (1) Python语言的简介

Python3 (2) Python语法基础

Python3 (3) Python函数

Python3 (4) Python高级特性

Python3 (5) Python 函数式编程

Python支持函数式编程,允许把函数本身作为参数传入另一个函数,还允许返回一个函数!

高阶函数

对于一直在java中学习的人来说,高阶函数还是一个陌生、高大上的名词,它有三个特点:

变量可以指向函数

函数名也是变量

函数可以作为参数传入

所以高阶函数的定义:把函数作为参数传入,这样的函数称为高阶函数,函数式编程就是指这种高度抽象的编程范式。

输出结果:

几个内置高阶函数

map/reduce

首先声明map函数与java中的map是两个名词,没有关联。map高阶函数的定义:map()函数接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回。

输出结果:

将list中的元素转换成字符串。

reduce把一个函数作用在一个序列[x1, x2, x3, …]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算。

输出结果:

用list 实现一个按list序列生成一个整数,它的结果就是一个最终的数。

使用map 和 reduce 写一个字符串转整数的函数、字符串转浮点数的函数:

输出结果:

filter

用于过滤序列,filter 与map定义的格式相同,参数接受一个函数,一个序列,返回一个Iterator。filter通过判断函数的返回值是否为True来丢弃一些元素。

filter的主要应用是实现一个筛选函数:我们来实现一个素数的序列

输出结果:

实现原理,依次将3,5,7,9… 的倍数筛选完,最终剩下的为素数。

练习一个回数的筛选:从左向右读和从右向左读都是一样的数

输出结果:

sorted

sorted 排序高阶函数,它的使用非常灵活,可以传入自定义的排序函数、反向排序,在复杂的排序中核心代码还是非常的简洁。

输出结果:

返回函数

高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回,我们来聊一聊返回函数的问题。

当我们调用一个函数时,不需要立即得到结果,想在需要的时候再进行计算,那么我们就可以返回一个函数而不是直接一个结果。

输出结果:

从上面可以看出,函数返回值也是一个函数,需要再次调用才能得出结果,并且每次返回的都是一个新的函数。

闭包

闭包的定义与java中的内部类有些相似,闭包指的是函数再定义函数的情况,即:内部函数可以外部函数的参数和局部变量,当外部函数返回内部函数时,相关的参数和变量都保存在返回的函数中。这种行为称之为 “闭包”。

输出结果:

由于返回的函数不是立即执行,在调用执行时,变量已经成为3,如果要输出想要的值,需要再创建一个函数将变量i 与函数绑定。

匿名函数

匿名函数其实就是 表达式的使用,表达式的使用场景就是匿名函数,与java 的匿名类很相似。

关键字lambda表示匿名函数,冒号前面的x表示函数参数

匿名函数有个限制,就是只能有一个表达式,表达式的值就是返回值,不需要return

匿名函数也可以作为函数的返回值返回

输出结果:

装饰器

可以在这代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator)。decorator就是一个返回函数的高阶函数。装饰器在java中成为装饰者模式,需要通过继承,组合来实现,python中在函数层面就可以实现。这就是python 的强大之处

下面我们来通过示例学习,decorator的用法:

输出结果:

第一 我们定义了一个在函数调用开始前输出函数名的

第二 在使用装饰器时可以通过的方式注解也可以通过传入函数的方式

第三 在使用的方式装饰器后,函数的变成了 这样显然是不合理的,我们目的是为了扩展函数的功能,不是改变函数的签名,所以python 中 内置了来还原函数的签名,具体如下:

输出结果:

这个示例中我们验证了的用法,并且多层嵌套自定义log输出的字段。

下面做一个函数执行时间的练习:

输出结果:

偏函数

通过传入函数,和对应的规则,生成一个新的函数,方便调用 的方式成为偏函数。

偏函数的使用:

输出结果:

创建偏函数时,实际上可以接收函数对象、args和*kw这3个参数,偏函数是 functools 模块中提供的一种固定某些参数来简化一些函数的调用难度的作用。

参考

https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014317848428125ae6aa24068b4c50a7e71501ab275d52000

  • 发表于:
  • 原文链接:http://kuaibao.qq.com/s/20180123A0K71Q00?refer=cp_1026

同媒体快讯

相关快讯

扫码关注云+社区