lambda表达式其实就是Python的一个函数语法一样。所以也称为匿名函数。
所谓匿名函数,通俗地说就是没有名字的函数。
基本功能跟使用def所定义的python函数是一样的。
但是、和def所定义的区别是:
lambda表达式基本在一行以内就完整的表达了整个函数的运算逻辑。
我们直接看 和def的对应关系你就明白了。
具体的,我们看一下def语句的函数定义与相应的lambda表达式之间的对应关系,你就能明白。
def 函数名(参数1, 参数2, ...):
return 返回值
函数名 = lambda 参数1, 参数2, ...: 返回值
注意:Lambda 表达式中 lambda 在oython中是个关键字。
我们看实例:
# def定义的加法函数
def add_def(a, b=1):
return a + b
# Lambda 表达式:定义的加法函数
# 这里为了区分方便阅读,函数名不太一致。
add_lambda = lambda a, b=1: a + b
实际的代码结果:
def add_def(a, b=1):
return a + b
add_lambda = lambda a, b=1: a + b
print(add_def(4, 4)) # 8
print(add_def(4)) # 5
print(add_lambda(4, 4)) # 8
print(add_lambda(4)) # 5
对应关系你很清楚理解 Lambda 表达式是什么了。
现在我们看看 Lambda 表达式的定义。
lambda parameters: expression
所谓估值表达式,就是最终能被运算成一个值的表达,例如常量、变量、运算表达式、函数调用、列表切片,等等。
※关于【3、Lambda 表达式的定义】内容来自知乎作者:Python3基础:lambda表达式
虽然 Lambda 表达式 和def定义的函数 是一样的,但是Lambda 表达式 的使用是根据自己特点有限制的。
我们接下来看一下Lambda 表达式的特点。
例:有四个参数,逗号隔开
add_lambda = lambda a, b, c=1, d=2: a + b + c + d
print(add_lambda(4, 4)) # 11
print(add_lambda(4, 4, 4, 4)) # 16
功能简单。
单行expression决定了lambda函数不可能完成复杂的逻辑,只能完成非常简单的功能。所有的函数逻辑必须一行之内完成。
表达式有唯一性。
lambda表达式只允许包含一个表达式,不能包含复杂语句,该表达式的运算结果就是函数的返回值。
因为最终结果一定要被运算成一个值,例如常量、变量、运算表达式、函数调用、列表切片,等等。
也真因为第三个特点:最终结果一定要被运算成一个值。
因此基于这个特点,Lambda 表达式中可以包含三目运算语句,因为三目运算语句的结果就是一个值。
关于三目运算语句请参照:三目运算语句
直接上代码:
get_odd_even = lambda x: '偶数' if x % 2 == 0 else '奇数'
print(get_odd_even(3))
# 奇数
print(get_odd_even(4))
# 偶数
等价以下语句:
def get_odd_even(x):
if x % 2 == 0:
str = "偶数"
else:
str = "奇数"
return str
print(get_odd_even(3))
# 奇数
print(get_odd_even(4))
# 偶数
直接看示例:
print((lambda a, b: a + b)(1, 2)) # 3
print((lambda: 100)()) # 100
print((lambda a: a)('hello world')) # hello world
print((lambda a, b, c=100: a + b + c)(10, 20)) # 130
返回值是个元组。
print((lambda *args: args)(10, 20, 30)) # (10, 20, 30)
返回值是个字典。
print((lambda **kwargs: kwargs)(name='python', age=20)) # {'name': 'python', 'age': 20}
主要介绍 sorted(),sort(),max(),min()参数key中使用 Lambda 表达式。
TestList = ['Charle', 'Bob', 'Alice']
TestListSorted = sorted(TestList)
print(TestListSorted)
# ['Alice', 'Bob', 'Charle']
本例:在参数key中指定返回字符数的内置函数 len(),从而按字符数降序排序。
TestList = ['Charle', 'Bob', 'Alice']
TestListSorted = sorted(TestList, key=len)
print(TestListSorted)
# ['Bob', 'Alice', 'Charle']
这时我们把 key 执行成 Lambda 表达式。可以将任意函数应用于各元素,并根据其结果进行排序。
例如,当将用于获取第二个字符的lambda表达式【lambda x: x[1]】指定为key时,按照第二个字符的字母顺序进行排序。
下面示例可以看的更清楚:
1、首先我们要知道:
lambda x: x[0]
是在取列表各个元素对应下标的值。
print((lambda x: x[0])([1, 2, 3])) # 1
print((lambda x: x[1])([1, 2, 3])) # 2
print((lambda x: x[2])([1, 2, 3])) # 3
print((lambda x: x[0])('ABC')) # A
print((lambda x: x[1])('ABC')) # B
print((lambda x: x[2])('ABC')) # C
2、所以我们直接看例子:
TestList = ['CEG', 'BFH', 'ADI']
# 以列表中列表的第一个字母排序
print(sorted(TestList, key=lambda x: x[0]))
# ['ADI', 'BFH', 'CEG']
# 以列表中列表的第二个字母排序
print(sorted(TestList, key=lambda x: x[1]))
# ['ADI', 'CEG', 'BFH']
# 以列表中列表的第三个字母排序
print(sorted(TestList, key=lambda x: x[2]))
# ['CEG', 'BFH', 'ADI']
Testlist = [
[4, 2, 9],
[1, 5, 6],
[7, 8, 3]
]
# 以列表中列表的第一个数排序
print(sorted(Testlist, key=lambda x: x[0]))
# [[1, 5, 6], [4, 2, 9], [7, 8, 3]]
# 以列表中列表的第二个数排序
print(sorted(Testlist, key=lambda x: x[1]))
# [[4, 2, 9], [1, 5, 6], [7, 8, 3]]
# 以列表中列表的第三个数排序
print(sorted(Testlist, key=lambda x: x[2]))
# [[7, 8, 3], [1, 5, 6], [4, 2, 9]]
# 以列表中列表的第一个数排序,且降序
print(sorted(Testlist, key=lambda x: x[0], reverse=True))
# [[7, 8, 3], [4, 2, 9], [1, 5, 6]]
dict = {'c': 1, 'b': 2, 'a': 3}
print(sorted(dict))
# ['a', 'b', 'c']
print(sorted(dict, reverse=True))
# ['c', 'b', 'a']
dict = {'c': 1, 'b': 2, 'a': 3}
print(sorted(dict, key=lambda x: dict[x]))
# ['c', 'b', 'a']
print(sorted(dict, key=lambda x: dict[x], reverse=True))
# ['a', 'b', 'c']
dict = {
'a': {'x': 3, 'y': 2, 'z': 1},
'b': {'x': 2, 'y': 1, 'z': 3},
'c': {'x': 1, 'y': 3, 'z': 2}
}
# 以内部字典的'x'对应的值排序
print(sorted(dict, key=lambda x: dict[x]['x']))
# ['c', 'b', 'a']
# 以内部字典的'y'对应的值排序
print(sorted(dict, key=lambda x: dict[x]['y']))
# ['b', 'a', 'c']
# 以内部字典的'z'对应的值排序
print(sorted(dict, key=lambda x: dict[x]['z']))
# ['a', 'c', 'b']
# 以内部字典的'x'对应的值排序,并降序
print(sorted(dict, key=lambda x: dict[x]['x'], reverse=True))
# ['a', 'b', 'c']
list = [0, 1, 2, 3]
map_square = map(lambda x: x**2, list)
print(map_square)
#
print(list(map_square))
# [0, 1, 4, 9]
等同于以下语句:
list = [0, 1, 2, 3]
l_square = [x**2 for x in list]
print(l_square)
# [0, 1, 4, 9]
list = [0, 1, 2, 3]
filter_even = filter(lambda x: x % 2 == 0, list)
print(list(filter_even))
# [0, 2]
等同于:
list = [0, 1, 2, 3]
l_even = [x for x in list if x % 2 == 0]
print(l_even)
# [0, 2]
如果有问题,请指出,或者copy了谁的,也请指出。
会及时更正。