我想知道是否有办法打印每个步骤,考虑到python遵循PEMDAS 1 。我是否可以在不构建自己的库的情况下打印出解决此问题的每一步?
print_steps('(3+7-2)*4/(3+32)')
1 括号,指数,乘法和除法,以及加法和减法
答案 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