Python3中map与reduce函数详解及实例

晚来风
晚来风
发布时间:2026-10-15 | 3人浏览过
原创

本文深入解析Python3中map、reduce及filter三个高阶函数的用法。通过lambda表达式简化匿名函数定义,结合具体代码实例演示如何利用map进行序列映射、reduce进行累积计算,并对比filter的过滤功能。文章涵盖单/多序列处理、初始值设置及常见注意事项,帮助开发者写出更简洁高效的Python代码。

Python3的map与reduce

一个月前,一位同学参加Python开发岗位面试时,被要求用三种不同方法实现1到100的求和,且代码需尽量简洁。他提交的代码如下:

#第一种
sum1 = 0
for i in range(1,101):
    sum1+=i
print(sum1)
#第二种
print(sum(range(1,101)))
#第三种
print(reduce(lambda x,y:x+y,range(1,101)))

上述三种方法计算结果均为5050。写完代码后,该同学下午便收到了录用通知(当然,部分原因也是因为他要求的薪资较低)。受此经历启发,我决定系统学习Python的内建函数。在此之前,需要先了解lambda表达式。

1:lambda

lambda是一个表达式,用于定义匿名函数,它简化了函数定义的书写形式,使代码更加简洁直观。例如,平时手写一个求两个数之和的函数,通常写法如下:

    def f(x,y):
        return x+y
    print(1,2)

而使用lambda可以简化为:

    f = lambda x,y:x+y
    print(f(1,2))

此处lambda定义了一个匿名函数,x和y为入口参数,x+y为函数体,最终返回x与y的和。

上述两种代码返回结果一致,但lambda写法更为简洁。lambda与map、reduce等Python内建函数配合使用,能发挥更强大的作用。

2:map

map()是Python内置的高阶函数,它接收一个函数f和一个列表(或可迭代对象),将函数f依次作用于列表的每个元素,返回一个新的列表(在Python3中返回的是迭代器)。

f = lambda x,y,z:x+y+z
x = map(f,[1,2,3],[4,5,6],[7,8,9])
for i in x:
    print(i)

这段代码分别对三个列表进行求和,返回一个可迭代对象。计算过程为: (1+4+7) (2+5+8) (3+6+9)

运行结果

或者可以使用list()将迭代器转换为列表:

print(list(x)

运行结果 [12, 15, 18]

3:reduce

reduce()函数接收的参数与map()类似,包括一个函数f和一个列表,但行为不同。reduce()传入的函数f必须接收两个参数,它对列表的每个元素反复调用函数f,并返回最终结果值。在Python3中使用reduce需要引入functools模块:

from functools import reduce
print(reduce(lambda x,y:x+y,range(1,101)))

以我同学笔试题目为例,他先定义了一个lambda表达式用于求两个数之和,使用range生成1到100的数字。由于reduce对列表元素反复调用函数f并返回最终结果,其执行过程为: (1,2,3,4,5,6,7,8,9……..100) 1+2=3 3+3=6 6+4=10 10+5=15 ……….. 这样执行等效于计算1+2+3+4+…….+100。

reduce()还可以接收第3个可选参数,作为计算的初始值。如果将初始值设为100,计算如下:

print(reduce(lambda x,y:x+y,range(1,101),100))

计算结果为5150

我同学的传奇经历到此结束。如果各位在面试中也遇到过有趣的面试题,欢迎分享交流。

补充:

Python3中map()、reduce()、filter()的用法详解

Python3中的map()、reduce()、filter()这三个函数通常用于对序列进行操作,它们经常需要与匿名函数lambda联合使用,下面我们来详细学习。

1.map()

map()可用于对指定序列做映射,返回值是一个迭代器,其使用语法如下:

map(function, *iterables)

上述第一个参数function指一个函数,第二个参数iterable指一个或多个可迭代对象。执行过程中,会对可迭代对象中的每一个元素调用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()类似,上述第一个参数function指一个函数,第二个参数iterable指一个可迭代对象。执行后会得到一个包含每次调用function函数返回值的迭代器。

"""找出从 -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。当传入None时,只返回可迭代对象中所有符合true值的元素。
  • map支持传入多个可迭代对象,而filter函数中只能传一个可迭代对象。

3.reduce()

reduce()可用于对参数序列中的元素进行累积,返回的是一个值。

在Python3中,reduce()已被从全局名字空间移除。如需使用,需通过引入functools模块来调用reduce()函数,其使用语法如下:

from functools import reduce
reduce(function, sequence[, initial])

上述第一个参数function指一个函数,且该函数必须含有2个参数;第二个参数sequence指一个序列;第三个参数initial指初始值,默认为None。

例如存在函数:reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]),它相当于 ((((1+2)+3)+4)+5)。

"""计算 1-100 所有整数之和"""
'''
学习中遇到问题没人解答?小编创建了一个Python学习交流群:711312441
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
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()的用法的文章就介绍到这了,更多相关Python3 map()、reduce()、filter()内容请搜索本站以前的文章或继续浏览下面的相关文章,希望大家以后多多支持本站!

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表