在Python 2.7.3中使用eval来解决数学表达式

时间:2013-12-31 09:40:45

标签: python math eval

我基本上问我是否应该在这种情况下使用eval for Python 2.7.3;

实际问题(了解阅读以下内容)

我基本上问的是,方法1是否更好,或者方法2是否更适合这种情况。我认为方法1的编码时间会少一些,编码时保存线条通常会更好,但是我知道很明显人们反对使用eval()评估表达式,因为它显然不是好形式。

干杯

目标;汇报;

对于这个问题的上下文,我正在尝试创建一个函数;

  1. 提出数学问题并将其作为字符串输出,主题为“操作顺序”

  2. 作为第二项输出,它会输出正确的答案

  3. 作为剩余的输出,它输出的答案是不正确的,但如果操作顺序被更改,例如在乘法之前进行减法,则可以达到答案

  4. 该功能不需要任何参数,但在问题过程中将要求我们进行以下导入;

    *导入随机

    来自随机导入选择*

    这对于生成随机整数作为任何问题的数字以及选择问题中涉及的操作(例如*,/,+, -

    )是必要的。

    2种方法

    方法1

    1. 我创建一个字符串,对于奇数个转弯,我在向字符串添加整数和操作之间交替(因此以整数结尾),然后在末尾将括号放在其中的某些位置串

    2. 我使用eval()来评估字符串,从而提供正确的答案

    3. 我通过在不同的地方插入括号来制作其他版本的字符串,基本上返回不同的答案,然后我在这些上使用eval()来查找其他答案

    4. 方法2

      1. 除了将元素放入列表

      2. 之外,我对方法1做了类似的操作
      3. 将作为列表提供的操作顺序作为输入,例如正确的是[* ,(,/),(+, - )],然后我找到这些操作在列表中的位置并对左右两边的整数执行操作,删除列表的3个部分,并用我们找到的答案替换它们。我们使用重复

      4. 对整个列表的所有操作执行此操作
      5. 我只是根据操作顺序输入不同的列表来获得不同的答案,因此更容易找到错误答案的步骤

1 个答案:

答案 0 :(得分:0)

在不解析计算的情况下添加和删除括号将是一个很大的问题。 如果在用户输入上使用eval()是不安全的,否则应该没问题,但这里看起来有点过分了。

我会从微积分(标准AST树)构建一个树,然后在其中进行排列以产生错误的结果。

# Make tree from string
def parse(string):
    # implement
    return tree

# Make string from tree
def render(tree)
    # implement
    return string

# Compute result of tree
def compute(tree):
    # implement
    return integer

# Make wrong solutions with given tree
def getPermutations(tree)
    # implement
    return [tree]