58.匿名函数

匿名函数

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

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

lambda [arg1 [,arg2,.....argn]]:expression

如下实例:

sum = lambda arg1, arg2: arg1 + arg2

# 调用sum函数
print("Value of total : " % sum( 10, 20 ))
print("Value of total :  "% sum( 20, 20 ))

以上实例输出结果:

Value of total :  30
Value of total :  40

Lambda函数能接收任何数量的参数但只能返回一个表达式的值

匿名函数不能直接调用print,因为lambda需要一个表达式

应用场合

函数作为参数传递

  1. 自己定义函数
>>> def fun(a, b, opt):
...     print("a = " % a)
...     print("b = " % b)
...     print("result =" % opt(a, b))
...
>>> fun(1, 2, lambda x,y:x+y)
a = 1
b = 2
result = 3

  2.作为内置函数的参数

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

stus = [
    {"name": "zhangsan", "age": 18}, 
    {"name": "lisi", "age": 19}, 
    {"name": "wangwu", "age": 17}
]

按name排序:

>>> stus.sort(key = lambda x: x['name'])
>>> stus
[{'age': 19, 'name': 'lisi'}, {'age': 17, 'name': 'wangwu'}, {'age': 18, 'name': 'zhangsan'}]

按age排序:

>>> stus.sort(key = lambda x: x['age'])
>>> stus
[{'age': 17, 'name': 'wangwu'}, {'age': 18, 'name': 'zhangsan'}, {'age': 19, 'name': 'lisi'}]

例子1:

# 匿名函数
# 01: 对函数的另一种解释
# 02: 作为函数的参数传递
# 03: 应用于在列表中进行自定义排序(list.sort-> key)

# 无参数无返回值
# def func1():
#     print("你好")
# func1()
# 匿名函数的定义
f = lambda : print("你好")
# 调用
f()

例子2:

# 无参数有返回值
# def func2():
#     return 3.14
# pi = func2()
# print(pi)
# 匿名函数的定义
f = lambda : 3.14
pi = f()
print(pi)

例子3:

# 有参数无返回值
# def func3(name):
#     print("你好%s" % name)
# func3("中国")
f = lambda name, age : print("你好%s--%d" % (name, age))
f("龟叔", 60)

例子4:

# 有参数有返回值
# def func4(a, b):
#     return a + b
# ret = func4(10, 20)
# print(ret)

f = lambda a, b : a + b
ret = f(20, 30)
print(ret)
作为函数的参数传递

例子5:

# 01:

b = 10
# 定义一个函数 计算两个数求和 一个数为10 另一个不确定
def add2num(a):
    ret = a + b
    print(ret)

add2num(20)

例子6:

num = 10
# 定义一个函数 计算两个数求和 一个数为10 另一个不确定
def add2num(a, b):
    ret = a + b
    print(ret)

add2num(20, num)

例子7:

# 02:
def add2num(a, b):
    return a + b

# result = add2num(10, 20)
# print(result)
my_func = add2num

result = my_func(10, 20)
print(result)

例子8:

# 03:
# 定义一个函数计算三个数的求和
def add3num(a, b, c):
    return a + b + c

# 定义一个函数计算三个数的平均值
def average3num(num1, num2, num3):
    ret = add3num(num1, num2, num3)
    return ret / 3

result = average3num(10, 20, 30)
print(result)

例子9:

# def add3num(a, b, c):
#     return a + b + c
# 转成匿名函数
f = lambda a, b, c : a + b + c

# 定义一个函数计算三个数的平均值
def average3num(num1, num2, num3, func):
    ret = func(num1, num2, num3)
    return ret / 3

# result = average3num(10, 20, 30, f)
result = average3num(10, 20, 30, (lambda a, b, c : a + b + c))

print(result)
应用于在列表中进行自定义排序(list.sort-> key)

例子10:

# 定义一个列表
my_list = [3, 5, 10, -100, 100]
my_list.sort()
print(my_list)

运行结果:

[-100, 3, 5, 10, 100]

例子11:

stus = [{"name": "zhangsan", "age": 18}, {"name": "lisi", "age": 19}, {"name": "wangwu", "age": 17}]
# [{"name": "wangwu", "age": 17}, {"name": "zhangsan", "age": 18}, {"name": "lisi", "age": 19}]
for dict in stus:
    print(dict["age"])
# age
stus.sort(key=lambda dict:dict["age"])
print(stus)

运行结果:

18
19
17
[{'name': 'wangwu', 'age': 17}, {'name': 'zhangsan', 'age': 18}, {'name': 'lisi', 'age': 19}]

例子12:

stus = [{"name": "zhangsan", "age": 18}, {"name": "lisi", "age": 19}, {"name": "wangwu", "age": 17}]
# [{"name": "wangwu", "age": 17}, {"name": "zhangsan", "age": 18}, {"name": "lisi", "age": 19}]
for dict in stus:
    print(dict["age"])
# age
stus.sort(key=lambda dict:dict["age"], reverse=True)
print(stus)

运行结果:

18
19
17
[{'name': 'lisi', 'age': 19}, {'name': 'zhangsan', 'age': 18}, {'name': 'wangwu', 'age': 17}]

例子13:

stus = [{"name": "zhangsan", "age": 18}, {"name": "lisi", "age": 19}, {"name": "wangwu", "age": 17}]
# [{"name": "wangwu", "age": 17}, {"name": "zhangsan", "age": 18}, {"name": "lisi", "age": 19}]
for dict in stus:
    print(dict["age"])
# age
# stus.sort(key=lambda dict:dict["age"], reverse=True)
# print(stus)
# name
stus.sort(key=lambda dict: dict["name"])
print(stus)

运行结果:

18
19
17
[{'age': 19, 'name': 'lisi'}, {'age': 17, 'name': 'wangwu'}, {'age': 18, 'name': 'zhangsan'}]

例子14:

# 列表
m_list = [[10, 2, 111], [8, 2, 11], [9, 5, 100]]
m_list.sort(key=lambda l:l[2])
print(m_list)

运行结果:

[[8, 2, 11], [9, 5, 100], [10, 2, 111]]

 

posted @ 2020-05-08 01:06  kelin1  阅读(191)  评论(0编辑  收藏  举报