将数学表达式分解为步骤

时间:2016-12-02 19:12:19

标签: python python-2.7

我想知道是否有办法打印每个步骤,考虑到python遵循PEMDAS 1 。我是否可以在不构建自己的库的情况下打印出解决此问题的每一步?

print_steps('(3+7-2)*4/(3+32)')

1 括号,指数,乘法和除法,以及加法和减法

2 个答案:

答案 0 :(得分:2)

"图书馆"可以很轻量级:

class verbose_number:
    def __init__(self, value): self.value = value
    def operate(self, operator, other):
        other = getattr(other, 'value', other)
        result = eval('self.value %s other' % operator)
        print('%r %s %r = %r' % (self.value, operator, other, result))
        return self.__class__(result)
    def __add__(self, other): return self.operate('+', other)
    def __sub__(self, other): return self.operate('-', other)
    def __mul__(self, other): return self.operate('*', other)
    def __div__(self, other): return self.operate('/', other)
    def __floordiv__(self, other): return self.operate('//', other)
    def __truediv__(self, other): return self.operate('/', other)
    def __pow__(self, other): return self.operate('**', other)
    def __mod__(self, other): return self.operate('%', other)
    def __neg__(self): return self.__class__(-self.value)
    def __pos__(self): return self.__class__(+self.value)
    def __repr__(self): return repr(self.value)
    def __int__(self): return int(self.value)
    def __float__(self): return float(self.value)

现在,任何涉及verbose_number实例的算术计算都会被打印并返回另一个verbose_number,因此计算将逐步打印:

>>> from __future__ import division
>>> (verbose_number(3)+7-2)*4/(3+32)
3 + 7 = 10
10 - 2 = 8
8 * 4 = 32
3 + 32 = 35
32 / 35 = 0.9142857142857143

请注意,这取决于我在表达式verbose_number中创建了第一个数字。该方法的一个改进是编写一个方便的例程来解析字符串表达式:

import re
def print_steps(expression):
    return eval(re.sub(r'([0-9\.]+([eE]-?[0-9]+)?)', r'verbose_number(\1)', expression))

这可以通过将字符串中的每个数字文字转换为verbose_number构造函数调用,从而确保所有步骤都是冗长的,无论Python在哪里&# 39; s解析器在表达式中开始。以下是如何使用它来评估您的示例:

>>> print_steps('(3+7-2)*4/(3+32)')
3 + 7 = 10
10 - 2 = 8
8 * 4 = 32
3 + 32 = 35
32 / 35 = 0.9142857142857143

答案 1 :(得分:1)

不。甚至dis.dis都不会显示单个步骤,因为在编译为字节码之前,它们都被简化为单个常量。

>>> def f():
...     return (3+7-2)*4/(3+32)
...
>>> import dis
>>> dis.dis(f)
  2           0 LOAD_CONST              10 (0.9142857142857143)
              3 RETURN_VALUE