面向过程编程和匿名函数
面向过程编程和匿名函数
一、面向过程编程
面向过程编程是一种编程范式,也就是编程思想,面向过程编程是计算机最基本的运作流程,当我们要求完成一项功能的时候,首先将要求拆分为一个个小的功能,然后再继续拆分,直到整个流程像工厂的流水线一样,最后组装在一起就能完成这个功能。
-
优点就是比较符合大脑思维,将问题变得易于处理。
-
缺点就是可拓展性差,针对性比较强,一旦需要改变功能就需要定制新的流水线。
但是面向过程编程的思想是贯穿程序运行的始终的,无论之后你学习哪种编程方式,面向过程都是基础。
二、匿名函数
2.1 匿名函数详解
什么是匿名函数呢?顾名思义就是没有名字的函数,是用关键字lamda来定义的。具体使用如下。
# lambda的定义:lambda 参数:运行的代码
lambda x,y:x+y # 这就定义了一个简单的匿名函数
# 匿名函数的使用方式1:
res = lambda x,y:x+y
res(1,2)
# 匿名函数的使用方式2:
res = (lambda x,y:x+y)(1,2)
上述两种使用方法看得出来并不是匿名函数的正确的使用方法,只能说是函数的简写,因为在全局变量中能通过变量名去找到该函数的内存地址。真正的匿名函数是怎么样的存在呢?
- 首先匿名函数是临时存在,运行一次就回收了。
- 不需要赋予变量名。
那我们怎么使用呢?是与其他的函数配套使用的,下面讲述几个函数的应用。
2.2 max、min、sorted和匿名函数的使用
我们都知道内置方法max和min的作用,分别是求最大值和最小值,他们还有一些有意思的玩法。比如他们其实还可以用来比较字典的value值大小。
salaries={
'siry':3000,
'tom':7000,
'lili':10000,
'jack':2000
}
# 打印出最大值的名字。
print(max(salaries,key=lambda x:salaries[x]))
# 打印出最小值的名字
print(min(salaries,key=lambda k:salaries[k]))
# 将薪资从小到大排列
print(sorted(salaries,key=lambda k:salaries[k]))
上述都是根据匿名函数的使用,将对字典key的排列变成对value的排列。
2.3 map\filter\reduce和匿名函数的使用
map(匿名函数,可迭代对象),其作用是对可迭代对象中的数据根据匿名函数的要求进行统一的加工处理。
l = [1,2,3,4,5]
# 此时的res是一个生成器
res = map(lambda x:x**2,l)
filter(匿名函数,可迭代对象),其作用是对函数内部的元素进行过滤,符合条件的留下,不符合条件的不留。
l = [1,2,3,4,5]
# 此时的a是生成器。
a = filter(lambda x:x>2,l)
reduce在Python3中已经不是内置函数了,要想使用reduce,就需要行第三方库导入了。
reduce(匿名函数,可迭代对象,初始值),其作用是根据将可迭代对象中的每个元素按照匿名函数的程序统一集合到一起。
如果不设置初始值,那么reduce就会首先从可迭代对象中凑齐参数运行一次,将其结果作为初始值,如果设置的有初始值,那么直接就进行函数运行,将值与初始值合并。
import functools import reduce
l = [1,2,3,4,5]
# 此时的q是可迭代对象中所有元素合并的结果。
q = reduce(lambda x,y:x+y,l,o)
当然,我们也有其他的方法来得到结果,这三个方法主要是让了解一下函数式编程的思想。
算法中的二分法
算法是一种高效解决问题的方法,不是说不用算法达不到目标,只是用了算法会更加高效。下面介绍一个简单的算法:二分法
当一个列表中的元素从小到大排列,我们判断一个元素是不是在这个列表里,那么我们就可以使用这种算法。
def half_find(num,l):
if len(l) == 0:
print("没有找到")
return
half_index = len(l)//2
if num > l[half_index]:
l = l[half_index+1:]
half_find(num,l)
elif num < l[half_index]:
l = l[:half_index]
half_find(num,l)
else:
print("找到了")