2016-07-01 3 views
1

die Aufgabe wurde in codecademy Practice Makes Perfect digit_sum diskutiertPython Codecademy digit_sum

Wo Sie die Ziffern einer positiven Zahl summieren müssen. Ich benutze den String Weg, um die Aufgabe zu entscheiden (nicht die Teilung).

Mein Code ist

def digit_sum (n): 
    total = 0 
    for digit in range(len(str(n))): 
     total += int(n[digit]) 
    return total 

number = raw_input("Please print a long number: ")  
print digit_sum(number) 

Es alles in Ordnung und mit 1001 arbeitet wie mit 434.

jedoch das Programm sagt: Hat Ihre digit_sum Funktion übernimmt genau ein Argument (eine positive ganze Zahl) ? Ihr Code hat ein "int" -Objekt geworfen hat kein Attribut 'getitem' "Fehler.

Was kann falsch sein, wenn der Code funktioniert?

Danke!

+0

Du hast mich dazu geschlagen! – alfonso

+1

Ihr Programm ist in Ordnung. Möglicherweise versucht der Prüfer zu verifizieren, dass die Eingabe für "digit_sum" eine tatsächliche Ganzzahl anstelle einer Zeichenfolge ist. Versuchen Sie, die letzte Zeile zu 'print digit_sum (int (number)) 'zu ändern und sehen Sie, wie das geht. (Du gibst später sowieso 'str' aus, obwohl du beim' n [digit] '' noch einmal casten musst, da das jetzt nicht funktioniert.) – Evert

+0

Wenn dein "n" eine ganze Zahl ist, dann 4. Zeile 'n [Ziffer]' ist falsch - Sie können eine ganze Zahl nicht indizieren, Sie müssen sie zuerst in eine Zeichenkette umwandeln. es gibt gute Beispiele wie man das schneller und schöner macht unter – Jerzyk

Antwort

1

Sie nicht das n-String konvertieren, so dass, wenn Sie n nennen [i] wird es Ausnahme

def digit_sum(n): 
    return sum( int(i) for i in str(n)) 
+1

Keine Notwendigkeit für die Klammern; 'sum' nimmt einen Generatorausdruck, der, wenn es das einzige Argument für eine Funktion ist, den Funktionsaufruf parens wiederverwendet:' sum (int (i) für i in str (n)) '. Oder für zusätzliche Geschwindigkeit (nur weil 'int' eine eingebaute Funktion ist; normalerweise ist' map' langsamer als listcomp/genxpr), 'sum (map (int, str (n)))'. – ShadowRanger

+0

@ShadowRanger zustimmen. danke – galaxyan

+0

@galaxyan, 'raw_input' bietet eine Zeichenfolge. Was ist nötig, um es wieder in eine Zeichenkette umzuwandeln? Auch der OP-Code funktioniert einwandfrei. – SilentMonk

0

Evert, Jerzyk, Galaxian, danke für die Kommentare zu erhöhen. Danke für dich, ich habe es gesehen: Ich habe nur an einer Stelle (3. Zeile) n zu strassen und dachte, das sei genug, da die 4. Zeile innerhalb der for-Schleife ist. Ich bearbeitete den Code zu

def digit_sum (n): 
    total = 0 
    n = str(n) 
    for digit in range(len(n)): 
     total += int(n[digit]) 
    return total 

number = int(raw_input("Please print a long number: "))  
print digit_sum(number) 

Und jetzt funktioniert es!

Galaxian, ShadowRanger, danke für deinen Kurzcode, ich habe es ausprobiert und es ist in Ordnung! Ich habe noch nicht diese kurze Art der Codierung gefangen. Nebenbei habe ich nach Informationen über die Kartenfunktion gesucht und folgendes gefunden: explanation on zip, map, lyambda

+0

FYI, 'für Ziffer im Bereich (len (n)):' dann Indexierung 'n' ist eine C-Art, Dinge zu tun, überhaupt nicht Pythonic. Iterieren Sie einfach 'n' und vermeiden Sie die Indizierung. 'für dig in n: total + = int (dig)' – ShadowRanger