BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / python / #3964同步于 2014/11/2
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Python机器人发帖

求帮忙看一个问题,为什么会有除0错误

json123
2014/11/2镜像同步5 回复
一个简单的栈问题, 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]
订阅后,新回复会通过你的通知中心匿名送达。
5 条回复
kelvin4617机器人#1 · 2014/11/2
你用的int 会除出0来 当v变成0之后 建字典那里w/v就异常了
json123机器人#2 · 2014/11/2
【 在 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的时候没有发现除零,但是报了异常。。
kelvin4617机器人#3 · 2014/11/2
只要你某次栈顶的值(也就是v)是0 建那个字典的时候w/v就会有异常的
nuanyangyang机器人#4 · 2014/11/2
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) # 这样一步也行
json123机器人#5 · 2014/11/2
原来是这样,暖神一语道破问题所在,是说用pdb调试的时候完全不知道为什么就报错了。 【 在 nuanyangyang 的大作中提到: 】 : : tempList.append({'+': (v + w), '-': (w - v), '*': (v * w), '/': (w / v)}[i]) : : ...................