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
写完这个代码以后,我同学下午就收到了offer(当然是因为他薪资要得比较低的原因!!!)
听了我同学的传奇经历,我决定好好的学一学python的哪些内建函数。
在此之前,我们需要了解一下lamba。

1:lambda

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的和。

上面两个代码返回的结果都一样,但是使用lambada更为简洁。
lambda与map,reduce等python内建函数配合使用能发挥更强大的作用。

2:map

map()是 Python 内置的高阶函数,它接收一个函数 f 和一个 list,并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 list 并返回。(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]

扫描二维码关注公众号,回复: 2744478 查看本文章

3:reduce

reduce()函数接收的参数和 map()类似,一个函数 f,一个list,但行为和 map()不同,reduce()传入的函数 f 必须接收两个参数,reduce()对list的每个元素反复调用函数f,并返回最终结果值。
python3使用reduce需要引入

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

这里以我同学笔试的题目为列子,他先定义了一个lambda表达式,目的是为了求两个数的和,使用range生成1-100的数,由于reduce对list的每个元素反复调用函数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

我同学的传奇经历到此为止,如果哪位老铁在面试过程中也遇上过有趣的面试题大家不妨共同分享一下。

这里写图片描述

猜你喜欢

转载自blog.csdn.net/katyusha1/article/details/81538944
今日推荐