这几个高阶函数一定要会——Map/reduce/filter/sorted

往期精彩

还在用Matplotlib? 又一可视化神器pyecharts登场

Python-Seaborn绘图(matplotlib补充)

小白级OpenCV入门

Q1

什么是高阶函数?

高阶函数英文叫Higher-order function。

所谓高阶,说白了就是一个函数作为另一个函数的参数传入,函数上又套了一层函数。

高阶函数

def inner(x):
    return x**2

def outer(a, func): # 其中 func 表示一个函数名
    return b(a)

num = outer(3, inner)
print(num)

[out]: 9

Map

map()和reduce()是一种在处理大数据时的重要思想,在平时也可以利用。map取映射的意思,reduce取归纳的意思。

函数:map(func, lsd) 函数接收两个参数,一个是函数,另一个是个序列。

功能:将传入的函数依次作用在序列中的每一个元素,并把结果作为一个新的 Iterator 返回。

注:可迭代对象是个惰性列表,直接输出为一个地址,要想输出里面内容需要显式的写出来,eg:print(list(res))

# 下面实例的目标是将列表中的字符转换为整形

def char2int(chr):
    return {'0':0, '1':1, '2':2, '3':3}[chr] # 通过字典来返回转换后的结果

lis = ['2','1','3','0']
res = map(char2int, lis) # 用自己写的函数映射到每个元素上

print(res) # 惰性列表,返回一个内存地址
print(list(res)) # 强制转换成列表

[out]: <map object at 0x000001BC12FB8D30>
       [2, 1, 3, 0]

当然除了自己写的函数外,也可以利用python的内置函数。

res2 = map(int, lis) # 通过内置函数来实现
print(list(res2))

[out]: [2, 1, 3, 0]
看过上面的示例就会发现,这不就是循环遍历吗,尽然能用这么简洁的程序表示出来。其实,不仅仅是这些,遇到大量复杂的数据时,它会发挥出更明显的优势。

Reduce

reduce是map的孪生兄弟,一个是映射关系,一个是归纳关系。

函数:reduce(func, lsd) 参数一是函数,参数二是序列。

功能:reduce把一个函数作用在序列上,而这个函数必须接收两个参数,reduce的结果继续和序列的下一个元素进行累积运算。

注:reduce需要引入:from functools import reduce

eg:reduce(f, [a,b,c]) 等价于 f(f(a,b),c) —— f 是一个接受两个参数的函数。

# 实现一个累加
from functools import reduce
# 自定义的两输入加法
def Sum(a,b):
    return a + b
lis = [1,2,3,4,5]

res = reduce(Sum, lis) # 对序列中的元素类似递归的加进去
print(res)             # 由于reduce返回的只是一个结果,不必考虑map中提到的问题

[out]: 15

Map和reduce经常是配合起来使用的,下面有一个简单的例子,例子旨在介绍如何使用,无需关心是否实用。

# 这段代码是想要将一段数字的字符串转换为整型

from functools import reduce # 引入reduce方法

def str2int(str):
    # reduce中使用的函数,将map转换后的列表中元素,生成按顺序排列的整型数字
    def fc(x,y):
        return x * 10 + y
    # 把字符串中每个元素转换成对应的整型数字,返回一个整型的列表
    def fs(chr):
        return {'0':0, '1':1, '2':2, '3':3,'4':4, '5':5, '6':6, '7':7, '8':8, '9':9}[chr]
    return reduce(fc, map(fs,list(str))) # 先使用map函数把每个元素转成数字,然后用reduce函数把数字拼接起来
res = str2int('2314233123')
print(res)

[out]: 2314233123

Filter

函数:filter(function or None, iterable)  参数一是函数,参数二是个序列

功能:用于过滤序列,把传入的函数依次作用于序列的每一个函数根据返回的是True和False决定是否保留该元素。

list = [1,2,3,4,5,6,7,8,9,0]
def func(num):
  if num % 2 == 0:
    return True
  else:
    return False

res = filter(func, list)
print(res5) # 惰性列表,这样只输出地址
print(list(res))

[out]: <filter object at 0x000001BC12CE0748>
       [2, 4, 6, 8, 0]

Sorted

相必排序函数是大家最常见的,在这里就不多介绍了,它可以对数字以及字符等类型根据ASCII码就行排序。

函数:sorted() 接收一个序列等参数用来排序,除此之外,还可以接收key函数,实现自定义的排序,以及reverse函数,实现正反序排列。

普通排序:
lis1 = [3,4,5,3,5,7,8,6,9]
lis2 = sorted(lis1)
print(lis1)
print(lis2)

绝对值排序:
lis3 = [3,4,-5,3,5,-7,8,6,9]
# key接受函数来实现自定义排序规则,可以是系统的也可以是自定义的
lis4 = sorted(lis3, key = abs)
print(lis3)
print(lis4)

降序排序:
reverse=True

[out]: [3, 4, 5, 3, 5, 7, 8, 6, 9]
       [3, 3, 4, 5, 5, 6, 7, 8, 9]
       [3, 4, -5, 3, 5, -7, 8, 6, 9]
       [3, 3, 4, -5, 5, 6, -7, 8, 9]

上面是sorted的基本排序呢方式,可以看到sorted函数并不对原序列产生影响。有个容易混淆的地方是,sort() 方法,是在原序列上进行排序呢。

lis1 = [3,4,5,3,5,7,8,6,9]
lis1.sort()
print(lis1)

[out]: [3, 3, 4, 5, 5, 6, 7, 8, 9]

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值