Python3内置函数汇总

目录

Python3 eval() 函数详解 执行字符串表达式语句

eval()函数的主要作用是执行一个字符串表达式,可以提供给函数指定的全局以及本地环境变量。它还可以执行由compile()函数创建的模式为'eval'的代码对象。如果使用eval()函数执行了compile()创建的模式为'exec'的代码对象,返回值则为None。
它是Python的内置函数,在python文件中直接可以使用。

eval

语法

eval(expression[, globals[, locals]])

参数

expression(必选) - 一个字符串表达式
globals(可选) - 全局命名空间,如果传递了该参数,类型必须是dict(字典)。如果只设置了全局变量,则它将被用于全局和局部变量。
locals(可选) - 局部命名空间,它可以是任何映射对象,而实际上在默认情况下(不存在于任何函数或类中),它和globals的值是一样的。如果在函数体内locals就会发生改变了。

返回值

表达式的执行结果

实例

§ 实例1 - 常用方式

代码及运行结果:

>>> eval("123")               #输出字符串
123

>>> x = 1
>>> eval("x + 2")             #运算
3

>>> eval("max(30, 100, 750)") #执行其他函数
750
§ 实例2 - 关于globals的实验

在默认情况下第二个参数globals是全局命名的一个集合,包含了所有全局变量。

>>> x = 1
>>> eval("x + 2")
3
#默认情况下,运算是成立的。

#但如果我们自定义的第二个参数,情况可能就会发生变化了。例如以下两个情况:
>>> x = 1
>>> eval("print(x + 2)", {})
#结果是发生错误的:NameError: name 'x' is not defined。
#由于自定义了全局变量为空字典,按照规则,只设置了全局变量的话,也会影响到默认的本地变量,所有全局和本地变量都是空字典了,则会导致eval运行是,找不到x变量。

#既然能删掉某个变量,那么就可以加上某个变量。
>>> eval("new + 2")
#直接执行它,会报错:NameError: name 'new' is not defined,找不到new变量。
>>> eval("new + 2", {'new': 5})
7
#由于自定义了全局变量new。运算就成立了。
#自定义globals一般用于多个模块调用时,指定命名空间(变量环境)使用,这并不常用。
§ 实例3 - 关于locals的实验

locals参数是指定局部变量的,如果在代码的最外部使用,它和globals并没有什么区别。但是在函数体内使用,它仅仅只代表当前函数体的环境。

>>> g = 2
>>> def local():
...     x = 1
...
>>> def run():
...     eval("print(g + 10)")
...     eval("print(x + 2)")
...
>>> run()
#run()的执行结果是:
#12
#NameError: name 'x' is not defined
#输出12,是因为全局变量可以访问到外部的g变量,但是由于x变量并不是在全局环境下声明的,也不是在当前函数体内的局部变量,而是在另一个函数体中声明的,所有x是获取不到的。
#所以eval如果要在函数体内运行,一定要考虑业务逻辑,不要调用其他函数体的变量,同时不是必须的情况下,也不应该把其他函数体内的局部变量全局化。
§ 实例4 - 执行compile()生成的代码对象
>>> c = compile("(20 + 30 - 10) / 5", '', 'eval')
>>> eval(c)
8.0

如果有任何建议或意见,欢迎交流沟通

作者:张恺阳

本文链接:https://www.zky.name/article/29.html

来源:张恺阳博客