Seite 1 von 1

Einrückung und return

Verfasst: Montag 17. Dezember 2007, 18:43
von DocFisher
Hallo,
ich bin gerade dabei, python kennen zu lernen. Beim herumprobieren bin ich auf ein "Problem gestoßen:

Ich möchte (Aufgabe 4, Kapitel 4 aus M. Weigands Buch Obj. orientierte ... mit Python) die Prüfsumme einer ISBN Nummer berechnen. Sie setzt sich folgerndermaßen zusammen:

ISBN = 10 Zahlen, die zehnte berechnet sich aus den Zahlen 1-9 nach der Formel:

Pruefziffer = (1*Z1 + 2*Z2 + ... 9*Z9) % 11

meine erste Herangehensweise war:

Code: Alles auswählen

def berechne_pruefziffer(ISBN):    
    z = 1
    ps = 0
    for i in ISBN:
        s = z * int(i)
        z += 1
        ps += s
    pz = ps % 11
    return pz
Dabei wird aber eine (lt. Buch) falsche Prüfziffer pz zurückgegeben. Erst wenn ich

Code: Alles auswählen

pz = ps % 11
in die "for-Schleife" setzte, wird mir die passende Prüfsumme geliefert.

Warum?!?

Über Tipps freue ich mich, ich stehe auf dem Schlauch....

Danke und Gruß, Jens

Verfasst: Montag 17. Dezember 2007, 18:51
von BlackJack
Vielleicht enthält das Buch einen Fehler? Die richtige Formel für eine ISBN-10-Prüfziffer ist das jedenfalls nicht. Die lautet 11 - (10*z2 + 9*z2 + 8*z3 + … + 2*z9) % 11. Und falls dabei 10 heraus kommt ist die Prüf"ziffer" ein 'X'.

Verfasst: Montag 17. Dezember 2007, 18:57
von Leonidas
Kann es sein, dass du die ISBN 10-stellig übergibst? Du musst von der ISBN-10 natürlich nur die ersten neun Stellen aufsummieren, die zehnte ist ja zu berechnen ;)

Wenn man deiner Lösung nur 9 Ziffern übergibt, stimmt es nämlich.

Allerdings finde ich meine Lösung simpler - man muss sie ja nicht in einer Zeile schreiben.

Code: Alles auswählen

sum((i + 1) * int(z) for i, z in enumerate('382661589')) % 11
Was passiert da? Enumerate gibt einen Positions-Zähler und den Wert zurück. Der Zähler beginnt mit 0, also muss man immer + 1 rechnen. Dieser Zähler wird dann mit dem Integer-wert der Ziffer multipliziert und in eine Liste angefügt (in diesem Fall eher ein Generator, aber mit Listen funktioniert es analog).

Die Liste sieht dann so aus:

Code: Alles auswählen

print [(i + 1) * int(z) for i, z in enumerate('382661589')]
Dann summiert ``sum()`` alle Werte zusammen und das wird dann Modulo 11 genommen.

Aaargh, gelöst

Verfasst: Montag 17. Dezember 2007, 19:00
von DocFisher
Also, vielleicht stimmt die Buchdefinition nicht. Ich zitiere:
Eine ISBN besteht aus zehn Ziffern z1z2z3z4z5z6z7z8z9z10. Die letzte Ziffer z10 ist eine Prüfziffer. Sie berechnet sich wie folg: Zuerst wird eine Art quersumme nach folgender Formel gebildet:
s = 1*z1 + 2*z2 + 3*z3 + ... + 9*z9
Die Prüfziffer z10 ist der Rest der ganzzahligen Division von s durch 11. Für den Rest 10 wird x oder X geschrieben.
Beispiel: Für die ISBN 3826604237 lautet die Prüfziffer 7.
Wenn ich pz = ps % 11 in der for-Schleife habe, erhalte ich die 7. Wenn ich es allerdings wie in obigem Code schreibe, erhalte ich eine .....

Sag mal, mich laust der Affe. Jetzt passt es?!?

Wahrscheinlich habe ich mich vorhin mehrmals gleich vertippt. Ärgerlich.

Entschuldigt die unnötige Frage!

Und Danke für die prompte Antwort!

Einen schönen Abend Euch!

Gruß, Jens

Verfasst: Montag 17. Dezember 2007, 19:02
von DocFisher
Hallo leonidas.

Deine Lösung schaue ich mir später mal genauer an, muss jetzt leider los.
Auf die "10er" Nummer bin ich anfangs reingefallen, aber nach 2 Versuchen war das klar. Was ich aber danach verbockt habe, bleibt mir ein Rätsel....

Gruß und Dank!

Verfasst: Montag 17. Dezember 2007, 19:09
von BlackJack
Ob man nach jedem Schritt modulo 11 rechnet oder erst am Schluss dürfte auch keinen Unterschied machen.