Fakultät berechnen, Schleifenfehler

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
Mio
User
Beiträge: 1
Registriert: Sonntag 26. Februar 2017, 17:49

Hallo Python-Gemeinde.
vorab, ich bin kein Schüler oder Informatikstudent, sondern einfach privat am Programmieren interessiert und habe mich vorgestern durchgerungen damit anzufangen und mich für Python entschieden.
Ich arbeite mich nun durch das offene Handbuch von Peter Kaiser und Johannes Ernesti, welches ich zur freien Verfügung fand.

Bei der persönlichen Ausarbeitung eines Beispiels zu Schleifen, mit dem Inhalt der Fakultätsberechnung, komm ich partout nicht weiter:
Das Programm will mir meine Faukltät einfach nicht berechnen..

Anbei mein Code, würde mich freuen wenn sich wer von euch durchringen könnte, mir zu erklären warum das nicht funktioniert..

Code: Alles auswählen

# Fakultätsberechnung
print "ich berechne dir, wenn du willst, die Fakultaet einer beliebigen Zahl!"
print "Beenden des Programms durch Eingabe der Ziffer 0"
zahl = 1
ergebnis = 1
while True:
    zahl = input("Zahl eingeben: ")
    ausgang = zahl
    if isinstance(zahl, basestring):
        print "Bitte eine Zahl eingeben"
        continue
    if zahl < 0:
        print "Fakultäten negativer Zahlen können nicht berechnet werden!"
        continue
    if zahl == 0:
        break
    while zahl > 0:
        ergebnis = ergebnis * zahl
        zahl = zahl - 1
    print "Ergebnis: Die Fakultaet von", ausgang, "ist: ",zahl
Lg,
Mio
Zuletzt geändert von Anonymous am Montag 27. Februar 2017, 10:13, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
__deets__
User
Beiträge: 14539
Registriert: Mittwoch 14. Oktober 2015, 14:29

Was passiert denn? Das solltest du schon noch beschreiben.
nezzcarth
User
Beiträge: 1634
Registriert: Samstag 16. April 2011, 12:47

Na ja, du lässt dir in der letzten Zeile die falsche Variable ausgeben ;)

Ansonsten gäb' es noch zwei, drei Verbesserungsvorschläge. Für Zuweisungen nach dem Muster x = x <OPERATOR> y gibt es
in Python Kurzschreibweisen (x += 2, x *= 2, …). Die Typprüfung finde ich etwas ungewöhnlich. Ein gängiges Idiom wäre meines Wissens, die Eingabe einfach in einem try except-Block in einen integer zu konvertieren. Die While-Schleife könnte man durch eine for Schleife ersetzen (for i in range(zahl, 0, -1)). Du modifizierst außerdem die eingegebene Zahl. Das würde ich nicht machen; die Variable 'ausgang' kannst du trotzdem einsparen.
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

@Mio: Variablen sollte man erst initialisieren, wenn man sie auch braucht. Dann erlebt man auch keine Unangenehmen Überraschungen und man merkt, dass ›zahl = 1‹ überflüssig ist. ›input‹ sollte man nicht verwenden, sondern ›raw_input‹ und die Eingabe danach explizit konvertieren. So wie jetzt, ist es relativ unwahrscheinlich, dass jemand tatsächlich einen String eingibt. ›continue‹ sollte man sparsam verwenden. Stattdessen wäre eine Funktion besser, die exakt die gewünschte Eingabe per return zurückgibt und sonst einfach in einer Endlosschleife bleibt.
Benutzeravatar
bwbg
User
Beiträge: 407
Registriert: Mittwoch 23. Januar 2008, 13:35

Das von Dir verwendete Buch (Galileo) ist allerdings mit Vorsicht zu genießen (Python 2.5 ist ein wenig ... alt) und wenn Du zum Kapitel über Klassen kommst, such Dir was anderes:

Die offizielle Python-Dokumenation auf python.org oder die deutsche Übersetzung dieser sind m. E. sehr gut. Wirklich weitergeholfen haben mir aber auch die zahlreichen Forenbeiträge hier.

Lass Deinen Code hier komplett auseinander nehmen und freue Dich, wenn er durchfällt => Lerneffekt.

Zu Deinem Programm:

Funktionen - Auch wenn es wahrscheinlich noch nicht Thema war, helfen Funktionen wirklich weiter. Die Fakultät lässt sich prima als (echte) Funktion schreiben und im Programm verwenden. Vor allem kann man diese im Interpreter testen, bevor man das komplette Programm laufen lassen will/muss.
"Du bist der Messias! Und ich muss es wissen, denn ich bin schon einigen gefolgt!"
Antworten