Python3中map(),reduce(),filter()的详细用法
本文详细解析Python3中map、reduce和filter三个高阶函数的用法。map用于序列映射,返回迭代器;filter用于条件过滤;reduce需引入functools模块进行累积计算。文章通过具体代码示例展示了单参数、多参数及lambda匿名函数的结合使用,帮助开发者写出更简洁的代码。
前言
在Python3中,map()、reduce()和filter()是三个常用于处理序列数据的内置高阶函数。它们通常与匿名函数lambda配合使用,能够显著提升代码的简洁性和执行效率。本文将深入讲解这三个函数的具体用法和注意事项。
1.map()函数详解
map()函数的主要作用是对指定序列进行映射操作,其返回值是一个迭代器。该函数的基本语法结构如下所示:
map(function, *iterables)在上述语法中,第一个参数function代表一个可调用函数,第二个参数iterable代表一个或多个可迭代对象。在执行过程中,map()会遍历可迭代对象中的每个元素,并将它们作为参数传递给function函数进行计算。最终,函数会生成一个新的迭代器,其中包含每次调用function后的返回值。
当仅传入一个可迭代对象时:
"""计算列表中每个元素的三次方"""
def demo_map(x):
return x ** 3
nums = [1, 2, 3, 4, 5]
print(list(map(demo_map, nums))) # 输出:[1, 8, 27, 64, 125]
# 使用匿名函数
print(list(map(lambda x: x ** 3, nums))) # 输出:[1, 8, 27, 64, 125]若需处理多个可迭代对象:
"""计算3个列表中对应下标元素的和"""
def demo_map(x, y, z):
return x + y + z
nums1 = [1, 2, 3, 4, 5]
nums2 = [11, 22, 33, 44, 55]
nums3 = [100, 200, 300, 400, 500]
print(list(map(demo_map, nums1, nums2, nums3))) # 输出:[112, 224, 336, 448, 560]
# 使用匿名函数
print(list(map(lambda x, y, z: x + y + z, nums1, nums2, nums3))) # 输出:[112, 224, 336, 448, 560]
2.filter()函数详解
filter()函数用于对序列进行过滤操作,剔除不符合条件的元素,其返回值同样是一个迭代器。其使用语法如下:
filter(function or None, iterable)与map()类似,filter()的第一个参数function指定一个函数,第二个参数iterable指定一个可迭代对象。执行后,将返回一个包含每次调用function函数结果(布尔值)的迭代器,仅保留True对应的元素。
"""找出从 -5 到 5 中能被 4 整除的所有整数"""
def demo_filter(x):
return x % 4 == 0
nums = range(-5, 6)
print(list(nums)) # 输出:[-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5]
# 传入None,只返回true的值(0是False,所以被过滤掉了)
print(list(filter(None, nums))) # 输入:[-5, -4, -3, -2, -1, 1, 2, 3, 4, 5]
# 传入正常函数,过滤出 nums 中能被 4 整除的整数
print(list(filter(demo_filter, nums))) # 输出:[-4, 0, 4]
# 使用匿名函数
print(list(filter(lambda x: x % 4 == 0, nums))) # 输出:[-4, 0, 4]在使用map()和filter()时,有以下两点关键区别需要注意:
- map()函数必须传入一个正常的可调用函数;而filter()函数既可以传入正常函数,也可以传入None。当filter()的function参数为None时,它只返回可迭代对象中所有布尔值为True的元素。
- map()函数支持传入多个可迭代对象,并并行处理;而filter()函数仅支持传入一个可迭代对象。
3.reduce()函数详解
reduce()函数的作用是对参数序列中的元素进行累积计算,最终返回一个单一的值。
需要注意的是,在Python3中,reduce()已从内置全局命名空间中移除。若需使用此功能,必须通过导入functools模块来调用reduce()函数。
其标准使用语法如下:
from functools import reduce
reduce(function, sequence[, initial])在上述语法中,第一个参数function代表一个函数,且该函数必须接收两个参数;第二个参数sequence代表一个序列;第三个参数initial代表初始值,默认为None。
例如,执行reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]),其计算过程相当于((((1+2)+3)+4)+5),即从左到右依次对元素进行二元运算。
from functools import reduce
def demo_reduce(x, y):
return x + y
nums = range(1, 101)
print(reduce(demo_reduce, nums)) # 输出:5050
# 使用匿名函数
print(reduce(lambda x, y: x + y, nums)) # 输出:5050
# 设置初始值为 1000
print(reduce(lambda x, y: x + y, nums, 1000)) # 输出:6050上述介绍的map()、reduce()和filter()均属于Python3中的高阶函数。它们最大的优势在于能使代码更加简洁易读。当然,如果不使用这些高阶函数,开发者也可以通过常规的循环或列表推导式等方式实现相同的功能。
至此,关于Python3中map()、reduce()和filter()的详细用法介绍完毕。如需了解更多相关Python map()、reduce()、filter()的内容,建议搜索本站历史文章或继续浏览后续相关文章。感谢大家的支持!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













