一、匿名函数
# 语法:
# lanbda x : x + 1
# x 函数的形参
# x + 1 函数的返回值 = return
# 通常与其他函数联合使用,不应该独立存在
# 普通函数写法:
def calc(x):
return x+1
print(calc(2))
# 匿名写法(理解版):
func = lambda x: x + 1
res = func(2)
print(res)
# 需求 把 name = 'alex'修改成 alex_sb
name = 'alex'
func = lambda a: str(a) +"_sb"
test = func(name)
print(test)
# lambda 多个返回值,需要加括号
a = 1
b = 2
c = 3
fun = lambda x,y,z:(x+1,y+1,z+1)
res = fun(a,b,c)
print(res)
二、map函数
1、map() 加工序列:
依次处理序列中的每一个元素,得到的结果是一个"列表",该"列表"元素个数及位置与原来一样。
#1、功能:
map() :会根据提供的函数,对指定序列做映射。
第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回
包含每次 function 函数返回值的新列表。
#2、语法:
map(function, iterable)
function -- 函数
iterable -- 一个或多个序列(可迭代对象)
#3、示例:
li1 = [0,1,2,3,4,5]
li2 = ['a','b','c','d']
def calc(num):
#'传入int类型,每个元素 + 1'
return num + 1
# 1、可自定义函数实现,第一个参数传入函数,第二个传入可迭代序列
# 注意定义后的函数,只传入函数名,不需要加括号。最终返回值需要 使用 list
# 或者其他数据类型进行转换,在python2中,会自动把结果输出成列表。
res1 = list(map(calc,li1))
# 2、可使用匿名函数做逻辑。
res2 = list(map(lambda x:x.upper(),li2))
print(res1)
print(res2)
# map实际上做的操作如下:(个人理解版)
test = [0,1,2,3,4,5]
def func_cover(iterb): #使用函数自定义一个元素自增1的功能
#自增1
return iterb + 1
def map_cover(func,iterb): #定义两个参数,func 为功能,iterb 为可迭代对象
li = []
for item in iterb: #使用for 循环拿取传入的可迭代对象
res = func(item) #使用自定义的功能 改造每次传入过来的迭代的元素,(这句最重要)
li.append(res) #把转换完成后的元素插入li列表中
return li #返回值 定义为转换完成的新列表
print(map_cover(func_cover,test))
print(map_cover(lambda x:x * 2,test))
三、filter函数
遍历序列中的每个元素,判断每个元素得到的布尔值,如果是true 则留下来。
#内置函数:filter()
#1、功能:
filter() 用于 过滤序列
作用是:过滤掉不符合条件的元素,返回一个迭代器对象,如果要转换为列表,可以使
用 list() 来转换。该接收两个参数,第一个为函数,第二个为序列序列的每个元素作为
参数传递给函数进行判断,然后返回 True 或 False,最后将返回 True 的元素放到新列表中。
#2、语法
filter(function, iterable)
#3、参数:
function -- 判断函数。
iterable -- 可迭代对象
#4、示例:
# 迭代判断,判断结果为 True 的话,取出来放到新列表中,反之不放。
li1 = [1,2,3,4,5]
li2 = ['a_a','a_b','cc','a_d','ee']
li3 = [1,2,3,4,5,'a_a','a_b','cc','a_d','ee']
# 1、奇数判定 不能被 2 整除的拿出来
filist1 = list(filter(lambda x:not x%2 == 0,li1))
print(filist1)
# 2、取出开头为 a 的元素
filist2= list(filter(lambda x:x.startswith('a'),li2))
print(filist2)
#5、其他玩法:
people = [
{'name':'欧阳锋','age':1000},
{'name':'郭靖','age':10000},
{'name':'黄蓉','age':9000},
{'name':'洪七公','age':18},
]
res = list(filter(lambda x:x['age'] <= 18,people)) #小于等于18的筛选出来
print(res)
四、reduce函数
处理一个序列,然后把序列进行合并操作
内置函数:reduce()
注意:Python3.x reduce() 已经被移到 functools 模块里,如果我们要使用
需要引入 functools 模块来调用 reduce() 函数,调用方法如下:
from functools import reduce
#1、功能:
reduce() 函数会对参数序列中元素进行累积,用 function 函数运算,最后得到一个结果
函数将一个数据集合(链表,元组等)中的所有数据进行下列操作:用传给 reduce 中
的函数 function(有两个参数)先对集合中的第 1、2 个元素进行操作,得到的结果再与
第三个数据用 function 函数运算,最后得到一个结果。
#2、语法:
reduce(function, iterable[, initializer])
#3、参数
function -- 函数,有两个参数
iterable -- 可迭代对象
initializer -- 可选,初始参数
# 4、返回值
返回函数计算结果。
# from funnctools import reduce
# 在python2中可以直接用,python3中需要 如上调用。
# 3、示例:使用高阶函数来完成reduce功能(个人理解版)
li = [1,2,3,100]
def add_test(x,y):
return x+y
def reduce_test(func,iterb,init=None): # 默认init 等于空,增加起始值功能
if init is None: #判断执行函数时是否传入,默认参数
res = iterb.pop(0) #如果没传,使用pop 拿到序列第一位的值 作为起始值
else:
res = init #如果传入,起始值为 init
for item in iterb: #判断完成后,循环传入的序列
res = func(res,item)#把得到的res 与 item 使用传入的功能进行加工
return res #返回加工后的 值
res1 = reduce_test(add_test,li) #使用函数自定义功能
res2 = reduce_test(lambda x,y:x*y,li,10) #使用lambda自定义功能,并初始值为10
print(res1)
print(res2)
# 4、使用reduce来完成:
from functools import reduce
def add_test(x,y): #使用函数定义一个序列每个元素相加功能。
return x+y
li = [1,2,3,100] #注意,reduce得到的值为序列累加的和,所以不需要将输出结果
#转化为列表,如:res1 = reduce(add_test,li,10)
res1 = reduce(add_test,li,10) #使用自定义函数,并将初始值设置为 10
res2 = reduce(lambda x,y:x*y,li)# 使用lambda函数定义 序列每个元素累计相乘功能。
print(res1)
print(res2)
# 5、其他玩法 配合 range
from functools import reduce
print(reduce(lambda x,y:x+y,range(100),1)) # 99以内的数累加,起始值 为 1
print(reduce(lambda x,y:x+y,range(1,101))) # 1-100所有数的和