简单来说,所以只用一行或者一句话来表达的函数就可以用lambda表达式,也称为lambda函数;
【举个栗子】
def f(x):
return x * x
f(3)
上面的函数的含义是:给函数f传递一个参数x,它会返回x*x;所以我们传递给函数f一个实参3,它就返回3*3,也就是9;
现在我们将上面的代码改成lambda表达式:
# 如果将上面的函数转换成lambda表达式
# 具体格式:
f = lambda x: x * x # 这里的f是函数名,所以调用该函数的时候就是函数名()
print(f(5))
# 这里的f是函数名,所以调用该函数的时候就是函数名() # lambda之后写一个x表示输入; # 输入之后写输出,输入输出之间用英文的冒号:分开 # 冒号之后写 x*x 表示输出的结果是x*x # 所以函数 f = lambda x: x * x 的含义是,输入一个x输出结果为x*x
可以看出来结果一样;
那lambda表达式除了输入一个数之外,还可以输入多个数吗?
当然可以!
这里我们输入两个数:
f = lambda x, y: x * y
print(f(2, 3))
# 函数 f = lambda x, y: x * y 的含义是,输入一个x,y输出结果为x*y
lambda表达式还可以放进函数里进行嵌套;
【举个栗子】
实现计算a * x * x + b * x + c;
def quar(a, b, c):
return lambda x: a * x * x + b * x + c
f = quar(1, -1, 2)
print(f(5))
# f = quar(1, -1, 2)表示给函数quar传递实参,此时a=1,b=-1,c=2
# print(f(5)) 表示输入的x为5;
注意 f = quar(1, -1, 2)只是给函数传递了实参,f(5)才是真正掉调用了该函数
filter 函数用于过滤元素,将 函数对象(function) 依次作用于 可迭代对象(iterable)的每个元素,将返回值为 True 的 元素组成一个 新的可迭代对象 返回。
(python3 统一返回迭代器;需要通过list函数,set函数将他们转换)
它的使用形式如下:
filter(function, iterable)
# function 表示一个函数对象
# iterable表示一个可迭代对象
【代码演示】
num_list = [1, 2, 3, 4, 5, 8]
def f(x):
if x % 2 == 0:
return x
print(list(filter(f, num_list)))
解释,如果输入的是偶数,返回该值;
将f函数改成lambda表达式:
num_list = [1, 2, 3, 4, 5, 8]
print(list(filter(lambda x: x % 2 == 0, num_list)))
Map函数通常有两个参数,第一个参数是函数对象,第二个参数就是可迭代对象;
Map函数的作用是,将可迭代对象的每一个元素都应用到第一个参数函数中;
在上面这个图片,cook是一个函数对象,是一个可迭代对象,Map函数就是将可迭代对象中的每一个元素拿出来,放在cook这个函数对象里“执行”,将,变成了;
【举个栗子】
num_list = [1, 2, 3, 4, 5] # 一个可迭代对象
def duble(x):
return x * 2
result = map(duble, num_list)
# print(result)
# 直接输出map函数,输出的是一个迭代器
# print(result) # 直接输出map函数,输出的是一个迭代器# 函数后面不加括号,表示它是整个函数体,是一个函数对象;
# 函数后面加括号(括号中必须传入实参),表示调用该函数的执行结果
reduce() 函数会对参数序列中元素进行累积。
Reduce函数虽然和Map函数的参数形式比较类似,但它们有一些本质的区别;
是一个函数对象,是一个可迭代对象,它在运行的时候会这样操作:将后面列表中的两个元素作为一组参数传递给eat,接下来将这个生成的结果和下一个元素作为一组参数再传递给eat,以此类推,直到所有的元素都被传递,则生成最后的结果;
【举个栗子】
【代码演示】
from functools import reduce
def add(x, y):
return x + y
num_list = [1, 2, 3, 4, 5]
print(reduce(add, num_list))
在Python3中,reduce函数已经不是一个内置函数,已经把它调整到一个模块(functools)中了,所以使用reduce函数的时候要进行导包;
reduce函数和其余两个函数的区别:
使用map函数,结果是一个map对象;使用filter函数的时候,结果是一个filter对象,我们都需要使用list函数将他们转换为列表;
而ruducr函数,他在add函数里的作用是求和最后生成的是一个和的结果,所以这里就直接输出流15,不需要进行转换。
我们最开始学了lambda表达式,只用一行就可以表达的函数都可以写成lambda表达式,显然,上面的add函数符合标准,我们将它改成lambda表达式:
from functools import reduce
num_list = [1, 2, 3, 4, 5]
result = reduce(lambda x, y: x + y, num_list)
print(result)
这样写代码更加简洁了,但是写代码也不是越简洁越好。