Python eval 函数动态地计算数学表达式

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()还需要两个可选参数。

  1. globals

  2. 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() 运行以下步骤。

  1. 解析表达式

  2. 将其编译为字节码

  3. 将其作为一个Python表达式进行计算

  4. 返回计算的结果

eval()的第一个参数 expression 强调了该函数只作用于表达式,并非复合语句[4]。Python 文档对 expression 的定义如下。

expression

一段可以被计算为某种值的语法。换句话说,表达式是表达式元素的累积,如字面意义、名称、属性访问、运算符或函数调用,它们都返回一个值。与许多其他语言相比,并非所有的语言结构都是表达式。也有一些语句不能作为表达式使用,如 while。此外赋值也是语句,不是表达式。(来源[5])

另一方面,Python statement 有如下定义。

statement

statement是一个套件(一个代码 "块")的一部分。statement要么是一个表达式,要么是带有关键字的几个结构体之一,如 if、while或for。(来源[6])

如果向eval()传递一个复合语句,那么会得到一个 SyntaxError。下面的例子是用eval()来执行一个if语句

&g
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值