Python的 eval()
允许从基于字符串或基于编译代码的输入中计算任意Python表达式。当从字符串或编译后的代码对象的任何输入中动态计算Python表达式时,此函数非常方便。本文中,云朵君将和大家一起从如下两个方面展开学习。
-
Python的
eval()
如何工作 -
如何使用
eval()
来动态地计算任意基于字符串或基于编译代码的输入
此外,后期推文将一起学习如何使用 Python 的 eval()
来编码一个交互式地计算数学表达式的应用程序。通过这个例子,我们将把所学到的关于 eval()
的一切应用于一个实际问题。
Python 的 eval()
我们可以使用内置的 Python eval()[1] 从基于字符串或基于编译代码的输入中动态地计算表达式。如果我们向 eval()
传递一个字符串,那么该函数会解析它,将其编译为字节码[2],并将其作为一个 Python 表达式进行计算。但是如果我们用一个编译过的代码对象调用 eval()
,那么该函数只执行计算步骤,如果我们用相同的输入多次调用 eval()
,这就非常方便了。
Python的 eval()
的定义如下。
eval(expression[, globals[, locals]])
该函数需要一个第一个参数,称为expression,它包含了需要计算的表达式。eval()
还需要两个可选参数。
-
globals
-
locals
在接下来的内容中,我们将学习这些参数是什么,以及 eval()
如何使用它们来即时计算Python 表达式。
注意: 我们也可以使用 exec()[3] 来动态地执行 Python 代码。eval()
和 exec()
的主要区别是,eval()
只能执行或计算表达式,而 exec()
可以执行任何一段 Python代码。
第一个参数:expression
eval()
的第一个参数称为 expression
,它是一个必需的参数,用于保存函数的 基于字符串 或 基于编译码的 输入。当调用 eval()
时,expression
的内容被作为 Python 表达式进行计算。下面是使用基于字符串的输入的例子。
>>> eval("2 ** 8")
256
>>> eval("1024 + 1024")
2048
>>> eval("sum([8, 16, 32])")
56
>>> x = 100
>>> eval("x * 2")
200
当用一个字符串作为参数调用 eval()
时,该函数返回对输入字符串进行计算的结果。默认情况下,eval()
可以访问全局变量名,如上例中的x
。
为了计算一个基于字符串的表达式,Python 的 eval()
运行以下步骤。
-
解析表达式
-
将其编译为字节码
-
将其作为一个Python表达式进行计算
-
返回计算的结果
eval()
的第一个参数 expression 强调了该函数只作用于表达式,并非复合语句[4]。Python 文档对 expression 的定义如下。
expression
一段可以被计算为某种值的语法。换句话说,表达式是表达式元素的累积,如字面意义、名称、属性访问、运算符或函数调用,它们都返回一个值。与许多其他语言相比,并非所有的语言结构都是表达式。也有一些语句不能作为表达式使用,如
while
。此外赋值也是语句,不是表达式。(来源[5])
另一方面,Python statement 有如下定义。
statement
statement
是一个套件(一个代码 "块")的一部分。statement
要么是一个表达式,要么是带有关键字的几个结构体之一,如if、while或for
。(来源[6])
如果向eval()
传递一个复合语句,那么会得到一个 SyntaxError。下面的例子是用eval()
来执行一个if语句
。
&g