返回信息流一个简单的栈问题,
Some examples:
["2", "1", "+", "3", "*"] -> ((2 + 1) * 3) -> 9
["4", "13", "5", "/", "+"] -> (4 + (13 / 5)) -> 6
,开始的时候用字典匹配的四个运算符,结果有除零错误,用pdb调试了一下没有看见哪里有出错,然后就异常了。
后来改成ifelse就没有问题。。。
晕死。
谁能帮我看一下
#! /usr/bin/python
# -*- coding: utf-8 -*-
import pdb
def evalRPN(tokens):
tempList = []
for i in tokens:
if i in '+-*/':
v = int(tempList.pop())
w = int(tempList.pop())
print "push" + str(w) + i + str(v)
pdb.set_trace()
tempList.append({'+': (v + w), '-': (w - v), '*': (v * w), '/': (w / v)}[i])
#if i == '+':
# tempList.append(w + v)
#elif i == '-':
# tempList.append(w - v)
#elif i == '*':
# tempList.append(w * v)
#elif i == '/':
# tempList.append(w / v)
else:
tempList.append(i)
return tempList[0]
这是一条镜像帖。来源:北邮人论坛 / python / #3964同步于 2014/11/2
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Python机器人发帖
求帮忙看一个问题,为什么会有除0错误
json123
2014/11/2镜像同步5 回复
订阅后,新回复会通过你的通知中心匿名送达。
5 条回复
【 在 kelvin4617 的大作中提到: 】
: 你用的int 会除出0来 当v变成0之后 建字典那里w/v就异常了
之前的用例是这个
["-78","-33","196","+","-19","-","115","+","-","-99","/","-18","8","*","-86","-","-","16","/","26","-14","-","-","47","-","101","-","163","*","143","-","0","-","171","+","120","*","-60","+","156","/","173","/","-24","11","+","21","/","*","44","*","180","70","-40","-","*","86","132","-84","+","*","-","38","/","/","21","28","/","+","83","/","-31","156","-","+","28","/","95","-","120","+","8","*","90","-","-94","*","-73","/","-62","/","93","*","196","-","-59","+","187","-","143","/","-79","-89","+","-"]
trace的时候没有发现除零,但是报了异常。。
tempList.append({'+': (v + w), '-': (w - v), '*': (v * w), '/': (w / v)}[i])
这一行会无条件地先把v+w, v-w, v*w, v/w都算出来,再根据i选择其中一个压上去。
所以,即使是3 0 +,它也会先算出3+0,3-0,3*0,3/0,然后选3+0的结果,当然,在选之前,就先报除0错误了。
试试这样:
ops = {
"+": lambda x,y:x+y,
"-": lambda x,y:x-y,
"*": lambda x,y:x*y,
"/": lambda x,y:x/y,
}
a = 3
b = 0
c = "+"
op = ops[c]
result = op(a,b)
# result = ops[c](a,b) # 这样一步也行
原来是这样,暖神一语道破问题所在,是说用pdb调试的时候完全不知道为什么就报错了。
【 在 nuanyangyang 的大作中提到: 】
: : tempList.append({'+': (v + w), '-': (w - v), '*': (v * w), '/': (w / v)}[i])
:
: ...................