Python函数中的lambda表达式使用技巧
Python中的lambda表达式是一个匿名函数,它的主要作用是在需要函数对象的任何地方使用。lambda语法非常简单,它的基础形式是:lambda argument_list: expression。
在这种语法形式下,lambda函数可以从一个或多个变量(argument_list)中获取参数,然后利用 expression 进行计算,并将计算结果作为函数的返回值。由于 lambda 函数没有名字,所以往往会将其作为赋值表达式的右侧,或者直接传递给其他函数。
除了基础语法外,lambda表达式还有更多的使用技巧,下面就让我们一一来讨论一下。
1. 在sorted()中使用lambda表达式进行排序
sorted()是Python内置函数之一,它用于对序列进行排序。在排序操作中,可以使用lambda表达式作为关键字参数进行排序。例如,对一个列表进行升序排序可以使用以下代码:
lst = [5, 2, 1 , 4, 3] sorted_lst = sorted(lst, key=lambda x: x) print(sorted_lst)
输出结果为:[1, 2, 3, 4, 5]
这里的lambda表达式 lambda x: x 实际上是返回x本身的表达式。在sorted()函数中,key参数需要一个函数对象,用于指定排序的依据。因此,通过lambda表达式,我们可以方便地指定排序的规则。
除了简单排序之外,还可以根据列表中元素的某个属性进行排序。例如,对一个学生列表进行按照年龄升序排序可以使用以下代码:
class Student:
def __init__(self, name, age):
self.name = name
self.age = age
def __repr__(self):
return f"{self.name}({self.age})"
students = [Student("Tom", 18), Student("Jerry", 20), Student("Mike", 19)]
sorted_students = sorted(students, key=lambda student: student.age)
print(sorted_students)
输出结果为:[Tom(18), Mike(19), Jerry(20)]
在这个例子中,lambda表达式 lambda student: student.age 返回学生对象的年龄属性,用于指定排序的依据。通过这种方式,我们可以更加方便地对复杂对象进行排序。
2. 在map()中使用lambda进行迭代操作
map()是Python内置函数之一,用于对序列中的每个元素进行操作,并返回操作后的序列。在map()中,可以使用lambda表达式作为要执行的操作。例如,将一个列表中的元素都平方一下可以使用以下代码:
lst = [1, 2, 3, 4, 5] squared_lst = list(map(lambda x: x**2, lst)) print(squared_lst)
输出结果为:[1, 4, 9, 16, 25]
在这个例子中,lambda表达式 lambda x: x**2 实际上是返回x的平方的表达式。在map()函数中,我们将这个lambda表达式传递给了第一个参数,用于对lst中的每个元素进行操作。
除了简单操作之外,还可以进行复杂的逻辑操作。例如,计算两个列表对应位置上元素的和可以使用以下代码:
lst1 = [1, 2, 3] lst2 = [4, 5, 6] sum_lst = list(map(lambda x, y: x+y, lst1, lst2)) print(sum_lst)
输出结果为:[5, 7, 9]
在这个例子中,lambda表达式 lambda x, y: x+y 实际上是返回x和y的和的表达式。在map()函数中,我们将这个lambda表达式传递给了第一个参数,同时将lst1和lst2作为第二个参数和第三个参数,用于对两个列表对应位置上的元素进行操作。
3. 在filter()中使用lambda进行过滤操作
filter()是Python内置函数之一,用于对序列中的元素进行过滤,并返回符合条件的元素序列。在filter()中,可以使用lambda表达式作为过滤条件。例如,将一个列表中的偶数元素取出来可以使用以下代码:
lst = [1, 2, 3, 4, 5] even_lst = list(filter(lambda x: x % 2 == 0, lst)) print(even_lst)
输出结果为:[2, 4]
在这个例子中,lambda表达式 lambda x: x % 2 == 0 实际上是返回判断x是否为偶数的表达式。在filter()函数中,我们将这个lambda表达式传递给了第一个参数,用于对lst中的每个元素进行过滤。
除了简单的过滤操作之外,还可以进行复杂的逻辑过滤。例如,过滤一个学生列表中,年龄大于18岁且名字不为Tom的学生可以使用以下代码:
class Student:
def __init__(self, name, age):
self.name = name
self.age = age
def __repr__(self):
return f"{self.name}({self.age})"
students = [Student("Tom", 18), Student("Jerry", 20), Student("Mike", 19)]
filtered_students = list(filter(lambda student: student.age > 18 and student.name != "Tom", students))
print(filtered_students)
输出结果为:[Jerry(20), Mike(19)]
在这个例子中,lambda表达式 lambda student: student.age > 18 and student.name != "Tom" 实际上是返回判断学生对象是否满足条件的表达式。在filter()函数中,我们将这个lambda表达式传递给了第一个参数,用于对students中的每个学生对象进行过滤。
4. 在reduce()中使用lambda进行累积操作
reduce()是Python内置函数之一,用于对序列中的元素进行累积操作,并返回累积后的结果。在reduce()中,可以使用lambda表达式作为累积的规则。例如,计算一个列表中所有元素的和可以使用以下代码:
from functools import reduce lst = [1, 2, 3, 4, 5] sum_lst = reduce(lambda x, y: x+y, lst) print(sum_lst)
输出结果为:15
在这个例子中,lambda表达式 lambda x, y: x+y 实际上是返回x和y的和的表达式。在reduce()函数中,我们将这个lambda表达式传递给了第一个参数,同时将lst作为第二个参数,用于对列表中的元素进行累积操作。
除了简单的累积操作之外,还可以进行复杂的逻辑累积。例如,计算一个学生列表中所有学生年龄的平均值可以使用以下代码:
from functools import reduce
class Student:
def __init__(self, name, age):
self.name = name
self.age = age
students = [Student("Tom", 18), Student("Jerry", 20), Student("Mike", 19)]
avg_age = reduce(lambda x, y: x + y.age, students, 0) / len(students)
print(avg_age)
输出结果为:19
在这个例子中,lambda表达式 lambda x, y: x + y.age 实际上是返回x和学生对象y的年龄属性的和的表达式。在reduce()函数中,我们将这个lambda表达式传递给了第一个参数,同时将students作为第二个参数,初始值0作为第三个参数,用于计算所有学生对象的年龄总和。最后,我们用len(students)计算学生的平均年龄。
总结:
以上就是在Python函数中利用lambda表达式的
