Python从入门到实践:函数之两种编程思想(面向过程与函数式编程)

目录

一、面向过程编程

二、函数式编程

3.1 lambda匿名函数

3.2 map、reduce、filter

3.2.1 map-操作每一个元素

3.2.2 reduce-合并操作

3.2.3 filter-过滤掉不符合条件的元素


一、面向过程编程

一般编程思想分为三类:面向过程、函数式编程、面向对象。

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

“面向过程”的重心就在过程二字,把一个大问题拆分成很多个小问题,然后依次执行每个小问题,这是一种流水线的、从上而下的过程。

所以,“面向过程”的优点很明显,就是编程思路清晰,但是有一个致命的缺点就是代码迁移性差,可复用性低,比如我写一个制造卡车的程序,然后我在写一个制造私家车的程序,两者其实有很多相似之处,但是“面向过程”的思想可能会修改很多代码,而后面提到的“面向对象”可以很好的胜任这个问题!

面向过程的程序设计一般用于那些功能一旦实现之后就很少需要改变的场景, 如果你只是写一些简单的脚本,去做一些一次性任务,用面向过程去实现是极好的,但如果你要处理的任务是复杂的,且需要不断迭代和维护, 那还是用面向对象最为方便。

二、函数式编程

python并不是一门函数式编程语言,但是仍为我们提供了很多函数式编程好的特性,如lambda, map, reduce, filter

3.1 lambda匿名函数

我们通过def关键字生成的是有名函数,使用lambda关键字创建的是匿名函数

lambda 参数1,参数2,...: expression
# 1、定义
lambda x,y,z:x+y+z

#等同于
def func(x,y,z):
    return x+y+z

# 2、调用
# 方式一:
res=(lambda x,y,z:x+y+z)(1,2,3)

# 方式二:
func=lambda x,y,z:x+y+z # “匿名”的本质就是要没有名字,所以此处为匿名函数指定名字是没有意义的
res=func(1,2,3)

匿名函数与有名函数有相同的作用域,但是匿名意味着引用计数为0,使用一次就释放,所以匿名函数用于临时使用一次的场景,匿名函数通常与其他函数配合使用,我们以下述字典为例来介绍它

salaries={
    'siry':3000,
    'tom':7000,
    'lili':10000,
    'jack':2000
}

>>> max(salaries)
'tom'
>>> min(salaries)
'jack'

内置max和min都支持迭代器协议,工作原理都是迭代字典,取得是字典的键,因而比较的是键的最大和最小值,而我们想要的是比较值的最大值与最小值,于是做出如下改动

# 函数max会迭代字典salaries,每取出一个“人名”就会当做参数传给指定的匿名函数,然后将匿名函数的返回值当做比较依据,最终返回薪资最高的那个人的名字
>>> max(salaries,key=lambda k:salaries[k]) 
'lili'
# 原理同上
>>> min(salaries,key=lambda k:salaries[k])
'jack'

#同理,我们直接对字典进行排序,默认也是按照字典的键去排序的
>>> sorted(salaries)
['jack', 'lili', 'siry', 'tom']

3.2 map、reduce、filter

函数map、reduce、filter都支持迭代器协议,用来处理可迭代对象,我们以一个可迭代对象array为例来介绍它们三个的用法

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

3.2.1 map-操作每一个元素

对array的每个元素做平方处理,可以使用map函数

map会依次迭代array,得到的值依次传给匿名函数(也可以是有名函数),而map函数得到的结果仍然是迭代器。

>>> res=map(lambda x:x**2,array)
>>> res
<map object at 0x1033f45f8>
>>>

>>> list(res) #使用list可以依次迭代res,取得的值作为列表元素
[1, 4, 9, 16, 25]

3.2.2 reduce-合并操作

对array进行合并操作,比如求和运算,这就用到了reduce函数

 reduce函数可以接收三个参数,一个是函数,第二个是可迭代对象,第三个是初始值

>>> from functools import reduce 
>>> res=reduce(lambda x,y:x+y,array)
>>> res
15

 使用reduce函数,需要注意以下几点:

1 没有初始值,reduce函数会先迭代一次array得到的值作为初始值,作为第一个值数传给x,然后继续迭代一次array得到的值作为第二个值传给y,运算的结果为3

2 将上一次reduce运算的结果作为第一个值传给x,然后迭代一次array得到的结果作为第二个值传给y,依次类推,知道迭代完array的所有元素,得到最终的结果15

也可以为reduce指定初始值

>>> res=reduce(lambda x,y:x+y,array,100)
>>> res
115

3.2.3 filter-过滤掉不符合条件的元素

filter函数会依次迭代array,得到的值依次传给匿名函数,如果匿名函数的返回值为真,则过滤出该元素,而filter函数得到的结果仍然是迭代器。

对array进行过滤操作,这就用到了filter函数,比如过滤出大于3的元素

>>> res=filter(lambda x:x>3,array)
>>> list(res) 
[4, 5]

猜你喜欢

转载自blog.csdn.net/weixin_43507744/article/details/126579129