Python知识学习18——匿名函数的使用

我们先来复习一下列表的一些常用方法:

列表排序(数字元素)

默认:从小到大

1
2
3
4
>>> arr = [33, 43, 12, 18, 9, 40]
>>> arr.sort()
>>> print(arr)
[9, 12, 18, 33, 40, 43]

从大到小

1
2
3
4
>>> arr = [33, 43, 12, 18, 9, 40]
>>> arr.sort(reverse = True)
>>> print(arr)
[43, 40, 33, 18, 12, 9]

列表倒序(数字元素)

1
2
3
4
>>> arr = [33, 43, 12, 18, 9, 40]
>>> arr.reverse()
>>> print(arr)
[40, 9, 18, 12, 43, 33]

那么如果列表元素是不能直接自然排序的字典元素,要怎么办呢?

列表排序(字典元素)

1
2
3
4
>>> infors = [{"name" : "LaoWang", "age" : 12}, {"name" : "BanZhang", "age" : 10}, {"name" : "ChuShi", "age" : 13}]
>>> infors.sort(key = lambda x:x["name"])
>>> print(infors)
[{'name': 'BanZhang', 'age': 10}, {'name': 'ChuShi', 'age': 13}, {'name': 'LaoWang', 'age': 12}]

将匿名函数作为实参

1
2
3
4
>>> def test(a, b, func):
··· return func(a, b)
>>> print(test(1, 2, lambda a, b : a + b))
3

字符串作为lambda函数

1
2
3
4
5
6
>>> def test(a, b, func):
··· return func(a, b)
>>> func = "lambda a, b : a * b"
>>> func = eval(func)
>>> print(test(1, 2, func))
2

以上函数,如果没有eval()函数,在Python2当中可以运行,但是在Python3当中,会报出如下错误:

TypeError: ‘str’ object is not callable

原因是,Python3不允许直接把字符串作为函数表达式运行。

eval()函数:eval(expression, globals=None, locals=None)

— 官方文档中的解释是,将字符串str当成有效的表达式来求值并返回计算结果。

globals和locals参数是可选的,如果提供了globals参数,那么它必须是dictionary类型;如果提供了locals参数,那么它可以是任意的map对象。

eval()使用原因

1)在编译语言里要动态地产生代码,基本上是不可能的,但动态语言是可以。

意味着软件已经部署到服务器上了,但只要作很少的更改,只好直接修改这部分的代码,就可立即实现变化,不用整个软件重新加载。

2)在machin learning里根据用户使用这个软件频率,以及方式,可动态地修改代码,适应用户的变化。