函数表达由两部分组成
1、编程语言定义的函数
2、数学意义的含函数
先有变量的 数学关系 再用编程语言定义的 函数去实现这个 数学的函数 在程序里面的调用
函数编程得好处是 代码比较简洁 但是可读性差
函数编程的内部不应该有变量赋值这样的保存形式,这样容易把程序写死了,后期修改比较繁琐
不同编程模式,相同的条件和结果,但是代码表达方式却不同
1、
nnn = [12,3,4,88,96,55,46]
x = 0
for n in nnn:
x = x + n
print(x)
2、
nnn = [12,3,4,88,96,55,46]
def Diejia (shuzu):
x = 0
for n in shuzu:
x = x + n
return x
print(Diejia(nnn)) #304
3、
nnn = [12,3,4,88,96,55,46]
def Jiafa(x,n):
x = x + n
return x
def XunHuan (shuzu):
x = 0
for n in shuzu:
x = Jiafa(n, x)
return x
print(XunHuan(nnn)) #304
4、
nnn = [12,3,4,88,96,55,46]
def XunHuan (jiagong,shuzu):
x = 0
for n in shuzu:
x = jiagong(n, x)
return x
print(XunHuan(lambda x,n:x + n,nnn)) #304
常用处理命令
1、map 可以调用内部函数,处理序列中的每一个元素,得到的结果是一个‘列表’该‘列表’元素个数及位置与原来一样
liebiao = [2,4,6,8,3]
print(list(map(lambda a:a + 1,liebiao))) #[3, 5, 7, 9, 4]
这里就是用 map 调用 liebiao 中得每一个元素,并且用 lambda a:a + 1 这个匿名函数进行加工,然后从新组成一个数列
如果不适用map这个命令,使用函数和匿名函数编程就会是下面得样子
liebiao = [2,4,6,8,3]
liebiao1 = []
def XunHuan(yunsuan,zhi):
for x in zhi:
x = yunsuan(x)
liebiao1.append(x)
return liebiao1
print(XunHuan(lambda a:a + 1,liebiao)) #[3, 5, 7, 9, 4]
如果map命令和匿名函数都不使用就是一下的状态
liebiao = [2,4,6,8,3]
liebiao1 = []
def ZiJiaYi(a):
return a +1
def XunHuan(yunsuan,zhi):
for x in zhi:
x = yunsuan(x)
liebiao1.append(x)
return liebiao1
print(XunHuan(ZiJiaYi,liebiao)) #[3, 5, 7, 9, 4]
他们最终得打印结果是一样得但是,用了map之后 命令行明显就是少了很多 很简洁,但是程序得可读性很差 ,没用map编程 就会导致程序得代码变多,可是相对得 程序也比较好理解,没有匿名函数和map 得程序最长 但是也最容易理解
2、reduce()
这个函数 后面会有两个参数,第一个参数 是一种运算或加工方式,而且这个加工方式里面会有两个变量,然后第二个参数是一个序列,reduce会把第二个参数里面的元素 逐一取出按照第一个参数进行加工或运算,并且第一次运算时,第一个参数的两个变量分别赋值为第二个参数序列中的前两个元素的值,运算后的结果会赋值给第一个参数的第一个变量,然后一个参数的第二个变量取值是,第二个参数的第三个元素的值,一i此类推最终得到一个值
并且在python3里面 需要使用下面的命令来加载这个函数的模块
from functools import reduce
from functools import reduce
def add(x, y) : # 两数相加
return x * y
a1 = reduce(add, [1,2,3,4,5]) # 计算列表乘机:1+2+3+4+5
a2 = reduce(lambda x, y: x*y, [1,2,3,4,5]) # 使用 lambda 匿名函数
print(a1)
print(a2)
上面的运算就是 1*2 = 2, 2*3=6,6*4=24,24*5=120
最终print的结果就是120
3、filter
它功能是有两个参数 第一个是 一个函数 ,第二个是需要加工的可迭代对象,然后会循环拿出第二个数据里面每一个元素就像for循环一样 交给第一个函数去做处理 处理的结果是布尔值,结果是True 就会保留这个元素 而处理的结果是 Flase 就丢弃这个元素,也就是说
遍历序列中的每一个元素,按设定的条件判断每个元素得到布尔值,如果是True则留下该元素
list11 = ['x_adam','x_abc','x_xxx','vvv','nnn']
print (list(filter(lambda a:not a.startswith('x_'),list11))) #['vvv', 'nnn']
以上就是使用匿名函数给出判断条件位 开头不是x_ 得元素,filter会把括号中得第二个数据里面得元素依次用 这个匿名函数进行判断,并且留下判断位True得值
下面咱们看看不适用filter和匿名函数所编写得程序吧
list = ['x_adam','x_abc','x_xxx','vvv','nnn']
list1 = []
for x in list:
if not x.startswith('x_'):
list1.append(x)
print(list1)#['vvv', 'nnn']
虽然输出得结果是一样得但是,他们得命令长度确实不同的