面向过程与函数式
面向过程
”面向过程“核心是“过程”二字,“过程”指的是解决问题的步骤,即先干什么再干什么......,基于面向过程开发程序就好比在设计一条流水线,是一种机械式的思维方式,这正好契合计算机的运行原理:任何程序的执行最终都需要转换成cpu的指令流水按过程调度执行,即无论采用什么语言、无论依据何种编程范式设计出的程序,最终的执行都是过程式的。
1、优点
将复杂的问题流程化,进而简单化
2、缺点
程序的可扩展性极差,
3、应用场景
面向过程的程序设计一般用于那些功能一旦实现之后就很少需要改变的场景, 如果你只是写一些简单的脚本,去做一些一次性任务,用面向过程去实现是极好的,但如果你要处理的任务是复杂的,且需要不断迭代和维护, 那还是用面向对象最为方便。
函数式
函数式编程并非用函数编程这么简单,而是将计算机的运算视为数学意义上的运算,比起面向过程,函数式更加注重的是执行结果而非执行的过程,代表语言有:Haskell、Erlang。而python并不是一门函数式编程语言,但是仍为我们提供了很多函数式编程好的特性,如lambda,map,reduce,filter
匿名函数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)
print(res)
匿名函数与有名函数有相同的作用域,但是匿名意味着引用计数为0,使用一次就释放,所以匿名函数用于临时使用一次的场景,匿名函数通常与其他函数配合使用
案例
salaries={
'siry':3000,
'tom':7000,
'lili':10000,
'jack':2000
}
要想取得薪水的最大值和最小值,我们可以使用内置函数max和min(为了方便开发,python解释器已经为我们定义好了一系列常用的功能,称之为内置的函数,我们只需要拿来使用即可)
print(max(salaries))
print(min(salaries))
#默认根据字符比较大小
"""结果如下"""
tom
jack
内置max和min都支持迭代器协议,工作原理都是迭代字典,取得是字典的键,因而比较的是键的最大和最小值,而我们想要的是比较值的最大值与最小值,于是做出如下改动
max1=max(salaries,key=lambda k:salaries[k])
print(max1)
min1=min(salaries,key=lambda k:salaries[k])
print(min1)
"""结果如下"""
lili
jack
直接对字典进行排序,默认也是按照字典的键去排序的
print(sorted(salaries))
"""结果如下"""
['jack', 'lili', 'siry', 'tom']
根据值的最大值与最小值排序
res=sorted(salaries,key=lambda k:salaries[k])
print(res)
"""结果如下"""
['jack', 'siry', 'tom', 'lili']
-
特点
- 使用lambda关键字创建函数
- 没有名字的函数
- 匿名函数冒号后面的表达式只有一个,注意:是表达式,而不是语句
- 匿名函数自带return,而这个return的结果是表达式计算后的结果
-
缺点
- lamdba只能是单个表达式:不是一个代码块,lamdba的设计就是为了满足简单的函数场景
- 仅仅能封装有限的逻辑,复杂逻辑实现不了,必须使用def来处理
#匿名函数
m=lambda x,y:x+y
#通过变量去调用匿名函数
print(m(23,19))
M=lambda a,b,c:a*b*c
print(M(1,2,3))
age =15
print('可以继续参军,'if age>18 else'继续上学')
C=lambda x,y:x if x>y else y
print(C(1,5))
re=(lambda x,y:x if x<y else y)(16,12)
print(re)
Rs=lambda x:(x**2)+890
print(Rs(10))
map、filter、reduce(了解)
l = ['zhoa', 'lisi', 'wangwu ']
res = map(lambda name: name + '_dsb', l)
print(res) # 生成器
res1 = filter(lambda name: name.endswith('u'), l)
print(res1)
from functools import reduce
res3=reduce(lambda x, y: x + y, [1, 2, 3],10)
print(res3)
"""结果如下"""
<map object at 0x0000014D2CDF7E80>
<filter object at 0x0000014D2CDF7D60>
16