洗礼灵魂,修炼python(25)--自定义函数(6)—从匿名函数进阶话题讲解中解析“函数式编程”

匿名函数进阶

前一章已经说了匿名函数,匿名函数还可以和其他内置函数结合使用

1.map

map():映射器,映射

洗礼灵魂,修炼python(25)--自定义函数(6)—从匿名函数进阶话题讲解中解析“函数式编程”

list(map(lambda x:x*2,range(10)))  #把range产生的数字映射进lambda函数里进行计算

结果:

洗礼灵魂,修炼python(25)--自定义函数(6)—从匿名函数进阶话题讲解中解析“函数式编程”

注意:mapmap(function, sequence[, sequence, ...])接受的参数,第一个是函数,第二个,第三个可选参数也是序列

当第一个参数不为函数时:

洗礼灵魂,修炼python(25)--自定义函数(6)—从匿名函数进阶话题讲解中解析“函数式编程”

因为把函数放进去,即代表要进行运算处理,设置为None即表示不做计算

说到这,说一下reduce()函数

2.reduce

reduce(function, sequence[, initial])看这个参数就知道和map函数很类似对吧?

洗礼灵魂,修炼python(25)--自定义函数(6)—从匿名函数进阶话题讲解中解析“函数式编程”

看例:

洗礼灵魂,修炼python(25)--自定义函数(6)—从匿名函数进阶话题讲解中解析“函数式编程”

洗礼灵魂,修炼python(25)--自定义函数(6)—从匿名函数进阶话题讲解中解析“函数式编程”

有没有发现什么?是的,此时它就是用来计算总数的

还有,reduce的第三个参数是一个基数,用来设置起始值的:

洗礼灵魂,修炼python(25)--自定义函数(6)—从匿名函数进阶话题讲解中解析“函数式编程”

而这些所有计算最关键的都在于传入的函数f,它是设定怎么计算的,比如我要让计算做平方:

洗礼灵魂,修炼python(25)--自定义函数(6)—从匿名函数进阶话题讲解中解析“函数式编程”

报错了,提示的是reduce必须给两个参数,我确实给了两个参数,但是还是报错啊?

再结合前面的例子,其实说的是reduce接受的函数必须接受两个参数,并不是指的reduce自身接受两个参数,所以,在使用reduce的时候,必须事先考虑好怎么计算,并不是什么都可以计算的

reduce可以用来操作阶乘:

比如5的阶乘:

洗礼灵魂,修炼python(25)--自定义函数(6)—从匿名函数进阶话题讲解中解析“函数式编程”

那么既然都说到这了,顺便说说filter函数

3.filter函数

filter(function or None, sequence):过滤器,筛选为真的参数

洗礼灵魂,修炼python(25)--自定义函数(6)—从匿名函数进阶话题讲解中解析“函数式编程”

例:

洗礼灵魂,修炼python(25)--自定义函数(6)—从匿名函数进阶话题讲解中解析“函数式编程”

再看:

python2下:

洗礼灵魂,修炼python(25)--自定义函数(6)—从匿名函数进阶话题讲解中解析“函数式编程”

python3下:

洗礼灵魂,修炼python(25)--自定义函数(6)—从匿名函数进阶话题讲解中解析“函数式编程”

所以,python2和python3下使用filter是不同的,记住就行

同样,filter函数也可以结合lambda匿名函数来计算:

洗礼灵魂,修炼python(25)--自定义函数(6)—从匿名函数进阶话题讲解中解析“函数式编程”

是不是方便很多?这就是匿名函数的好处

那么以上的几个函数,其实就是函数式编程的体现(你以为我会真的只是简单对匿名函数的补充?哈哈,这只是套路需要/滑稽)

函数式编程

1.什么是函数式编程?

又称泛函编程,是一种编程范型。它将计算机运算视为数学上的函数计算,并且避免可变状态以及可变数据

2.哪些是函数式编程:

函数式编程语言最重要的基础就是lambda演算,而且lambda演算的函数可以接受函数当作输入和输出

3.支持函数式编程的语言挺多的,但python支持的函数式编程有限:

1):map(function, sequence[, sequence, ...]):

将函数func作用于给定序列的每个元素,并用一个列表来提供返回值,如果func为None,则直接将后面的参数中序列中的每个元素依次组成一个新的列表,如果元素数量不对应,直接以None代替

2):reduce(function, sequence[, initial]):
将二元函数(两个参数)作用于seq序列的元素,每次携带一对(之前的结果以及下一个序列元素),依次将现有的结果和下一个值按照二元函数的计算规则计算,最后得到一个值返回,如果初始值iniial给定,则以这个初始值作为基数和序列中的第一个元素计算,得到结果再与下一个序列元素计算,依次类推得到一个值返回

3):filter(function or None, sequence):

调用一个会返回布尔值的func来遍历每个seq中的元素,返回一个使func返回值为True的元素组成的序列

4.函数式编程有如下好处:

1):代码更简洁,符合python宗旨
2):数据集操作,输入和输出都可以一起
3):没有循环体,减少临时变量,逻辑变得简洁
4):代码变成了在描述你要干什么,而不是怎么去干。

上一篇:javascript-onPress错误“不是函数”且“未定义”


下一篇:BZOJ 2822: [AHOI2012]树屋阶梯 [Catalan数 高精度]