2017-04-08 5 views
1

Ich habe eine Klasse namens Bootcamp erstellt, die es Benutzern ermöglicht, abgeschlossene Aufgaben hinzuzufügen, alle Aufgaben anzuzeigen, die sie ausführen sollen, und auch ihre unvollständigen Aufgaben zu überprüfen. Die Frage ist, ich habe einen Algorithmus erstellt, um den Fortschritt in Prozent zu überprüfen, wobei ich die Länge der vollständigen Liste über die Länge der gesamten Aufgabenlisten dividiere. Ich dachte zuerst, dass es die Änderungen nicht aufzeichnet, da es immer Null zurückgibt, aber nach dem Testen mit anderen Operanden wie + und * funktioniert es gut. Warum gibt Division immer 0 zurück? Den Code zu teilen würde helfen, mein Problem zu verstehen:Python-Klasse/immer 0 zurück

class Bootcamp(object): 
    tasks = {1: "TDD", 2: "OOP", 3: "Programming Logic", 4: "Version 
      Control", 5: "Agile Methodology", 
         6: "Growth Mindset", 7: "Asking Questions", 8: 
        "Motivation and Commitment", 9: "Speaking"} 
    def __init__(self, name, tasks=tasks): 
     self.name = name 
     self.tasks = tasks 
     self.completed = [] 
     self.incompleted = tasks.values() 

    def add_completed_items(self, i): 
     if i in self.tasks.keys(): 
      self.completed.append(self.tasks[i]) 
      self.incompleted.remove(self.tasks[i]) 
      return "tasks added to complete" 
     else: 
      return "not in the tasks" 


nick = Bootcamp("nick") 
total_work = int(len(nick.tasks)) 
print nick.add_completed_items(1) 
print nick.add_completed_items(2) 
print nick.add_completed_items(3) 
comleted_work = int(len(nick.completed)) 
progress = (comleted_work/total_work) * 100 
print nick.incompleted` 
print progress` 

Antwort

1

Ich denke, es ist einfach. Sie versuchen, ein int durch ein anderes int zu teilen, das ist das Problem. Python führt Integer-Division in diesem Fall, und Sie versuchen, durch einen größeren einen geringeren int zu teilen, natürlich sollte man 0 fast immer erhalten (außer wenn die Ints gleich sind)

ersetzen int s mit float s, wie diese

total_work = float(len(nick.tasks)) 
... 
comleted_work = float(len(nick.completed)) 

und das Problem sollte

+0

es funktionierte gelöst werden ..... es gab mir eine Menge Kopfschmerzen, da ich mir dachte Methode nicht funktionierte. Jetzt kann ich es innerhalb der Klasse implementieren – Nix

+0

Etwas bessere Lösung: Wechseln Sie in Py3 Stil-Division durch Hinzufügen von "von __future__ Import Division" an den Anfang der Datei. Dann wird '/' Fließkomma-Ergebnisse erzeugen. Wenn Sie eine Unterteilung nach dem Grund haben möchten, verwenden Sie '//', um sich explizit anzumelden. – ShadowRanger