本章笔记主要包括:函数引用、高阶函数、内建函数、匿名函数、偏函数
1、函数引用
我们通常定义变量的采用如下方式:
这就表明了age这个变量具有了表示年龄的这种能力,Python中变量不仅仅可以接收基本类型和我们创建的对象,同样它也允许接收函数。当变量接收函数的时候,他就具备了函数的能力,我们来看一下代码:
运行结果:
从结果上我们可以看出,当把函数赋值给变量的时候,当前变量的类型是函数,变量获取的是函数的引用,和我们通常方式不同的是,当变量接收函数,使用形式是“变量名()”。
2、高阶函数
之前我们见到的函数都是传入的形参普通的变量类型,返回的也只是普通的类型,代码如下:
我们上面谈到的函数引用,表明变量允许被赋值为函数,此处所谓的高阶函数其实就是一个函数允许接受一个函数作为参数或返回值是一个函数,形参为函数的代码如下:
代码中不难看出sum函数自身是不具备计算的功能的,他之所以能计算是调用了我们传入的func函数。
除了形参可以传入函数,Python中还允许函数作为返回值,代码如下:
运行结果:
当在函数内部定义了一个函数,且使用到外部函数的变量的时候,我们成内部的这个函数叫“闭包”,闭包是一直持有外部变量状态的,我们来看个斐波那契的例子:
运行结果:
通过运行的结果我们可以发现,内部函数是一直持有外部函数的值的。闭包可以提高代码的复用性。
注:
闭包因为可以外部局部变量的持有状态,所以会导致占用内存
3、内建函数
python解释器启动后会默认加载一些函数,这些函数称之为内建函数,我们并不需要刻意的去记忆这些内建函数,查看加载的函数和函数使用方式,可以使用如下代码:
运行结果:
下面我们来看看几个常用的内建函数。
3.1 map
使用help查询map的使用方式:
在Python3.x版本中,map是內建类的形式,如上面的代码所示。Python2.x版本中则是內建方法会出现,如:
虽然Python2和3的表现形式不一样,但是基本功能相似,此处不做具体区分,有兴趣可以自己网上对比一下。我们直接看Python3,map是內建类能够返回map的obj(返回值是个迭代器)。第一个参数为一个可执行函数,第二个可变参数为可迭代对象(是一个或多个序列,取决于function需要几个参数)执行方式是,遍历迭代对象,将值对应放入可执行函数中进行映射处理,测试代码如下:
运行结果:
其中第一个迭代对象中值对应的是函数参数x,第二个迭代对象对应的是函数参数y。
3.2 reduce
Python3中,reduce函数从全局名字空间里移除, 被放置在fucntools模块中,所以使用之前需要引入,代码如下:
运行结果:
第一个参数表示可执行函数,第二个参数表示一个序列(允许为str,tuple,list),initial表示初始值可以不写,功能表示依次从序列中取前两个值执行方法体内容,将结果返回与下一个值一起执行方法体。(有初始值时第一个元素和initial 作为参数调用函数)示例代码如下:
3.3 filter
filter在Python2和Python版本表现形式不同,可以类比map,,此处不做详细介绍。filter存在两个参数,第一个参数表示可执行函数,第二个参数为可迭代对象。功能表示对序列按照function进行过滤,为True保留,测试代码如下:
运行结果:
3.4 sorted
sorted具有排序功能,我们来看看函数的构造:
sorted允许传入三个参数,其中第一个参数表示可迭代对象,第二个参数表示排序规则可自定义(默认常规的大小排序),第三个参数默认是从小到大排序(改成true反转排序),测试代码如下:
运行结果:
注:合理的使用内置的一些高阶函数会减少我们的代码书写量。
4、匿名函数
常规的函数都是有名字的,但是如果我们写了个高阶函数,还得显示的定义一个函数,这样真的是太麻烦了。Python中有限的支持使用匿名函数,在一些简单的场景下我们可以使用匿名函数代替具名函数,匿名函数语法:lambda 参数1,参数2,... ,参数n :返回值,代码如下:
Python中的匿名函数形式:“lambda x, y : x + y”,对比我们之前的func函数,不难发现两者的功能是一致的。相比具名函数,匿名函数的代码量少,最重要的我们不要再去考虑如何命名。
匿名函数也是函数,所以我们可以把匿名函数赋值给变量,如:
和具名函数不一样的是,匿名函数实际上只能算是表达式,只是具有函数的功能,匿名函数是不能像普通函数写方法体,他只有一行语句。所以只能应用于相对简单的场景中。
注:
匿名函数是函数更是一个表达式,返回值中不允许书写代码块
参数个数允许 >= 0,test2 = lambda : print("测试无参")
必须有返回值,“print”的返回值类型是是NoneType,可以使用type测试类型
5、偏函数
偏函数的功能有点类似我们之前看的传入默认参数,我们先看看默认参数情况下的代码:
改写成偏函数如下:
functools.partial可以为我们创建一个偏函数,其作用就是,把一个函数的某些参数给设置默认值,返回一个新的函数,调用起来会简单一些。我们一般会对内建函数使用偏函数设定一些初始值。
6、总结
Python中函数也是对象,允许被赋值给变量;
合理使用高阶函数和匿名函数可以减少代码量;
闭包的持有外部函数的局部变量的状态,提高代码的复用性,但是会占用内存。
领取专属 10元无门槛券
私享最新 技术干货