第八讲
一. 内置函数
内置函数是系统自带的函数,如int,abs等。
可以通过cmd进入ipython输入dir(_ _ builtin _ _)来查看这些函数。
1. filter 函数
filter顾名思义,起一个过滤的作用
先来看一下函数定义:
一般来讲,采用filter(func,iterable)的形式,对iterable(即可迭代对象)中的元素送进func运行,对于返回值为True的保留,这里的func一般为一个表达式。最后生成一个filter object,如果要打印出来一般我们会让其形成列表。
举个例子:
这里我想强调说明一下:
单独去观察定义的函数是没有意义的,return 加一个表达式就是返回一个表达式,可以把它看成一个披了函数外表的表达式,filter函数要起作用还是得靠这个表达式,符合的表达式的item返回True,保留,不符合的剔除
这里给一篇针对filter, map, reduce函数的对比,点进去可以阅读一下。
2. reduce()函数
这个函数在python 2 里还是内置函数,在python 3 里面是放到了functools模块里,所以用之前需要调用。
reduce()会对参数序列中的元素进行累计,这种说法看起来有点抽象
我们先来看一下原代码:
关键词:两个argument,从左到右,减少序列长度变成一个值
实在不懂看下下面的例子,挺简洁。
这个函数的使用可以减少我们使用循环、递归等方法,看起来略高级。
例如,做一个阶乘:
最后会返回这个阶乘的值。
二. 内置函数和高阶函数
1. 匿名函数
匿名函数如图介绍:
我们这里前面用一个变量f来接收这个函数,方便我们以后调用。但匿名函数之所以存在是为了代码的简洁,举个例子:
我们可以直接写成如下代码:
稳如老狗!
再者,匿名函数可以作为函数返回值
比如:
这么写是完全可以的,但是注意一点,如果我们直接打印结果,像这样:
因为fx()返回的是一个lambda匿名函数,所以这样打印只会给一个lambda函数内存地址,如果我们想要的是匿名函数最后的执行结果,需要重新调用它,可以像这样操作:
用一个变量res来接收这个lambda函数,既然是函数,那么就可以调用,res()是调用的意思,把调用结果打印出来就是了。
匿名函数还可以作为参数,示例如下,虽然多此一举,但是便于理解:
不多讲了,自己体会下。
2. 高阶函数
什么是高阶函数?
满足以下两个条件之一就是高阶函数:
- 函数名可以作为参数输入;
- 函数名可以作为返回值。
例如map 和 filter,他们的参数之一是一个function,那么它们就是高阶函数。
3. 一个相关的小作业
通过这个案例,我们想体会一下匿名函数的应用场景应该是怎样的,这里同时补充一下列表中sort排序的使用规则:
先说一下sort函数原型:
L.sort(self,key=None,reverse=False)
这里补充一下key,key接收函数,只引用,不需要加括号调用。其规定的是排序的方法,比如按照元素长度排序,按照元素的绝对值排序等等,如下:
L.sort(self,key=len)
L.sort(slef,key=abs)
加上key后,会把列表中的元素先按照key中函数方法处理,比较处理后的元素然后进行排序。
习题如下:
给个列表,里面的元素是字典,我们想按照年龄大小排序,这么写:
使用匿名函数,简洁!
三. 闭包和装饰器
关于这一节的内容,我周旋了挺长一段时间,目前的总结或许将来会重新更改,不过先按照目前的理解来做笔记,实属一个难点!
1. 闭包
闭包是一种形式,这一节只讲它的形式,记住即可,它经常和装饰器搭配在一起,只有在实例中才可以理解它的存在是有理由的。
闭包需要满足三个条件:
- 在一个函数中定义了另外一个函数
- 内函数里运用到了外函数的临时变量
- 外函数的返回值是内函数的引用
满足这三点就是一个闭包。
写个代码举个例子:
def test1(a):
def test2(b): # 嵌套了一个函数在里面
c = a + b # 这里的a是对外函数变量的引用,因为内部没有定义a
print(c)
return test2 # 这里返回的是内函数的引用
res = test1(a) # 我们可以用一个变量来接收返回的函数
# 所以此时,res()就相当于test2()
我们可以用一个变量来接收返回函数的,这个时候res就可以通过加括号调用了,它实则就是test2函数。
上面的例子很简单,理解闭包的形式即可。
2. 计算函数运算时间功能代码
为了在解释装饰器的时候使用这个作为案例,我们先来做一个新内容的讲解,函数在计算机中运行是需要时间的,如何计算函数运行的时间呢?
我们可以定义一个函数,用来计算函数运行的时间:
代码如下,直接展示出:
import time # 需要导入time库才能使用
def timer(func):
start = time.time() # 计算开始的时间戳
func()
end = time.time() # 计算结束的时间戳
print(f'spend{end - start}')
我们只需要把我们的目标函数作为参数输入进去,通过执行timer(func)就可以在执行业务函数的同事最后输出我们函数的运行时间了。
这是写的一篇关于time库的一些使用方法,想拓展可以看一下
3. 装饰器
现在可以好好讲讲装饰器了。
比如现在有一个定义好的函数:
def test1(*args):
sum = 0
for i in args:
sum += i
print<