Python 基础入门第八讲 函数(下)

本文详细介绍了Python中的内置函数,如filter和reduce,以及高阶函数的概念,包括匿名函数和高阶函数的使用。此外,还探讨了闭包和装饰器,解析了它们的工作原理和应用场景,包括带参数的装饰器和多层装饰器的调用顺序。通过实例和代码演示,帮助读者更好地理解和掌握Python函数与装饰器的高级用法。
摘要由CSDN通过智能技术生成

第八讲

一. 内置函数

内置函数是系统自带的函数,如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. 高阶函数

什么是高阶函数?
满足以下两个条件之一就是高阶函数:

  1. 函数名可以作为参数输入;
  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. 闭包

闭包是一种形式,这一节只讲它的形式,记住即可,它经常和装饰器搭配在一起,只有在实例中才可以理解它的存在是有理由的。

闭包需要满足三个条件:

  1. 在一个函数中定义了另外一个函数
  2. 内函数里运用到了外函数的临时变量
  3. 外函数的返回值是内函数的引用

满足这三点就是一个闭包。
写个代码举个例子:

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<
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值