5.4 python内置高阶函数之--map、reduce、filter、sorted

 高阶函数满足条件:
     1、 函数名被作为参数传给另外一个函数
     2、 函数返回值为另外一个函数(返回为自己,则为递归)

一、 高阶函数:map

 【 map函数】说明
 可以去查看源码, 会发现:map的__init__中有两个参数:func, *iterables
 第一个参数func: 即:函数名, 即实现功能的函数,可以是自行定义的,也可以是内置支持的
 第二个参数iterables: 即:序列对象,如:str、list、等

【  案例说明】
 list1 = [1,2,3,4,5,6,7,8,9]
 要实现这样一个功能: 遍历list1每一个元素,并进行元素本身相乘2次生成新的列表,即:
 list2 = [1, 4, 9, 16, 25, 36, 49, 64, 81]
 【注】: 本次会稍带复习上一节内容: 列表生成式、生成器、迭代器

实现方法1: map

list1 = [1, 2, 3, 4, 5, 6, 7, 8, 9]
# 1、最初级实现:
list2 = []
for one in list1:
    list2.append(one * one)

# 2、借助列表生成器实现:
list2 = [one * one for one in list1]

# 3、 借助生成器 --与列表生成器实现复杂度大差不差,且无必要
list2 = (one * one for one in list1)


# 4、 借助迭代器实现
def func2(list1: list):
    for one_ele in list1:
        yield one_ele * one_ele


list2 = func2(list1)


# 5、借助map函数实现
def funcx(num):
    return num * num


list2 = map(funcx, list1)
print(list2)

通过map函数实现结果打印,我们会发现返回的是一个map实例对象
在这里插入图片描述
那么如果想要查看到所有元素,怎么处理呢? 这里就用到了 list函数
在这里插入图片描述
此案例可能大家会觉着还不如列表表达式实现方便呢? 就不需要map了吧? 当前案例只是说明用法, 一般情况map也不会应用在这么简单的场景中, 比如如果要进行特别多逻辑的特殊处理时,可能列表表达式就不足以支持了

实现方法2: map、lamda

像上述funcx()函数实现比较简单, 这种我们也可以使用内置的lamda来替代
list1 = [1, 2, 3, 4, 5, 6, 7, 8, 9]
# 6、借助map函数&、lamda函数实现
func = lambda x: x ** 2
list2 = list(map(func, list1))
print(list2)

在这里插入图片描述

二、 高阶函数: reduce

【 函数说明】 累计计算
     reduce把一个函数作用在一个序列[x1, x2, x3, ...]上,这个函数必须接收两个参数
     reduce把结果继续和序列的下一个元素做累积计算
    
 【案例说明】求列表元素和
    如: list1 = [1,2,3,4,5,6,7,8,9].    sum =45
from functools import reduce

list1 = [1, 2, 3, 4, 5, 6, 7, 8, 9]
# 1、普通实现算法
sum = 0
for one_ele in list1:
    sum += one_ele


# 2、 reduce用法
def add(x, y):
    return x + y


sum1 = reduce(add, list1)
print(sum)

在这里插入图片描述

三、 高阶函数: filter

    函数说明:
    1、 实现功能:filter()函数用于过滤实现符合条件的“筛选”内容(True)
    2、 与map区别点:filter()把传入的函数依次作用于每个元素,根据返回值(boolean)来确定要保留的数据(return结果为True)
    3、filter()函数返回的是一个Iterator,如果涉及计算结果,需要用list()函数获得所有结果并返回list
"""获取0-100内既是2又是3的倍数数据"""

def func(x):
    return x % 2 == 0 and x % 3 == 0


all_data = list(filter(func, range(1, 100)))
print(all_data)

在这里插入图片描述

四、 高阶函数: sorted

函数功能:用于排序
函数参数说明:  sorted(iterable, key=None, reverse=False)  
第1个参数: iterable 表示指定的序列
第2个参数: key 参数可以自定义排序规则,可以多项
第3个参数: reverse 参数指定以升序(False,默认)还是降序(True)进行排序
函数使用场景可参考如下案例说明 &代码是可以直接运行的:

1、简单排序-列表排序-无key

【备注】 元组也是同样使用方法,用法一致
list1 = [1, 4, 9, 17, 3, 8, 12, 34, 0, 3, 7, 4]

print(sorted(list1))

在这里插入图片描述

2、 较复杂排序, key字段

dict1 = [{"name": "Lujier1", "age": 19, "score": 99, "sex": "Female"},
         {"name": "Lujier2", "age": 21, "score": 102, "sex": "Female"},
         {"name": "Lujier3", "age": 22, "score": 132, "sex": "male"},
         {"name": "Lujier4", "age": 21, "score": 97, "sex": "male"},
         {"name": "Lujier5", "age": 32, "score": 103, "sex": "male"}]

# 按照score升序排列
print(sorted(dict1, key=lambda x: x['score']))
# 按照score降序排列
print(sorted(dict1, key=lambda x: -x['score']))
print(sorted(dict1, key=lambda x: x['score'], reverse=True))


# 按照age升序排序, 按照score降序展示(即:如果age相同,则高分在前)
print(sorted(dict1, key=lambda x: (x['age'], -x['score'])))

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值