一个函数调用函数的例子
如果频繁更换需求,可以把常用的需求写成函数之后来调用
num1 = [1,2,3,4]
def add_one(x):#先写一个自增加一的函数
return x+1
def map_test(func,array):
ret = []
for i in array:
res = func(i)#让传入的函数对i进行操作,然后将它的值赋值给res
ret.append(res)#使res增加到空列表
#或者写成ret.append(func(i))
return ret#返回列表的值
print(map_test(add_one,num1))#传入函数和需要的数字
print(map_test(lambda x:x+1,num1))
上一章内容讲了匿名函数,如果用匿名函数写的话可以在print后面写成
print(map_test(lambda x:x-1,num1))
print(map_test(lambda x:x**2,num1))
#等等等等
这个例子就是一个高阶函数,如果更换了传入的函数,就可以更换方法
高阶函数:
1、函数接收的参数是一个函数名
2、返回值中包含函数
这两条合到一起就是函数式变成的一个概念,高阶函数
只要满足两个条件之一,就是高阶函数
总结就是,上面的函数其实是写了一个内置的map这个函数
总体用法就和上面一样需要两个参数,第一个“数理方法”,第二个:可迭代对象
这个位置不一定要写lambda,处理成list就可以了
直接可以写成:print(list(map(函数,对象)))
print(list(map(lambda x:x**2,[2,3,4])))
#而且不光是数字,字母也可以
msg = 'yibole'
print(list(map(lambda x:x.upper(),msg)))
同理这里还有filter过滤,也是这个道理,
person_1 = ['goodchild1','goodchild2','goodchild3','yibole']
ret = []
for i in person_1:
if not i.startswith('good'):
ret.append(i)
print(ret)
#和上面一样更换方法就是lambda,简写就是
filter(lambda x:x.startwith('good'),person_1)))
函数式编程实践起来很简单,但是可读性很差
reduce:
from functools import reduce
num1 = [1,2,3,100]
print(reduce(lambda x,y:x*y,num1,10))
需要在列表的最后传入一个变量,这个变量可以控制lambda函数最终的计算方式,比如说上面xy就是(123100),但是在num1后面加的10这个变量就是(11023100)
总结就是:
#map的作用是依次处理列表中的数据,最终得到的还是这个“列表(迭代器形式)”,只是每一个元素被处理过了
#filter:列表当中所有的值筛选一遍,最后得出一个“列表”(迭代器形式)出来
#reduce:可以把一个完整的列表压缩成一个值
类似于大数据的mapreduce
map、filter、reduce不限制于仅仅处理数字,他处理的后面是序列,就相当于是一个for循环,依次遍历
people = [
{'name':'yibole','age' : 18},
{'name':'wangbin','age' : 1000},
{'name':'zhguo','age' : 1000},
{'name':'baozi','age' : 1000}
]
print(list(filter(lambda p:p['age']<19,people)))