python filter map_Python高阶函数filter、map、reduce的使用

试想一下,Python是一门怎样的语言?

没错,简单、优雅、易懂是它最明显的特征。笔者刚接触Python时,便开始惊叹这门语言强大的类库支撑,这种面向调用的编程方式属实真香,虽然性能有点可惜(尺有所短,寸有所长),但笔者对Python依旧爱的深沉。

Python中有着许多好用的内建函数供开发者使用,其中有这么个函数三兄弟filter、map、reduce被称作高阶函数,由于他们的使用方法比较类似,所以联合记忆起来也比较容易。

filter

filter主要用来过滤序列,可以理解为一个过滤器。

filter(function or None, iterable)

# function:判断函数

# iterable:可迭代对象

function参数用于对iterable进行过滤,将function返回值为False的元素过滤,剩下为True的元素将组成一个filter对象被返回(Python 2.x 返回的是列表)。

# 定义函数func

def func(x):

# x大于5时返回True,否则返回False

return x > 5

num_list = [1, 2, 3, 4, 5, 6, 7, 8, 9]

result = filter(func, num_list)

print(result)

# 输出:

通过上述代码可看到,filter函数返回的是一个filter对象,我们可以通过类型转换使其更加友好的显示。

print(result)

# 输出:

print(list(result))

# 转换为列表对象,输出:[6, 7, 8, 9]

print(tuple(result))

# 转换为元组对象,输出:(6, 7, 8, 9)

print(set(result))

# 转换为集合对象,输出:{8, 9, 6, 7}

需要注意的是,filter对象无法转换成字典dict,对于字典的过滤,我们需要些特殊处理,即提取value进行过滤。

def func(x):

# x为偶数时返回True,否则返回False

return x % 2 == 0

num_list = {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}

result = filter(func, num_list.values())

print(list(result))

filter可以结合匿名函数lambda使用。

num_list = [1, 2, 3, 4, 5]

# 筛选出大于2的数字

result = filter(lambda x: x > 2, num_list)

print(list(result))

# 输出:[3, 4, 5]

map

map函数会根据提供的函数对指定序列做映射。

map(function, iterable, ...)

# function:判断函数

# iterable:可迭代对象

map也是接受一个函数参数与一个迭代参数,通过函数参数对序列进行映射。

def func(x):

# 返回x的x次方

return x ** x

num_list = [1,2,3,4,5]

result = map(func, num_list)

print(result)

# 输出:

和filter类似,map函数返回的是一个map对象。同样可通过类型转换使其更加友好的显示,当然,同样的也无法转换成dict字典对象。

print(result)

# 输出:

print(list(result))

# 转换为列表对象,输出:[1, 4, 27, 256, 3125]

print(tuple(result))

# 转换为元组对象,输出:(1, 4, 27, 256, 3125)

print(set(result))

# 转换为集合对象,输出:{256, 1, 4, 3125, 27}

map函数还可以并行使用,非常的自由。

def func(x, y, z):

return x * 100 + y * 10 + z

num_list1 = [1, 4, 7]

num_list2 = [2, 5, 8]

num_list3 = [3, 6, 9]

result = map(func, num_list1, num_list2, num_list3)

print(list(result))

# 输出:[123, 456, 789]

map还可以用来做类型转换。

result = map(int, '1234')

for i in result:

print(f'{i}的类型为:{type(i)}')

# 输出:

# 1的类型为:

# 2的类型为:

# 3的类型为:

# 4的类型为:

同样的,map也可以与lambda函数结合使用。

num_list = [1, 2, 3, 4, 5]

# lambda返回x的平方

result = map(lambda x: x ** 2, num_list)

print(list(result))

# 输出:[1, 4, 9, 16, 25]

reduce

reduce函数会对参数序列中元素进行累积,首先看一下reduce的语法。

from functools import reduce

reduce(function, iterable[, initializer])

# function:函数参数

# iterable:可迭代对象

# initializer:可选,初始参数

function为函数参数,iterable依旧是可迭代对象,initializer为可选的初始参数。

在python3.x中,reduce移到了functools模块中,使用时需要先引入。

from functools import reduce

num_list = [1, 2, 3, 4, 5]

result = result = reduce(lambda x, y: x * 10 + y, num_list)

print(result)

# 输出:12345

通过上述案例可发现,reduce是通过可迭代对象的前两个元素传递给函数参数进行函数加工。

然而,有初始化值的情况下,这个时候就不是取迭代对象的前两项,而是取初始参数initializer和第一个元素。

from functools import reduce

num_list=[1, 2, 3, 4]

# 初始参数initializer,即 从5开始累加

result = reduce(lambda x, y: x + y, num_list, 5)

print(result)

# 输出:15

# 即: 5 + 1 + 2 + 3 + 4 = 15

以上便是这仨兄弟函数的技术总结,值得一提的是,自1994年Python 1.0 解释器发布起,Python便存在这三个高阶函数,以及匿名函数lambda。虽然,如今的2.x及3.x在这三个函数上有些不同的语法,但无伤大雅。

Python依然是那个Python。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值