函数进阶5.6匿名函数


一、是什么

匿名函数:没有名字的函数,在Python中用lambda定义

示例

lambda x, y: x + y  # 定义了一个匿名函数 1.没有名字 2.完成2个数的加法操作

二、做什么

  1. 可以用一行代码完成简单的函数定义
  2. 可以当做实参快速传递到函数中去

三、怎样用

lambda关键词能匿名函数。这种函数得名于省略了用def声明函数的标准步骤

1. 格式

lambda函数的语法只包含一个语句,如下:

lambda 形参1, 形参2, 形参3: 表达式

2. 注意

lambda函数能接收任何数量的参数但只能返回一个表达式的值,其默认就是返回的,不用写return

3. 使用方式

既然我们已经知道def定义函数时的变量存储的是函数的引用,所以只要有了这个函数的引用,也就可以通过变量名()的方式调用函数

而,函数分为def定义的普通函数,和用lambda定义的匿名函数,所以无论一个变量例如b保存的是普通函数的引用,还是匿名函数的引用,都可以用b()方式调用b指向的函数

一般情况下对匿名函数的使用有2种方式

  1. 通过lambda定义匿名函数,然后用一个变量指向这个匿名函数,然后通过变量名()调用这个匿名函数
  2. 直接在调用其它函数实参的位置通过lambda定义匿名函数,会将这个匿名函数的引用当做实参进行传递

方式1示例:

# 定义了一个匿名函数,然后让变量add_2_nums指向它
add_2_nums = lambda x, y: x + y

# 调用add_2_nums指向的匿名函数
print("10+20=" % add_2_nums(10, 20))
 

以上实例输出结果:

0+20=30

方式2示例:

def fun(a, b, opt):
    print("a = %d" % a)
    print("b = %d" % b)
    print("result = %d" % opt(a, b))  # 此时opt指向了第7行定义的匿名函数,所以opt(a, b)就相当于调用匿名函数


fun(1, 2, lambda x, y: x + y)  # 定义一个匿名函数,且将它的引用当做实参进行传递
 

四、案例

想一想,下面的数据如何指定按agename排序?

stus = [
    {"name": "wanglaoshi", "age": 18},
    {"name": "donglaoshi", "age": 19},
    {"name": "dong4716138", "age": 17}
]
 

按name排序:

stus = [
    {"name": "wanglaoshi", "age": 18},
    {"name": "donglaoshi", "age": 19},
    {"name": "abc", "age": 17}
]

print("排序前,stus=", stus)
stus.sort(key=lambda x: x['name'])
print("排序后,stus=", stus)
 

按age排序:

stus = [
    {"name": "wanglaoshi", "age": 18},
    {"name": "donglaoshi", "age": 19},
    {"name": "abc", "age": 17}
]

print("排序前,stus=", stus)
stus.sort(key=lambda x: x['age'])
print("排序后,stus=", stus)
 

说明

image-20200903152848001