Python运算符
我在过去几天学习Python,我已经编写了这段代码来计算后缀表达式Python运算符,python,operators,Python,Operators,我在过去几天学习Python,我已经编写了这段代码来计算后缀表达式 postfix_expression = "34*34*+" stack = [] for char in postfix_expression : try : char = int(char); stack.append(char); except ValueError: if char == '+' : stack.append(st
postfix_expression = "34*34*+"
stack = []
for char in postfix_expression :
try :
char = int(char);
stack.append(char);
except ValueError:
if char == '+' :
stack.append(stack.pop() + stack.pop())
elif char == '-' :
stack.append(stack.pop() - stack.pop())
elif char == '*' :
stack.append(stack.pop() * stack.pop())
elif char == '/' :
stack.append(stack.pop() / stack.pop())
print stack.pop()
有没有办法避免那个巨大的if-else障碍?如中所示,是否有模块采用字符串形式的数学运算符并调用相应的数学运算符或某种python惯用语来简化此操作?该模块具有实现标准算术运算符的函数。使用该选项,您可以设置如下映射:
OperatorFunctions = {
'+': operator.add,
'-': operator.sub,
'*': operator.mul,
'/': operator.div,
# etc
}
然后,主循环可以如下所示:
for char in postfix_expression:
if char in OperatorFunctions:
stack.append(OperatorFunctions[char](stack.pop(), stack.pop()))
else:
stack.append(char)
您需要注意确保要进行减法和除法的操作数以正确的顺序从堆栈中弹出。只需与字符串生成一起使用:
postfix_expression = "34*34*+"
stack = []
for char in postfix_expression:
if char in '+-*/':
expression = '%d%s%d' % (stack.pop(), char, stack.pop())
stack.append(eval(expression))
else:
stack.append(int(char))
print stack.pop()
编辑:制作了一个没有异常处理的更好的版本。来自JS背景:Python中的eval()和JavaScript中的eval()一样差/慢吗?我不知道慢。如果不小心使用,它可能是危险的(即不安全的),但在这里它是完全安全的,因为所有输入都经过检查(整数或有限的字符集)。@Boldewyn:eval通常比利用Python动态特性的等效解决方案慢,因为每次eval()解析和编译时都会有大量开销被称为。查字典和使用操作员模块函数(OperatorFunctions[“+”](2,2))比使用eval(eval(“2+2”))快60倍左右。很酷,谢谢你的回答!所以它和JS中的完全一样。。。(关于安全和速度)@过于热心的编辑:“dispatcher”是“dispatcher”的公认替代品(尽管据称不太常见)。我已回滚您的编辑。请别管它。@John:这是“英式英语”和“美式英语”中的一种吗?@PTBNL:我不知道。FWIW:谷歌点击率(百万,3个数字):dispatch 8.25,dispatch 34.6,dispatcher 8.42,dispatcher 7.98。有趣的反转。仅供参考-
操作符
功能似乎非常慢。%timeit 1+3
-给出12.5ns,而%timeit操作符。添加(1,3)
给出101ns(慢9倍:o)
[untested]
from operator import add, sub, mul, div
# read the docs; this is a tiny part of the operator module
despatcher = {
'+': add,
'-': sub,
# etc
}
opfunc = despatcher[op_char]
operand2 = stack.pop()
# your - and / are bassackwards
stack[-1] = opfunc(stack[-1], operand2)