Python lambda表达式(匿名函数)及用法
lambda 表达式(又称匿名函数)是现代编程语言争相引入的一种语法,如果说函数是命名的、方便复用的代码块,那么 lambda 表达式则是功能更灵活的代码块,它可以在程序中被传递和调用。
使用 lambda 表达式代替局部函数
lambda 表达式的语法格式如下:
lambda [parameter_list] : 表达式 从上面的语法格式可以看出 lambda 表达式的几个要点: lambda 表达式必须使用 lambda 关键字定义。 在 lambda 关键字之后、冒号左边的是参数列表,可以没有参数,也可以有多个参数。如果有多个参数,则需要用逗号隔开,冒号右边是该 lambda 表达式的返回值。
[root@kube lambda]# cat demo.py #coding:utf-8 def get_fun(type): if type == 'square': return lambda n: n * n # lambda 代替了函数的重新定义 elif type == 'cube': return lambda n: n * n * n else: return lambda n: n + n a = get_fun('square') b = get_fun('type') print(a(5)) print(b(5)) [root@kube lambda]# py demo.py 25 10 [root@kube lambda]#
总体来说,函数比 lambda 表达式的适应性更强,lambda 表达式只能创建简单的函数对象(它只适合函数体为单行的情形)。但 lambda 表达式依然有如下两个用途:
- 对于单行函数,使用 lambda 表达式可以省去定义函数的过程,让代码更加简洁。
- 对于不需要多次复用的函数,使用 lambda 表达式可以在用完之后立即释放,提高了性能。
[root@kube lambda]# cat demo1.py #coding:utf-8 x = map( lambda x: x*x ,range(8)) print('x:',x) print([i for i in x]) [root@kube lambda]# py demo1.py x: <map object at 0x7f8d535a7890> [0, 1, 4, 9, 16, 25, 36, 49] [root@kube lambda]#
正如从上面代码所看到的,内置的 map() 函数的第一个参数需要传入函数,此处传入了函数的简化形式:lambda 表达式,这样程序更加简洁,而且性能更好。
节所介绍的 lambda 表达式是 Python 编程的核心机制之一。Python 语言既支持面向过程编程,也支持面向对象编程。而 lambda 表达式是 Python 面向过程编程的语法基础,因此读者必须引起重视。
Python eval()和exec()函数详解
eval() 和 exec() 函数都属于 Python 的内置函数,由于这两个函数在功能和用法方面都有相似之处,所以将它们放到一节进行介绍。
eval() 和 exec() 函数的功能是相似的,都可以执行一个字符串形式的 Python 代码(代码以字符串的形式提供),相当于一个 Python 的解释器。二者不同之处在于,eval() 执行完要返回结果,而 exec() 执行完不返回结果(文章后续会给出详细示例)。
eval()和exec()的用法 eval() 函数的语法格式为: eval(expression, globals=None, locals=None, /) 而 exec() 函数的语法格式如下: exec(expression globals=None, locals=None, /)
可以看到,二者的语法格式除了函数名,其他都相同,其中各个参数的具体含义如下:
- expression:这个参数是一个字符串,代表要执行的语句 。该语句受后面两个字典类型参数 globals 和 locals 的限制,只有在 globals 字典和 locals 字典作用域内的函数和变量才能被执行。
- globals:这个参数管控的是一个全局的命名空间,即 expression 可以使用全局命名空间中的函数。如果只是提供了 globals 参数,而没有提供自定义的 __builtins__,则系统会将当前环境中的 __builtins__ 复制到自己提供的 globals 中,然后才会进行计算;如果连 globals 这个参数都没有被提供,则使用 Python 的全局命名空间。
- locals:这个参数管控的是一个局部的命名空间,和 globals 类似,当它和 globals 中有重复或冲突时,以 locals 的为准。如果 locals 没有被提供,则默认为 globals。
注意,__builtins__ 是 Python 的内建模块,平时使用的 int、str、abs 都在这个模块中。通过 print(dic["__builtins__"]) 语句可以查看 __builtins__ 所对应的 value。