匿名函数

在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']