【问题标题】:"ZeroDivisionError: division by zero"“ZeroDivisionError:除以零”
【发布时间】:2018-10-04 21:55:05
【问题描述】:

我是一名使用 Python3.6 的初学者,我不知道为什么我的代码不能正常工作。非常感谢您的反馈/帮助。

我对DriveTo功能的说明如下:

现在,添加一个 Car 方法 driveTo。它应该采用两个附加参数,即汽车尝试移动的位置的 x 和 y 坐标。如果汽车有足够的汽油来行驶,则应该移动汽车,更新剩余的汽油量,并且该方法应该返回 True。如果汽车没有足够的油,根本不应该移动或改变它,并且该方法应该返回False

这是我当前的代码:

import math 

class Car:
    def __init__( self , mpg , fuel , money ):
        self.mpg = mpg
        self.fuel = fuel
        self.money = money

    #return current location of car in two element list
    def getLocation( self ):
        return [ self.x , self.y ]

    #returns the number of gallons left in the car 
    def getGas( self ):
        self.fuel -= 1
        return self.fuel

    #returns how much gas the car needs to be at capacity 
    def getToFill( self ):
        current_tank =  self.getGas() 
        gas_needed = ( self.fuel - current_tank )
        return gas_needed

    #return true or false if enough gas
    def driveTo( self , x , y ):
        self.x = x
        self.y = y
        miles_pg = (self.mpg / self.getToFill())
        miles = math.sqrt( ( self.x - x )**2 + ( self.y - y )**2 )



        if miles >= miles_pg:
            return True
        else:
            return False

【问题讨论】:

  • 你能补充一下你如何测试代码
  • 你能指定哪一行出现错误吗?
  • 将整个堆栈跟踪放在问题中。它向您(和我们)准确显示错误发生的位置,然后可以追溯这些值以查看错误的位置。
  • 如果self.fuel 等于current_tank...
  • 我正在使用 Mac 的终端测试代码,错误特别是第 29 行“文件“car.py”,第 29 行,在 driveTo miles_pg = (self.mpg / self.getToFill()) "

标签: python class python-3.6


【解决方案1】:

您的主题说您得到了除以零的错误。我在您的代码中只看到一个除法操作(尽管可能还有其他间接操作):

miles_pg = (self.mpg / self.getToFill())

如果self.getToFill() 返回 0,您将收到 ZeroDivisionError。当没有气体可以填充时,究竟应该发生什么,我不知道。但是你需要处理它。

【讨论】:

    【解决方案2】:

    getToFill() 中,您返回gas-needed,它等于self.fuel - current_tankcurrent_tank 得到在getGas() 中定义,它返回self.fuel,因此gas_needed = 0。

    所以miles_pg = (self.mpg / self.getToFill()) 返回错误,getToFill() 返回 0。

    【讨论】:

      【解决方案3】:

      好吧,只有一行代码在 driveTo() 中执行除法运算:

      miles_pg = (self.mpg / self.getToFill())
      

      如果您希望它永远不会引发错误,您需要捕获并处理可能的异常,或者确保 getToFill() 函数永远不会返回值 0。

      作为一般性评论,我真的不知道这个类的功能或要求是什么,但从我的角度来看,大多数这些功能并没有真正的逻辑意义。比如为什么 getGas() 函数会从燃料值中减去一加仑?该功能试图模拟什么?查看函数上方的注释,我认为它应该只返回燃料的值,而不是其他任何东西。

      此外,你在做什么来计算 driveTo() 中的剩余燃油里程?这对我来说没有任何数学意义。如果我有 MPG 和汽车的总燃油加仑数,我会这样计算剩余燃油里程:

      miles_left_until_out_of_fuel = self.mpg * self.fuel
      

      想一想,如果我的油箱里还剩 2 加仑,并且我知道我的车能达到 20 MPG,那么我将有 2 * 20 = 40 英里的路程,直到我用完燃料。

      【讨论】:

        【解决方案4】:

        您能否提供带有错误消息的输出日志。看起来您的 getToFill() 方法在某些时候返回零。一个快速的解决方案是在执行miles_pg = (self.mpg / self.getToFill()) 之前检查它是否不返回零。

        【讨论】:

        • 我很乐意为您提供,但我不确定如何提供。
        • 首先尝试检查getToFill()返回的值是否为零。如果为零,则做其他事情,即抛出异常或返回。
        【解决方案5】:

        你不检查是否还有气体。

        因此,如果 getToFill() 返回 0,则 self.mpg / gas 将返回 ZeroDivisionError: division by zero

        def driveTo( self , x , y ):
            self.x = x
            self.y = y
            gas = self.getToFill()
            if gas <= 0:
                # No more gas
                return False
            miles_pg = (self.mpg / gas)
            miles = math.sqrt( ( self.x - x )**2 + ( self.y - y )**2 )
        

        【讨论】:

        • 我试过了,但它仍然显示“ZeroDivisionError:除以零。”
        • @mafertes 好吧,那是不可能的。我还在发布之前对此进行了测试,验证它是否有效。
        • 你是对的!它有效,但不幸的是它仍然不正确。显然测试没有通过,在测试过程中,我的车离预期位置有 0.001 英里或更多英里。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-03
        • 2022-11-23
        • 1970-01-01
        • 1970-01-01
        • 2017-12-23
        相关资源
        最近更新 更多