Python 进阶语法:lambda函数
一、lambda函数是什么
Python中的lambda函数是一种简洁的匿名函数,用于执行简单的操作。它是一种不可变的单表达式函数,可以在需要一个函数的地方使用。
lambda函数的语法结构非常简单,由lambda关键字、参数列表和冒号组成,后面跟着一个表达式。
例如:
lambda x: x * 2
这个lambda函数接收一个参数x,并返回x的两倍。
二、lambda函数的简单应用
2.1 匿名函数应用
lambda函数可以作为匿名函数使用,在需要一个简单函数的地方直接使用。
例如,将一个列表中的元素平方:
squares = list(map(lambda x: x ** 2, [1, 2, 3, 4, 5]))
print(squares) # 输出:[1, 4, 9, 16, 25]
这段代码的功能是使用 Python 的 map
函数和 lambda
表达式对列表 [1, 2, 3, 4, 5]
中的每个元素进行平方操作,并将结果存储在新的列表 squares
中。
解释一下代码的各个部分:
- map(function, iterable1, ...) 函数是 Python 中的一个内置函数,用于对可迭代对象(如列表、元组等)中的元素应用指定的函数。它返回一个迭代器,其中包含应用函数后的结果。
- lambda x : x**2 是一个匿名函数,它接受一个参数 x 并返回 x 的平方。
- [1,2,3,4,5]是输入的列表。
执行这段代码后,变量 squares
将包含新列表 [1, 4, 9, 16,25]
2.2 对数据列表进行排序
2.2.1 自定义排序规则
使用lambda函数可以在对列表进行排序时自定义排序规则。
例如,按照绝对值对列表进行排序:
numbers = [-3, -1, 2, -5, 4]
sorted_numbers = sorted(numbers, key=lambda x: abs(x))
print(sorted_numbers) # 输出:[-1, 2, -3, 4, -5]
这段代码的目的是对一个数字列表 numbdrs ,用sorted() 函数进行排序,排序的依据是每个数字的绝对值。
- 数字列表
numbers = [-3, -1, 2, -5, 4]
。 - 使用
sorted()
函数对这个列表进行排序。为了按照每个数字的绝对值进行排序,我们使用了一个key
参数,该参数是一个函数,用于提取用于排序的值。在这里,我们使用了一个lambda
函数,该函数返回每个数字的绝对值。 lambda x: abs(x)
这个函数表示:对于列表中的每个元素x
,都计算其绝对值。- 打印排序后的列表
sorted_numbers
,输出结果是[-1, 2, -3, 4, -5]。
2.2.2 筛选符合条件的元素
使用lambda函数可以筛选出符合条件的元素。
例如,筛选出列表中大于等于3的元素:
numbers = [1, 2, 3, 4, 5]
filtered_numbers = filter(lambda x: x >= 3, numbers)
print(list(filtered_numbers)) # 输出:[3, 4, 5]
这段代码的功能是从一个给定的数字列表中筛选出所有大于或等于3的数字,并将结果存储在新的迭代器 filtered_numbers
中。最后,通过 print
函数将结果列表打印出来。
下面是代码的逐步解释:
numbers = [1, 2, 3, 4, 5]
:定义一个包含数字1到5的列表。filter(lambda x: x >= 3, numbers)
:使用filter
函数从numbers
列表中筛选出满足条件的元素。这里使用的条件是lambda x: x >= 3
,即选择所有大于或等于3的数字。list(filtered_numbers)
:将筛选后的迭代器filtered_numbers
转换为列表,以便可以打印它。print(list(filtered_numbers))
:打印结果列表。
运行这段代码后,输出将是 [3, 4, 5]
,这是原始列表中所有大于或等于3的数字的列表。
三、lambda函数的进阶应用
3.1 嵌套lambda函数
lambda函数可以嵌套在其他函数中使用,实现更复杂的操作。
嵌套的lambda函数在Python中是一种非常简洁和强大的编程技巧,它允许你在一个lambda函数内部定义另一个lambda函数。这种嵌套的用法在需要定义简单的、临时的函数时特别有用。
下面是一个嵌套lambda函数的简单示例:
# 定义一个lambda函数,该函数返回另一个lambda函数
add_x = lambda y: lambda z: z + y # 使用这个嵌套的lambda函数
add_5 = add_x(5)
add_10 = add_x(10) # 调用这个嵌套的lambda函数
print(add_5(3)) # 输出:8
print(add_10(3)) # 输出:13
在这个例子中,add_x
是一个外层的lambda函数,它接受一个参数 y
并返回一个内层的lambda函数。这个内层的lambda函数接受一个参数 z
并返回 z + y
。
然后我们创建了两个内层的lambda函数,一个是 add_5
,一个是 add_10
,分别对应于 y=5
和 y=10
的情况。最后,我们分别调用这两个函数并打印结果。
嵌套的lambda函数可以用于各种情况,例如在排序列表时定义自定义的排序标准,或者在需要临时函数的地方使用。但需要注意的是,过度使用嵌套的lambda函数可能会导致代码难以阅读和理解,因此在使用时需要谨慎。
3.2 lambda函数与map、filter、reduce和sorted结合使用
lambda函数可以与map、filter、reduce和sorted等内置函数结合使用,实现更高效的代码。
3.2.1 map() 函数
- 描述:map() 会根据提供的函数对指定序列做映射。第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新列表。
- 语法:map(function, iterable, ...)
- 参数:function(函数),iterable (一个或多个序列)
- 返回值:Python 2.x 版本返回的是列表,Python 3.x 版本返回的是迭代器
- 示例:
# ===========一般写法:===========
# 1、计算平方数
def square(x):return x ** 2map(square, [1,2,3,4,5]) # 计算列表各个元素的平方
# 结果:
[1, 4, 9, 16, 25]# ===========匿名函数写法:============
# 2、计算平方数,lambda 写法
map(lambda x: x ** 2, [1, 2, 3, 4, 5])
# 结果:
[1, 4, 9, 16, 25] # 3、提供两个列表,将其相同索引位置的列表元素进行相加
map(lambda x, y: x + y, [1, 3, 5, 7, 9], [2, 4, 6, 8, 10])
# 结果:
[3, 7, 11, 15, 19]
3.2.2 filter() 函数
- 描述:filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表。该函数接收两个参数,第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判断,然后返回 True 或 False,最后将返回 True 的元素放到新列表中。
- 语法:filter(function, iterable)
- 参数:function (判断函数),iterable (可迭代对象)
- 返回值:Pyhton2.7 返回列表,Python3.x 返回迭代器对象
- 实例:
# ===========一般用法:===========
# 1、过滤出列表中的所有奇数
def is_odd(n):return n % 2 == 1newlist = filter(is_odd, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
print(list(newlist))
# 结果: [1, 3, 5, 7, 9]# ===========匿名函数用法:===========
# 2、将列表[1, 2, 3]中能够被3整除的元素过滤出来
newlist = filter(lambda x: x % 3 == 0, [1, 2, 3])
print(list(newlist))
# 结果: [3]
3.2.3 reduce() 函数
- 描述:reduce() 函数会对参数序列中元素进行累积。函数将一个数据集合(链表,元组等)中的所有数据进行下列操作:用传给 reduce 中的函数 function(有两个参数)先对集合中的第 1、2 个元素进行操作,得到的结果再与第三个数据用 function 函数运算,最后得到一个结果。
- 语法:reduce(function, iterable[, initializer])
- 参数:function (函数,有两个参数),iterable(可迭代对象),initializer(可选,初始参数)
- 返回值:返回函数计算结果。
- 实例:
# ===========一般写法:===========
# 1、两数相加
def add(x, y): return x + yreduce(add, [1, 3, 5, 7, 9]) # 计算列表元素和:1+3+5+7+9
# 结果:
25"""
===========执行步骤解析:===========
调用 reduce(add, [1, 3, 5, 7, 9])时,reduce函数将做如下计算:
1 先计算头两个元素:f(1, 3),结果为4;
2 再把结果和第3个元素计算:f(4, 5),结果为9;
3 再把结果和第4个元素计算:f(9, 7),结果为16;
4 再把结果和第5个元素计算:f(16, 9),结果为25;
5 由于没有更多的元素了,计算结束,返回结果25。
"""
# ===========匿名函数写法:===========
# 2、两数相加,lambda 写法
reduce(lambda x, y: x + y, [1, 2, 3, 4, 5])
# 结果:
15# 当然求和运算可以直接用Python内建函数sum(),没必要动用reduce。# 3、但是如果要把序列 [1, 3, 5, 7, 9] 变换成整数 13579,reduce就可以派上用场:
from functools import reducedef fn(x, y):return x * 10 + yreduce(fn, [1, 3, 5, 7, 9])
# 结果:
13579
3.2.4 sorted()函数
- 描述:sorted() 函数对所有可迭代的对象进行排序操作。
- sort 与 sorted 区别:sort 是 list 的一个方法,而 sorted 可以对所有可迭代的对象进行排序操作。list 的 sort 方法返回的是对已经存在的列表进行操作,无返回值,而内建函数 sorted 方法返回的是一个新的 list,而不是在原来的基础上进行的操作。
- PY3语法:sorted(iterable, key=None, reverse=False)
- 参数说明:iterable (可迭代对象)、key 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。reverse 排序规则,reverse = True 降序 , reverse = False 升序(默认)。返回值:返回重新排序的列表。
- 示例:
# ===========一般用法:===========
# 1、简单排序
a = [5,7,6,3,4,1,2]
b = sorted(a) # 使用sorted,保留原列表,不改变列表a的值
print(a)
# [5, 7, 6, 3, 4, 1, 2]
print(b)
# [1, 2, 3, 4, 5, 6, 7]# ===========匿名函数用法:===========
L=[('b',2),('a',1),('c',3),('d',4)]
# 2、利用参数 key 排序
new_L = sorted(L, key=lambda x:x[1])
print(new_L)
# 结果:[('a', 1), ('b', 2), ('c', 3), ('d', 4)]# 3、按年龄升序
students = [('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]
s_age = sorted(students, key=lambda s: s[2])
print(s_age)
# 结果:[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]# 4、按年龄降序
j_age = sorted(students, key=lambda s: s[2], reverse=True)
print(j_age)
# 结果:[('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]
四、注意事项
4.1 lambda函数的局限性
lambda函数主要用于简单的操作,不适合用于复杂的逻辑或大量数据处理。对于复杂的逻辑或大量数据处理,建议使用常规函数或类。
4.2 不要过度使用lambda函数
虽然lambda函数可以使代码更加简洁,但过度使用可能会使代码难以阅读和理解。因此,在使用lambda函数时应该适度,并保持代码的可读性。
4.3 lambda函数与常规函数的比较
相对于常规函数,lambda函数更加简洁,可以在需要简单函数的地方直接使用。然而,常规函数更加灵活,可以包含复杂的逻辑和嵌套结构,并且可以返回多个值或使用异常处理等特性。因此,在选择使用lambda函数还是常规函数时,应该根据实际需求进行选择。