Python Divide by 0 Error

2019-03-07 17:34发布

I am currently using this Python code:

valid_chars = "0123456789-+/* \n";
while True:
    x = "x="
    y = input(" >> ")
    x += y
    if False in [c in valid_chars for c in y]:
        print("WARNING: Invalid Equation");
        continue;
    if(y == "end"):
        break
    exec(x)
    print(x)

It crashes when the user does something like this: 9/0. Error:

ZeroDivisionError: division by zero

What are some ways that will prevent the user from dividing something by zero?

3条回答
Viruses.
2楼-- · 2019-03-07 18:16

You can except the ZeroDivisionError like this

x = "1/0"
try:
    exec(x)
except ZeroDivisionError:
    print ("WARNING: Invalid Equation")

If you are using Python 2.x, the input data will be evaluated here itself

y = input(" >> ")

so, in Python 2.x, you should be using

y = raw_input(" >> ")

Apart from that, you can improve this piece of code

if False in [c in valid_chars for c in y]:

like this

valid_chars = set("0123456789-+/* \n")    # We make this a set, because
if not all(c in valid_chars for c in y):  # c in valid_chars will be in O(1)

As @gnibbler, suggested in the comments section, the same if condition can be written like this

if any(c not in valid_chars for c in y):  # c in valid_chars will be in O(1)

Another suggestion would be, no need to use semi colons to mark the end of line in Python :)

查看更多
仙女界的扛把子
3楼-- · 2019-03-07 18:22

The real problem is that you are executing exec() twice. The first time you execute it on the string you have constructed, and this replaces the value of x with the result of your entered expression. So the second time you are presumably trying to run exec(64). Look more carefully at the logic flow around try: ... except: ... else.

The simplest fix is to start with

x = "z="

and then print z rather than x. This should not stop you working to avoid the duplicated execution of your code.

查看更多
我命由我不由天
4楼-- · 2019-03-07 18:34

encapsulate your code with a try except

try:
  y = input(" >> ")
except Exception as exc:
  # process exception here

The reason is the input() is being evaluated as it is read in before y is set. Thus the exception occurs because of the input() and must be caught with the try: .

查看更多
登录 后发表回答