python:浅析“高阶函数”

python:高阶函数

1、高阶函数

(1)什么是高阶函数?

​ 所谓高阶函数就是:函数中可以传入另一个函数作为参数函数,听起来比较绕口,那么我给大家举一个例子:比如你要对一个或多个可迭代对象做一系列的操作,什么操作呢?就是你函数是做什么操作的,它就做什么操作,也可以说是对一个或多个可迭代对象中的每一个元素进行函数中的操作,至于做什么操作那得看需求,然后完成这个目标,我们就可以使用高阶函数

(2)作用

​ 对一个或多个序列中的元素进行操作时,比如说替换、筛选、求和,那么我们就可以将使用高阶函数,那么高阶函数的第一个参数必须为函数,第二个参数为一个或多个可迭代对象。

2、分类

(1)map( )函数

1. 描述

​ map()函数会根据提供的函数,对指定序列做映射。也就是说序列中的每一个元素会调用提供的function函数,返回包含每次function函数返回值的新列表,实则是一个map对象,那么就要将这个map对象转换为list类型即可

2.案例

**需求:**对指定列表中的每个元素求平方,并返回一个列表

# 【1】使用列表推导式快速创建一个包含1-10元素的列表
my_list = [i for i in range(1,11)]
# 【2】标准函数
def func(a):
    return a ** 2
# 【3】使用map函数对列表中的每个元素做函数中的操作,并将返回的元素组成一个新列表,返回一个map对象
ret = map(func,my_list)
# 【4】将map对象转换为list类型输出
print(list(ret))

​ **注意:**以上函数使用的是标准函数,如果说该函数只有一个表达式,我情愿使用匿名函数,这样运行效率还会大幅度提升,下面这个代码块将使用匿名函数

# 【1】使用列表推导式快速创建一个包含1-10元素的列表
my_list = [i for i in range(1, 11)]
# 【2】使用map函数对列表中的每个元素做匿名函数中的操作,并将返回的元素组成一个新列表,返回一个map对象
ret = map(lambda a: a ** 2, my_list)
# 【3】将map对象转换为list类型输出
print(list(ret))

​ 当然应用肯定不止这些,比如说是替换掉元素中字符串中的某个字符,也可以使用这个,不过肯定要使用字符串replace()替换函数,在这里就不做解释了

(2)reduce( )函数

​ **说明:**reduce() 函数在 python 2 是内置函数, 从python 3 开始移到了 functools 模块,所以要使用reduce()函数必须先导入functools模块下的部件reduce

# 导入functools模块下的部件reduce
from functools import reduce
1.描述

​ reduce( )函数接收的参数与map( )函数类似,都是一个函数,一个或多个序列。但 reduce( )函数的行为有些不同,其一:它所接收的函数必须接收两个参数,其二:reduce( )函数,会对序列中的元素进行累计,或者说是运算,比如序列元素的和、差、商、乘积等的运算,更准确一点说是序列内部之间的计算,最后返回一个结果

2.reduce( )运行机制

​ 首先,第一个参数function必须有两个参数,参数a和b分别接收列表中的第一个和第二个值,两个数计算的结果存储到a中,然后又将列表的第三个值传入b,再和a计算,又放到a里边,最终计算完,返回的是一个a,所以它的运行机制类似于 : a += b

3.案例

​ **需求:**计算列表中的所有元素的和

# 【1】导入functools模块下的部件reduce
from functools import reduce
# 【2】使用列表推导式,创建一个包含1-100之间数字的列表
my_list = [i for i in range(1,101)]
# 【3】使用reduce函数对该列表中的元素进行lambad表达式中的操作,最后返回一个结果
ret = reduce(lambda a,b:a+b,my_list)
# 注意:这里当然可以是-、/、*,根据需求而定
# 最后处处计算的结果
print("和为:",ret)

(3)filter( )函数

1.描述

​ filter( )函数用于过滤序列,或者说筛选序列。过滤掉序列中不符合条件的元素,返回一个可迭代对象,或者说是filter对象,当然如果你想要的是一个列表,那就转换为列表。

​ 该函数和map、reduce函数一样的都是接收两个参数,参数一为:function函数,参数二为:iterable可迭代的对象,或者说序列,当然这个序列可以是多个。

​ 序列中的元素作为参数,依次传入函数,当然这个函数是判断的,如果判断是你想要的数字,那么就返回True,否则返回False。最后filter( )函数会将返回True的元素装进一个新的列表,最后判断完了就将列表返回,当然返回的是filter对象地址,你需要和map( )函数一样转换为list对象

2.案例

​ **需求:**找出序列中的所有奇数,并返回一个列表

# 匿名函数:

# 【1】首先先用列表推导式,创建一个包含1-100的列表
my_list = [i for i in range(1,101)]
# 【2】因为匿名函数会默认会返回数据,不需要属于return,所以当表达式成立那么就会返回数据,只要不是0都会返回True,所以生成的列表中存储的就是1-100之内的奇数
ret = filter(lambda a:a % 2 != 0,my_list)
print("1-100的奇数为:",list(ret))
# 标准函数
# 【1】首先先用列表推导式,创建一个包含1-100的列表
my_list = [i for i in range(1,101)]
# 【2】定义一个函数,接收一个参数,当不能被2整除就是奇数,就将这个数返回,注意:不为0的数字都是True
def func(a):
    if a % 2 != 0:
        return a
# 【3】使用filter函数根据func函数中的条件筛选列表中元素,并将返回True的元素装进列表,最后返回一个filter对象
ret = filter(func,my_list)
# 【4】将filter对象转换为列表输出
print("1-100的奇数为:",list(ret))

**注意:**当然filter函数的用处不仅在这里,还用在找符合要求的字符串等……其他类型等的操作中

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

御弟謌謌

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值