匿名函数 lambda

lambda 匿名函数

lambda也被称为匿名函数, 既没有确定的函数名称. 在有些时候, 不需要显示定义函数, 直接传入具体的操作则可以使用lambda更方便.

lambda 语法

lambda argument_list : expression #argument_list为参数列表, 其有多种形式, expression则为表达式, 表示我们需要执行的操作

lambda x,y: x+y #该语句表示输入两个参数x,y, 并返回x+y的值

常用情形

lambda经常与其他函数联合使用, 下面进行分别阐述

filter

filter(function, iterable) #函数用于过滤序列, 过滤掉不符合条件的元素, 返回一个迭代器对象, 如果要转换为列表, 可以使用 list() 来转换.

1
2
3
4
5
6
# 过滤出列表中的所有奇数
def is_odd(n):
return n % 2 == 1
newlist = filter(is_odd, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
print(list(newlist))
>>> [1, 3, 5, 7, 9]

转换为filter + lambda表达式可以写成

1
2
3
newlist=filter(lambda n: n if n % 2 ==1 else None, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
print(list(newlist))
>>> [1, 3, 5, 7, 9]

map

map(function, iterable, ...) #根据提供的函数对指定序列做映射, 生成一个新的迭代器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
def square(x): # 计算平方数
return x ** 2
newlist=map(square, [1,2,3,4,5]) # 计算列表各个元素的平方
print(list(newlist))
>>>[1, 4, 9, 16, 25]

newlist=map(lambda x: x ** 2, [1, 2, 3, 4, 5]) # 使用 lambda 匿名函数
print(list(newlist))
>>>[1, 4, 9, 16, 25]

# 提供了两个列表,对相同位置的列表数据进行相加
newlist=map(lambda x, y: x + y, [1, 3, 5, 7, 9], [2, 4, 6, 8, 10])
print(list(newlist))
>>> [3, 7, 11, 15, 19]

sorted

sorted(iterable, key=None, reverse=False) #函数对所有可迭代的对象进行排序操作.(所有可迭代的对象为重点, 该函数与sort的区别是, sort是list上的方法, 而sorted可以对所有可迭代对象进行排序操作, list dict tuple等).

1
2
3
4
5
6
7
8
9
sorted([5, 2, 3, 1, 4])
>>>[1, 2, 3, 4, 5] # 默认为升序

sorted((5, 2, 3, 1, 4))
>>>[1, 2, 3, 4, 5] # 默认为升序

sorted({1: 'D', 2: 'B', 3: 'B', 4: 'E', 5: 'A'})
>>>[1, 2, 3, 4, 5]

当传入参数为复杂的组合对象时, 如果需要进行更复杂的排序操作, 则可以借助lambda实现复杂的排序操纵.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#有一个学生成绩字典, 每一项中有五门成绩, 分别是语 数 外 物理 和化学 
students={'Zhang':[60,70,65,75,83],'Wang':[70,66,80,90,73],'Li':[66,79,80,90,59],'Zhao':[80,90,88,60,75]}

按照外语成绩进行降序排列
sorted(students.items(), key= lambda x: x[1][2],reverse=True)
>>>[('Zhao', [80, 90, 88, 60, 75]), ('Wang', [70, 66, 80, 90, 73]), ('Li', [66, 79, 80, 90, 59]), ('Zhang', [60, 70, 65, 75, 83])]

在外语成绩相同的情况下, 数学成绩谁高, 谁在前
sorted(students.items(), key= lambda x: [x[1][2],x[1][1]],reverse=True)
>>>[('Zhao', [80, 90, 88, 60, 75]), ('Li', [66, 79, 80, 90, 59]), ('Wang', [70, 66, 80, 90, 73]), ('Zhang', [60, 70, 65, 75, 83])]

按照总成绩排序
sorted(students.items(), key= lambda x: sum(x[1]),reverse=True)
>>>[('Zhao', [80, 90, 88, 60, 75]), ('Wang', [70, 66, 80, 90, 73]), ('Li', [66, 79, 80, 90, 59]), ('Zhang', [60, 70, 65, 75, 83])]