2017-03-07 125 views
0

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

我对DriveTo功能说明如下:

现在,添加一个汽车方法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 
+0

您可以添加如何测试代码 – Vallentin

+1

您可以指定哪条线发生错误? –

+0

将整个堆栈跟踪放入问题中。它会向您(和我们)显示您的错误发生的确切位置,然后可以向后追溯这些值以查看错误发生的位置。 – skrrgwasme

回答

1

getToFill()返回gas-needed,这是等于self.fuel - current_tankcurrent_tank GET在getGas()定义,它返回self.fuel,从而gas_needed = 0

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

0

你不检查是否有留下任何气体。

因此,如果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) 
+0

我试过这个,但它仍然说”ZeroDivisionError:零除“。 –

+0

@mafertes那是不可能的。我也在发布之前对其进行了测试,验证它是否有效。 – Vallentin

+0

你是对的!它有效,但不幸的是它仍然不正确。显然,测试没有通过,测试过程中我的车在距离预期位置超过.001英里或更远的地方。 –

1

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

+0

我很乐意为你提供,但我不知道如何。 –

+0

首先尝试检查'''getToFill()'''返回的值是否为零。如果它为零,则执行其他操作,即抛出异常或返回。 –

+0

你说得对,getToFill()总是返回0。 –

2

你的主题说你得到一个除零误差的分割。我只看到一个除法运算在你的代码(虽然可能有其他间接的):

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

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

1

那么有代码只有一行在其中执行除法运算,在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英里,直到我耗尽燃料。