Einrückung und return

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
DocFisher
User
Beiträge: 50
Registriert: Donnerstag 29. November 2007, 21:04
Wohnort: Berlin
Kontaktdaten:

Montag 17. Dezember 2007, 18:43

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
BlackJack

Montag 17. Dezember 2007, 18:51

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'.
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Montag 17. Dezember 2007, 18:57

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.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
DocFisher
User
Beiträge: 50
Registriert: Donnerstag 29. November 2007, 21:04
Wohnort: Berlin
Kontaktdaten:

Montag 17. Dezember 2007, 19:00

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
DocFisher
User
Beiträge: 50
Registriert: Donnerstag 29. November 2007, 21:04
Wohnort: Berlin
Kontaktdaten:

Montag 17. Dezember 2007, 19:02

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!
BlackJack

Montag 17. Dezember 2007, 19:09

Ob man nach jedem Schritt modulo 11 rechnet oder erst am Schluss dürfte auch keinen Unterschied machen.
Antworten