lambda表示式用于在语句中直接定义一个匿名函数,匿名函数的结构完全和函数结构相同,仅是没有函数名称。使用lambda表示式定义的匿名函数内部不能包含语句,只能包含表达式,匿名函数的参数由调用方传入。
认识lambda表达式
lambda表示式语法如下:
lambda [parameter_list] : expression
其中lambda是Python的关键字,parameter_list是匿名函数的参数列表,参数列表形参的声明与使用def关键字定义函数形参的声明结构是相同的,该参数列表是可选的,expression是表达式。
lambda关键字、parameter_list、expression必须放在同一行,不能另起一行来书写expression。
使用lambda表达式定义的匿名函数执行完成后,返回expression表达式的计算结果。
例如:
fname = lambda x,y:x*y
上面使用lambda表达式定义了一个匿名函数,该匿名函数的形参是x和y,expression是x*y,返回结果是x*y。匿名函数的引用赋值给变量fname,fname可用于函数实参,也可以直接在语句中调用。
print(fname(2,3))
前面定义的匿名函数的行为类似于用以下方式定义的函数:
def functionname(x,y):
return x*y
内置函数filter
Python的内置函数filter是一个过滤器,用来筛选符合条件的可迭代对象的元素。内置函数filter和lambda表达式结合可以简化代码语句、提高程序的运行效率。
函数声明:
filter(function, iterable)
function是一个函数,iterable是一个可迭代对象。该函数对可迭代对象的元素进行筛选,符合条件的元素添加到一个新的迭代器并返回这个新迭代器。
function是筛选函数,function会对可迭代对象的每一个元素进行筛选,符合筛选条件的元素添加到新的迭代器。筛选条件是一个表达式,该表达式对元素进行运算并返回布尔值,表达式返回真值的为符合筛选条件,返回假值的为不符合筛选条件。
案例代码:
# 定义函数is_even,判断x的奇偶性
def is_even(x):
if x % 2 == 0:
return True
return False
# 使用列表解析表达式
# 创建100以内(含100)的整数列表
a = [num for num in range(101)]
# 调用filter函数从a筛选出值为偶数的元素
print(list(filter(is_even,a)))
is_even函数作为实参传入到filter函数,用于从列表对象a中筛选出值为偶数的元素。
lambda表达式使用案例
案例1:利用内置函数filter和lambda表达式计算自然数1至100的奇数和,用一条语句实现。
先给出常规的实现代码:
# 创建累加和变量sum
# sum初始化为0
sum = 0
# 计算1至100内的奇数和
for i in range(1,101):
if i % 2 != 0:
sum += i
print("1至100内的奇数和为:%d" % (sum))
使用filter和lambda表达式的代码:
print(sum(list(filter(lambda x:x%2!=0,range(1, 101)))))
相比常规实现的代码,使用filter和lambda表达式来计算计算1至100内的奇数和,可以起到简化代码的效果。
简化的代码用到了内置函数sum、list、filter、range,以及使用lambda表达式定义的匿名函数,使用lambda表达式定义的匿名函数用于筛选可迭代对象的元素,筛选条件是元素的值是偶数,可迭代对象由range函数产生,匿名函数的实参为可迭代对象的元素。
案例2:合并两个列表对象的元素到一个新的列表对象,新列表对象的元素值为两个列表对象元素值的和。
# 创建a和b列表对象
a,b = [1,3,5,7,9],[2,4,6,8,10]
# 使用map函数映射a和b的元素到一个新的可迭代对象
# 映射函数由lambda表达式定义
c = list(map(lambda x,y:x+y,a,b))
print(c)
使用lambda表达式定义的匿名函数有两个参数x和y,传入的实参x来自列表对象a的元素,传入的实参y来自列表对象b的元素。
案例3:使用lambda表达式定义一个匿名函数,该匿名函数求一组数的均值。
# 定义匿名函数并赋值给变量f1
f1 = lambda *args:sum(args)/len(args)
# 调用f1函数求一组数的均值
print(f1(12,89,36,19,21,8.9))