【问题标题】:Python Divide by 0 ErrorPython 除以 0 错误
【发布时间】:2014-02-28 03:55:36
【问题描述】:

我目前正在使用这个 Python 代码:

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)

当用户执行以下操作时它会崩溃:9/0。错误:

ZeroDivisionError: division by zero

有哪些方法可以防止用户除以零?

【问题讨论】:

  • 所以这是 Python 3,其中input() 只返回用户输入的字符串,而您试图使用exec() 来评估用户输入的表达式?您的消息应该区分情况,否则您根本不知道正在执行哪个print 语句。
  • 我解决了这个问题,但感谢您告诉我
  • 答案现在没用了,整个帖子也没用了,以后没有人能从中受益,因为你已经把问题排除在外了。因此,将来看到此问题的任何人都无法知道问题是否与他们的问题相同。请将问题恢复到您的问题更明显的早期状态。

标签: python calculator


【解决方案1】:

你可以像这样除了ZeroDivisionError

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

如果您使用的是 Python 2.x,输入数据将在此处自行评估

y = input(" >> ")

所以,在 Python 2.x 中,您应该使用

y = raw_input(" >> ")

除此之外,您还可以改进这段代码

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

喜欢这个

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)

作为@gnibbler,在cmets部分建议,相同的if条件可以这样写

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

另一个建议是,在 Python 中不需要使用分号来标记行尾:)

【讨论】:

  • if any(c not in valid_chars for c in y): 是另一种说法
  • @gnibbler 在答案中也包含了这一点:)
  • 谢谢,但是当我添加您的代码行时,它可以工作,但会使除具有“/0”的方程式以外的所有内容都无用(这是在我添加了“else”命令之后,否则它不会工作)。当我输入“8 * 8”之类的内容时。 (这是在我添加“else”命令之后)它会给我: TypeError: exec() arg 1 must be a string, bytes or code object。我错过了什么吗?另外,我使用的是 Python 3.3.0。
  • @HelloWorld 你能编辑你的问题并包含更新的代码吗?
  • @HelloWorld 该代码对我来说很好用。你能告诉我到底是什么问题吗?
【解决方案2】:

用 try except 封装你的代码

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

原因是在设置 y 之前读取 input() 时正在评估它。因此异常是由于 input() 而发生的,必须用 try 捕获: .

【讨论】:

    【解决方案3】:

    真正的问题是您执行了两次exec()。第一次在您构造的字符串上执行它时,这 将 x 的值替换为您输入的表达式的结果。因此,您可能第二次尝试运行exec(64)。仔细看看try: ... except: ... else 周围的逻辑流程。

    最简单的解决方法是从

    x = "z="
    

    然后打印z 而不是x。这不应阻止您避免重复执行代码。

    【讨论】:

    • 是的,我意识到我正在执行 exec() 两次。已修复,谢谢(刚刚删除了第二个 exec())!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-06
    • 1970-01-01
    相关资源
    最近更新 更多