【问题标题】:Evaluation for math expression gone wrong : python数学表达式的评估出错了:python
【发布时间】:2017-05-08 04:48:55
【问题描述】:

我采用了一个函数来评估由数字和数学表达式组成的字符串列表,但我无法得到预期的结果。 例如:5+2-3+2 = 6

基本上,该函数首先将结果初始化为第一个数字输入 (Inp) 的值。然后它将从左到右的操作应用于当前结果,依此类推,直到获得最终结果。 下面是脚本。

Inp = ["5","+","2","-","3","+","2"]

result = Inp [0]
for i in range (1, len(Inp), 2):
    op = Inp [i]
    nextValue = Inp [i + 1]
if op == '+':
    result += nextValue
elif op == '-':
    result -= nextValue
return result

【问题讨论】:

    标签: python math iterator iteration


    【解决方案1】:

    您的代码中有几个问题。

    1) 您将Inp 的第一个元素作为result。但是Inp[0] 基本上是一个字符串。所以在赋值之前将其转换为整数。

    2) ifelse 应该在 for 循环内。缩进不正确。

    3) ifelse 中的语句与 1 相同的问题

    4) 没有功能(根据您给定的代码)。无需返回。如果它确实是一个函数并且这是一个最小版本,那么就可以了。

    那么正确的代码将是-

    Inp = ["5","+","2","-","3","+","2"]
    
    result = int(Inp [0])
    for i in range (1, len(Inp), 2):
        op = Inp [i]
        nextValue = Inp [i + 1]
        if op == '+':
            result += int(nextValue)
        elif op == '-':
            result -= int(nextValue)
    
    print result
    

    ifelse 中,您可能需要检查nextValue 是否确实是一个数字

    还有其他方法可以做你想做的事。我只是指出了错误并将您的代码更改为功能代码。

    【讨论】:

      【解决方案2】:

      我想一个简单的方法是让第一个操作数不碍事,然后两个人循环遍历列表。别忘了,你必须将值从字符串转换为整数,否则 5+2 将是 52 而不是 7:

      data = ["5","+","2","-","3","+","2"]
      result = int(data[0])
      
      for op, n in zip(data[1:][::2], data[1:][1::2]):
         if op == '+':
           result += int(n)
         if op == '-':
           result -= int(n)
      
      print(result)
      

      核心思想是for循环。它通过使用切片来工作:

      • data[1:] 这是您的初始列表,减去第一个元素(我们已经使用过)
      • [::2] 表示“所有其他元素”
      • [1::2] 表示“所有其他元素,但跳过第一个”

      我们zip()这两个列表得到一对操作符和操作数,像这样:

      >>> for a in zip(data[1:][::2],data[1:][1::2]):
      ...   print(a)
      ...
      ('+', '2')
      ('-', '3')
      ('+', '2')
      

      这是一种安全的遍历列表的方式,因为我们不必担心循环超出列表的末尾。

      其余逻辑与您的相同,只是您忘记将值转换为整数。

      【讨论】:

        【解决方案3】:

        这段代码有几个问题:首先你有一些缩进问题。 for 循环内的所有内容都应缩进一个空格。 其次,除非您在函数内部,否则 return 语句不起作用。这里没有函数定义,所以你能做的最好的就是打印它。最后,您在引号中使用数字,例如“5”,它将 5 转换为字符串,而不是将其视为数字。这是一个有效的版本:

        Inp = [5,"+",2,"-",3,"+",2]
        
        result = Inp [0]
        for i in range (1, len(Inp), 2):
            op = Inp [i]
            nextValue = Inp [i + 1]
            if op == '+':
                result += nextValue
            elif op == '-':
                result -= nextValue
        
        print(result)
        

        【讨论】:

          【解决方案4】:
          Inp = ["5","+","2","-","3","+","2"]
          def f(Inp):
           result = int(Inp [0])
           for i in range (1, len(Inp), 2):
              op = Inp [i]
              nextValue = int(Inp [i + 1])
              if op == '+':
                  result += nextValue
              elif op == '-':
                  result -= nextValue
           return result
          
          print(f(Inp))
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-06-30
            • 1970-01-01
            • 2010-12-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多