<p>下面是另一种不依赖<code>eval</code>的表达式生成器的方法,它还允许您轻松地使用任何二进制(2个参数)函数和任何顺序的操作:</p>
<pre><code>class Operation():
def __init__(self, func, precedence):
self.func = func
self.precedence = precedence
def __call__(self, *args):
return self.func(*args)
def __repr__(self):
return self.func.__name__
class Equation():
def __init__(self, numbers, operations):
self.nums = list(numbers)
self.ops = list(operations)
def eval(self):
while self.ops:
min_op_precedence = min([x.precedence for x in self.ops])
#get all pairs of numbers in the list [1,2,3] -> [(1,2), (2,3)]
for index, pair in enumerate(zip(self.nums, self.nums[1:])):
if self.ops[index].precedence == min_op_precedence:
#evaluate pair of numbers if the precedence for their op is highest
#ie "1 * 2 - 3" -> "2 - 3"
val = self.ops[index](*pair)
self.nums.pop(index)
self.nums[index] = val
self.ops.pop(index)
break
return self.nums.pop()
</code></pre>
<p>如果存在这样的排列(使用蛮力),您可以使用它来找出操作的排列会产生某种结果:</p>
^{pr2}$