Python - 计算器程序和字符串

1 投票
1 回答
546 浏览
提问于 2025-04-19 17:41

我刚开始学习Python,想写一个计算器程序。我尝试了很多方法,但都没有成功,所以希望能得到一些指导:

我想让用户输入一个方程,比如: f(t) = 2x^5 + 8

程序应该能够识别这个字符串的不同部分,在这种情况下,创建一个变量f(t),并把2x^5 + 8赋值给它。

不过,如果我输入一个方程后面跟着一个等号,比如 2x^5 + 8 =

那么程序就应该直接输出结果。

我并不是在询问如何编写解决方程的数学逻辑,而是想知道如何让程序识别字符串的不同部分,并根据这些部分做出相应的决定。

抱歉我没有任何代码示例,因为我不知道该如何着手,所以希望能得到一些帮助来开始。

谢谢。

1 个回答

0

先给你一点背景知识:你提到的问题通常被称为解析,这个过程可能会变得相当复杂,具体取决于语法。这里的语法就是对语言的描述;在你的例子中,这个语言就是你计算器所有有效公式的集合。

在你开始编码之前,首先推荐的步骤是把你的语法整理清楚。这主要是为了你自己,因为这样编程会更简单。一个常用的方法是用EBNF来描述语法,Python中有像PLY这样的工具,可以用来生成这种语言的解析器。

我们来试试一个简化版的计算器语法:

digit := "0" | "1"                  # our numbers are in binary
number := digit | number digit      # these numbers are all nonnegative
variable := "x" | "y"               # we recognize two variable names
operator := "+" | "-"               # we could have more operators
expression := number | variable | "(" expression operator expression ")"
definition := variable "=" expression 
evaluation := expression "="

注意,这个语法还有多个问题。例如:

  1. 空格怎么办?
  2. 负数怎么办?
  3. x = x这样的输入怎么办(这是一个有效的定义)?

前两个问题可能是语法本身的问题,而最后一个问题可能需要在后期处理(这个语言是否可能是上下文相关的?)。

不过,总的来说,给定这样的语法,像PLY这样的工具可以为你生成解析器,但处理任何额外的逻辑(比如x = x)还是得靠你自己。不过,我建议你先尝试自己实现一下。一个想法是使用递归来写一个所谓的自顶向下解析器

撰写回答