匿名函数
在python中,除了一般使用def定义的函数外,还有一种使用lambda定义的匿名函数。这种函数可以用在任何普通函数可以使用的地方,但在定义时被严格限定为单一表达式。从语义上讲,它只是普通函数的语法糖。
语法
lambda arguments: expression
其中 arguments
是参数列表, 可以包含零个或多个参数,用逗号隔开,而 expression
则是该函数的执行体,它会根据输入的参数计算返回结果。
使用方式
sum = (lambda x, y: x + y)
print(sum(1, 2))
#输出
3
可以发现,上面的 sum 就是一个匿名函数,我们并没有写 return 语句,但依然能够返回结果。lambda x, y是匿名函数的声明部分,而 x + y则是匿名函数的实现部分
实际应用
匿名函数与max()/min()
max与min函数是用来找到可迭代对象中的最大/最小值的函数,底层相当于调用for循环,可以指定比较的依据。
max(iterable, *[, default=obj, key=func])
: 返回 iterable
中的最大值。可选参数包括:
default
: 当iterable
为空时,返回此值。默认为None
。key
: 用于比较元素的函数,接受一个参数并返回一个用于排序的键。默认为 None,表示直接比较元素本身。
list1 = [{"a": 10, "b": 20}, {"a": 20, "b": 20}, {"a": 50, "b": 20}, {"a": 6, "b": 20}, {"a": 9, "b": 20}]
# 那个列表中的a最大
max_value = max(list1, key=lambda x: x["a"])
print(max_value)
#输出
{'a': 50, 'b': 20}
# 找到字典中苹果数量最多/最少的人,输出他的名字。
apple_dict = {
'one': 5,
'two': 2,
'three': 3
}
res = max(apple_dict, key=lambda key: apple_dict[key])
print(res)
#输出
one
注:for循环对字典进行遍历,默认遍历的是字典的key
将匿名函数当做参数
# -*- coding: utf-8 -*-
def func(a, b, fun):
s = fun(a, b)
return s
z = func(5, 10, lambda a, b: a + b)
print(z) # 15
#输出
15
匿名函数与map()
map函数相当于将可迭代对象进行遍历,将每个值当作参数传给匿名函数,返回匿名函数处理后的值,得到的是一个生成器。
map() 函数语法:
map(function, iterable, ...)
第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新列表 [Python 3.x 返回迭代器。]
# -*- coding: utf-8 -*-
list_one = ['alex', 'lxx', 'wxx', 'shisbuyu']
res = map(lambda name: name + 'dsb', list_one)
print(res) # 生成器
for i in res:
print(i)
#输出
<map object at 0x000001917F8D5F88>
alexdsb
lxxdsb
wxxdsb
shisbuyudsb
匿名函数与filter()
filter函数相当于将可迭代对象进行遍历,将每个值当作参数传给匿名函数,返回匿名函数处理后的值,得到的也是一个生成器
filter是通过生成 True 和 False 组成的迭代器将可迭代对象中不符合条件的元素过滤掉;
# -*- coding: utf-8 -*-
list1 = ['pig', 'python', 'cute']
res = filter(lambda name: name.startswith('p'), list1) # 可迭代对象是第二个参数
print(res) # 得到的是生成器
list2 = []
for i in res:
list2.append(i)
print(list2)
#输出
<filter object at 0x000002856ED85FC8>
['pig', 'python']
匿名函数与reduce
reduce() 函数从左至右依次累计使用列表中的元素调用 function 函数,从而将列表累积生成单个值。
reduce() 函数语法:reduce(function, iterable[, initializer])
function – 函数,有两个参数
iterable – 可迭代对象
initializer – 可选,初始参数
与 map() 和 filter() 函数不同,reduce() 不是 Python 内置函数。实际上,reduce() 函数来自 functools 模块。如果想要使用 reduce() 函数,我们需要在代码开始时使用以下语句导入 functools 模块:
from functools import reduce
# -*- coding: utf-8 -*-
from functools import reduce
res = reduce(lambda x, y: x + y, [1, 2, 3], 10)
print(res)
res = reduce(lambda x, y: x + y, ['a', 'b', 'c'], 'Hello')
print(res)
res = reduce(lambda x, y: x + y, ['a', 'b', 'c'])
print(res)
#输出
16
Helloabc
abc
匿名函数与sorted()
sorted函数可以用来对可迭代对象进行排序,默认是从小到大的顺序,原理与max函数类似,底层也是相当于调用for循环,可以指定排序的依据以及排序的顺序。
sorted 语法:sorted(iterable, cmp=None, key=None, reverse=False)
iterable – 可迭代对象。
cmp – 比较的函数,这个具有两个参数,参数的值都是从可迭代对象中取出,此函数必须遵守的规则为,大于则返回1,小于则返回-1,等于则返回0。
key – 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。
reverse – 排序规则,reverse = True 降序 , reverse = False 升序(默认)。
# -*- coding: utf-8 -*-
apple_dict = {
'one': 5,
'two': 2,
'three': 3
}
res = sorted(apple_dict, key=lambda key: apple_dict[key])
print(res) # ['two', 'three', 'one']
# 如果想要结果从高到低输出,需要指定reverse参数
res = sorted(apple_dict, key=lambda key: apple_dict[key], reverse=True)
print(res) # ['one', 'three', 'two']
#输出
['two', 'three', 'one']
['one', 'three', 'two']
评论