Python匿名函数lambda表达式与sort()、sorted()、min()、max()、map()、reduce()、filter()的使用

1. 什么是匿名函数

匿名函数,即没有函数名称的函数。学过Python的都知道,Python中函数的定义格式为:(关键字)def(加)(函数名)get_name:(函数体),但是匿名函数没有函数名称,它的定义格式为:
lambda [arg1,[arg2,arg3…]]: expression,因此匿名函数又被成为lambda表达式,它只包含一行表达式。

2. lambda表达式

定义格式:lambda [arg1,[arg2,arg3…]]: expression,其中lambda为必须的关键字,args表示参数列表,expression表示表达式。为便于理解,该语法格式转为普通函数格式如下:

def fun_name(arg1,[arg2,arg3..]):
	return expression
fun_name(arg1,[arg2,arg3..])

显然,使用普通方法定义此函数,需要 3 行代码,而使用 lambda 表达式仅需 1 行。
举个例子:

def square(x):
	return x ** 2
print(square(5))

# 此处只是为了举例,平常不建议这样将lambda表达式赋值给变量
a = lambda x: x ** 2
print(a(5))

运行结果

25
25

3. lambda表达式的用途

lambda表达式只有一行,相比于函数,它具有的优势:

  1. 对于单行函数,使用 lambda 表达式可以省去定义函数的过程,让代码更加简洁;
  2. 对于不需要多次复用的函数,使用 lambda 表达式可以在用完之后立即释放,提高程序执行的性能。

那么,lambda表达式的使用方式有哪些呢:

1.排序,结合sorted() 和sort()方法使用
# 方式1
list1 = [1, 2, 6, 9, 3, 5, 4, 0]
list1.sort(key=lambda x: x)
# lambda x: x中第一个x为参数,此时是list1中的每个元素,第二个x是表达式,此时也表示list1中的每个元素
# 通过在第二行打断点,然后调试运行,会发现表达式x,会被依次赋值为列表
# list1中的每个值
print(list1)

# 方式2
# list2 中记录名字和他的年龄
list2 = [['小明', 23], ['大美', 22], ['小帅', 18], ['张三', 24]]
list3 = sorted(list2, key=lambda x: x[1])
# lambda x: x[1]中第一个x为参数,此时是list2中的每个元素,此时是列表,
# 即'['小明', 23]';第二个x[1]是表达式,此时表示列表中第二个值,即23
# 表示按照每个人的年龄排序
print(list3)

# 方式3
list4 = ['3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A']
t = ['3', '3', '4', '6', '5', '8', '7', '10', '10', 'K', 'A', 'J', 'Q']
t.sort(key=lambda x: list4.index(x))
# lambda x: list4.index(x)中第一个x为参数,此时是t中的每个元素
# list4.index(x)是表达式,表示x在list4中的索引值,表示按照索引值大小排序
print(t)

输出结果:

[0, 1, 2, 3, 4, 5, 6, 9]
[[‘小帅’, 18], [‘大美’, 22], [‘小明’, 23], [‘张三’, 24]]
[‘3’, ‘3’, ‘4’, ‘5’, ‘6’, ‘7’, ‘8’, ‘10’, ‘10’, ‘J’, ‘Q’, ‘K’, ‘A’]

2.结合max()、min()使用
list2 = [['小明', 23], ['大美', 22], ['小帅', 18], ['张三', 24]]
list5 = [2, 10, 4, 3, 1, 2, 6, 8, 7]
res = max(list5, key=lambda x: x)
print(res)
name_age = min(list2, key=lambda x: x[1])
print(name_age)

输出结果:

10
[‘小帅’, 18]

3.结合map()函数使用
# ===========一般写法:===========
# 1、计算平方数
list6 = [2,3,6,1,5]
def square(x):
	return x ** 2

s = list(map(square, list6))	# 计算列表各个元素的平方
print(s)

# ===========匿名函数写法:============
# 2、计算平方数,lambda 写法
s1 = list(map(lambda x: x ** 2, list6))
print(s1)

# 3、提供两个列表,将其相同索引位置的列表元素进行相加
list7 = [1,2,34,6]
s2 = list(map(lambda x, y: x + y, list7, list6))
print(s2)


输出结果:

[4, 9, 36, 1, 25]
[4, 9, 36, 1, 25]
[3, 5, 40, 7]

4.结合reduce()使用

reduce函数是Python中的内置函数,用于计算可迭代对象的累积结果。
reduce 函数的用法和示例:
reduce(function, iterable[, initializer])
函数定义:对可迭代对象中的元素进行累积操作,返回一个单一的结果。
参数 function:用于累积操作的函数,接受两个参数,必须返回一个值。
参数 iterable:可迭代对象,包含要进行累积操作的元素。
参数 initializer:可选参数,作为累积的初始值。如果提供了初始值,则累积操作从初始值开始;如果未提供初始值,则累积操作从可迭代对象的第一个元素开始。

from functools import reduce

list8 = [5, 6, 7, 4, 3, 2, 1]
# 此时初始值默认为列表第一个元素,计算元素的和
s3 = reduce(lambda x, y: x + y, list8)
print(s3)
# 定义初始值为0,计算列表元素的平方和
s4 = reduce(lambda x, y: x + y ** 2, list8, 0)
print(s4)
# 计算n的阶乘
n = 5
s5 = reduce(lambda x, y: x * y, range(1, n + 1))
print(s5)
# 计算最大值
s6 = reduce(lambda x, y: x if x > y else y, list8)
print(s6)

输出结果:

28
140
120
7

5.结合filter()使用

filter函数用于过滤序列,过滤掉不符合条件的元素
filter(function, iterable)
function:用于过滤的函数
iterable:可迭代对象

list9 = [1, 2, 3, 4, 5, 6, 7, 8]
# 保留偶数
s7 = list(filter(lambda x: x % 2 == 0, list9))
print(s7)

输出结果:

[2, 4, 6, 8]

总结

1.lambda表达式可直接赋值给变量
2.lambda表达式可结合函数使用,若函数中带有参数key或这参数function,如sort()、sorted()、min()、max()、map()、reduce()、filter()等

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值