Python匿名函数
□ Python中借助lambda表达式来构建匿名函数
□ 格式
lambda 参数列表 : 表达式
□ 冒号来分割参数列表和表达式
□ 不需要return,表达式的值,就是匿名函数的返回值
□ lambda表达式(匿名函数)只能写在一行上,也被称为单行函数
lambda x : x ** 2
调用
(lambda x : x ** 2)(3)
# 虽然也可以写成
fnc = lambda x : x ** 2
fnc(3)
# 但是官方并不推荐这么使用,这样以来就失去了匿名表达式的意义,不如还原回普通的函数:
# def fnc(x):
# return x ** 2
# lambda 后接参数列表,也就是说,参数可以是多个
e.g:
lambda x, y : x + y
lambda函数的多种样例:
(lambda : 0)() #无参,直接返回0
(lambda x, y = 5 : x + y)(6)# 关键字参数
(lambda *args : (x for x in args))(*range(5))# *range(5)解构,*args封装参数为元组
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# 下面的比较特殊,让我们来逐步分析
[x for x in (lambda *args: map(lambda y: (y+1,args), args))(*range(5))]
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
@1.首先我们要确定,这一行代码最后会按列表解析式返回一个新的列表[x for x in iterable]
@2.由@1可知, in后面为一个iterable类型:
(lambda *args: map(lambda y: (y+1,args), args))(*range(5))
@3.再来分析,这个iterable对象是一个lambda表达式的调用结果,(*range(5))为调用参数
print(*range(5))结果为 0,1,2,3,4这里的*为解构作用,将range(5)这个可迭代对象的结果进行迭代
@4.lambda *args: map(lambda y: (y+1,args), args)为一个lambda表达式,继续来分卸*args为@3的参数,
那么map(lambda y: (y+1,args), args)即为一个表达式
@5.这里引入map函数,它的语法为:map(func, *iterables) --> map object,即据第一个func参数,
将第二个可迭代参数进行处理,返回一个新的对象
@6.这里map的func参数还是一个lambda表达式,即lambda y: (y+1,args),它的意思是将,map的第二个args参数
中每一个元素迭代赋值给y,然后用y+1和args这个元素来构建一个二元元组,结果如下图