<p>最简单的方法是创建从符号到函数的映射。你知道吗</p>
<p>唯一的问题是,<code>+</code>运算符背后的函数是什么?你知道吗</p>
<p>答案在<a href="https://docs.python.org/3/library/operator.html#mapping-operators-to-functions" rel="nofollow">^{<cd2>}</a>模块中:<code>a + b</code>是<code>operator.add(a, b)</code>,依此类推。所以:</p>
<pre><code>import operator
symbols = {
'+': operator.add,
'-': operator.sub,
'*': operator.mul,
'/': operator.floordiv
}
</code></pre>
<p>我在这里假设你希望<code>100 / 3</code>是<code>33</code>,而不是<code>33.333333333333336</code>。如果我错了,用<code>truediv</code>代替上面的<code>floordiv</code>。(请参阅教程中的<a href="https://docs.python.org/3/tutorial/introduction.html#numbers" rel="nofollow">Numbers</a>以了解差异的介绍,并提供指向更多详细信息的链接。)</p>
<p>不管怎样,现在,你可以这样做:</p>
<pre><code>answer = symbols[symbol](num1, num2)
</code></pre>
<hr/>
<p>即使没有<code>operator</code>,也可以为每个操作符构建一个函数:</p>
<pre><code>symbols = {
'+': (lambda a, b: a + b),
'-': (lambda a, b: a - b),
'*': (lambda a, b: a * b),
'/': (lambda a, b: a // b)
}
</code></pre>
<p>如果您想将您的语言扩展到Python中没有匹配运算符的符号,这可能很有用。你知道吗</p>
<hr/>
<p>如果您的数学语言是Python表达式语言的一个严格子集(可能没有注意到符号<code>'/'</code>映射到Python运算符<code>//</code>,如果您想要整数),并且您确信您永远不会以一种不需要的方式扩展它(例如,使用<code>^</code>进行指数运算),而且您肯定永远不会使用您自己没有生成的任何数字或符号,只构建一个Python表达式并<a href="https://docs.python.org/3/library/functions.html#eval" rel="nofollow">^{<cd14>}</a>它可能更简单:</p>
<pre><code>expr = '{} {} {}'.format(num1, symbol, num2)
answer = eval(expr)
</code></pre>
<p>但是,在使用<code>eval</code>时,您应该始终小心;如果要做的干净的事情足够简单,您可以编写、阅读并稍后理解,那么它几乎总是一个更好的答案。你知道吗</p>