Seite 1 von 1
Ich habe programmiert und ..ähhm.. klappt nicht.
Verfasst: Mittwoch 3. April 2013, 23:16
von Sinnentlehrt
Hallo Leute,
ich bin jetzt mal wieder mit einem neuen Buch eingestiegen.
http://www.amazon.de/Einstieg-Python-Pr ... pd_sim_b_2
Hier mal erst die Lösung aus dem Buch:
Geht um das Umrechnen von Inch in cm und um das abfangen von Falscheingaben.
Code: Alles auswählen
Umrechnungsfaktor
inch = 2.54
# Initialisierung der while-Schleife
fehler = 1
# Schleife bei falscher Eingabe
while fehler == 1:
# Eingabe
print "Bitte geben Sie den inch-Wert ein"
xi = raw_input()
# Versuch der Umwandlung
try:
xi = float(xi)
fehler = 0
# Fehler bei Umwandlung
except:
print "Falsche Eingabe"
# Umrechnung, Ausgabe
xcm = xi * inch
print xi, "inch sind", xcm, "cm"
Hier dann meine Lösung:
Ist eher eigenwillig und natürlich dadurch wohl unschön aber da darum geht es ja nicht. Kann mir jemand kurz erklären und zeigen warum es bei mir nicht klappt.
Code: Alles auswählen
#!/usr/bin/python
# -*- coding: cp1252 -*-
# macht umlaute und sonderzeichen möglich
# Umrechnungsfaktor
inch = 2.54
# Initialisierung der while-Schleife
fehler = 1
# Schleife bei falscher Eingabe
while fehler == 1:
# Eingabe
print("Bitte geben Sie einen inch-Wert ein")
zahl = raw_input()
# Versuch der Umwandlung
try:
while zahl != 0:
erg = zahl * inch
# Ausgabe
print zahl ,"inch sind", erg, "cm"
fehler = 0
# Fehler bei Umwandlung
except:
print ("Sie haben den Inch Wert nicht richtig" \
"eingegeben. ")
print ("Bitte geben Sie den inch-Wert ein")
zahl = raw_input()
print "Ende des Programms"
Im Python-Terminal gibt es keine Fehlermeldung, es kommt die erste print Anweisung. Nach Eingabe der Zahl kommt direkt der except Teil mit den beiden print Anweisungen und die Aufforderung für die erneute Eingabe.
Warum komme ich nicht in die while Schleife?
Grüsse,
Re: Ich habe programmiert und ..ähhm.. klappt nicht.
Verfasst: Mittwoch 3. April 2013, 23:27
von derdon
Sinnentlehrt hat geschrieben:Ist eher eigenwillig und natürlich dadurch wohl unschön aber da darum geht es ja nicht.
Worum geht es dir denn dann langfristig gesehen? Soll immer nur das Motto gelten "hauptsache es geht irgendwie, der Weg ist egal"? Wenn der gepostete Code die Musterlösung aus dem Buch sein soll, so kannst du das Buch nur noch zum Verheizen verwenden, aber nicht um idiomatisches programmieren zu lernen. Seltsame while-Schleife (statt "fehler" einzuführen und zu verändern würde man das break-Statement verwenden), nichtssagende Namen (``xi``), reines except ohne explizite Angabe der abzufangenden Ausnahme. Zu deinem Problem: raw_input gibt einen String zurück (Zeichenkette). Du vergleichst einen String mit einer Zahl, wenn du ``raw_input() != 0`` prüfst. Der String "0" ist in Python niemals gleich der Zahl 0.
Re: Ich habe programmiert und ..ähhm.. klappt nicht.
Verfasst: Donnerstag 4. April 2013, 07:23
von Sirius3
Hallo Sinnentlehrt,
Dein nacktes »except« fängt jeden Fehler ab, damit kannst Du also weder den Ort noch die Art des Fehlers finden!
Deshalb sowas
nie wieder machen

. try-except-Konstrukte sollten möglichst nur exakt den Befehl einschließen,
der auch laut Design den Fehler erzeugen kann und auch nur den Exception-Typ abfangen, bei falschen Werten also »ValueError«.
Hier für Dich, was das except überdeckt:
Code: Alles auswählen
>>> erg = '12' * 2.54
Traceback (most recent call last):
File "<stdin>", line 20, in <module>
TypeError: can't multiply sequence by non-int of type 'float'
Re: Ich habe programmiert und ..ähhm.. klappt nicht.
Verfasst: Donnerstag 4. April 2013, 16:06
von bb1898
Sinnentlehrt hat geschrieben:
Code: Alles auswählen
# Versuch der Umwandlung
try:
while zahl != 0:
erg = zahl * inch
# Ausgabe
print zahl ,"inch sind", erg, "cm"
Noch was: angenommen, die Multiplikation würde durchgeführt, dann hättest Du die schönste Endlosschleife, weil zahl sich ja nicht ändert.
Re: Ich habe programmiert und ..ähhm.. klappt nicht.
Verfasst: Donnerstag 4. April 2013, 23:19
von Sinnentlehrt
Erstmal Danke für die vielen Hilfestellungen!!!

Konnte eure Ratschläge gut umsetzen. Den Code habe ich zwar in die Tonne getreten

aber was dabei gelernt.
@derdon, meine Recherchen haben ergeben das es wohl im Moment kein wirklich gutes Python Buch am Markt gibt, vor allem keins auf Deutsch. Also arbeite ich mit dem was ich kriegen kann. Ich bin mit Python im November gestartet und hoffte jetzt schon wesentlich weiter zu sein, aber gut, neben einem Vollzeitjob muß man sich wohl damit abfinden das es sich wohl noch eine Weile ziehen wird, zum Glück <sarkasmus> habe ich keine Freundin </sarkasmus>. Aber sich jetzt schon mit Stilfragen zu beschäftigen erscheint mir ein wenig übertrieben, einfach weil mir dafür die Urteilskraft fehlt. Ich habe jetzt vielleicht so an die 1000 Seiten gelesen und ich mir schwant das es wohl noch so 1500 werden könnten. Hoffen wir das mir zwischendurch auch Feinheiten Bewußt werden. Aber trotzdem Danke für die Kritik, hatte vom Inhalt deiner Anmerkungen schon eher gelesen.
@Sirius3, jepp, was except so alles kann ist mir schon mal eher da gelegt worden, und durch deinen Einwand wieder in Gedächtnis gerufen worden.
@bb1898, ja, du hast recht. Habe mir eine schöne Endlosschleife gebaut.
Grüße,
Re: Ich habe programmiert und ..ähhm.. klappt nicht.
Verfasst: Freitag 5. April 2013, 00:48
von BlackJack
@Sinnentlehrt: Idiomatischen Code zu schreiben würde ich nicht als reine Stilfrage bezeichnen. Es geht darum gut verständlichen Quelltext zu schreiben, das ist nicht etwas was man auf später verschieben sollte, sondern von Anfang an üben sollte. Gute, passende Namen zu wählen zum Beispiel ist etwas was dem Rechner total egal ist, aber es ”zwingt” den Programmierer über das Programm und die Werte die an die Namen gebunden werden nachzudenken. Wenn man Schwierigkeiten hat einen passenden Namen für etwas zu finden, ist das in der Regel ein Zeichen, dass man das Problem oder die eigene Lösung noch nicht hinreichend verstanden hat.
Re: Ich habe programmiert und ..ähhm.. klappt nicht.
Verfasst: Freitag 5. April 2013, 06:19
von Sirius3
@Sinnentlehrt: meiner Meinung nach ist Programmieren lernen wie Kinder erziehen. Man kann zwar 100 Bücher lesen, aber am besten sucht man sich gute Vorbilder und machts denen nach.
Code: Alles auswählen
CM_PER_INCH = 2.54
def input_float(prompt):
""" Reads an float from stdin. """
while True:
try:
print prompt
return float(raw_input('> '))
except ValueError:
print "Bitte Zahl eingeben (z.B: 1.7)."
def main():
value_in_inch = input_float("Bitte geben Sie den inch-Wert ein.")
value_in_cm = value_in_inch * CM_PER_INCH
print "%.2finch sind %.2fcm" % (value_in_inch, value_in_cm)
if __name__ == "__main__":
main()
Lesen und verstehen/nachfragen.
Re: Ich habe programmiert und ..ähhm.. klappt nicht.
Verfasst: Mittwoch 10. April 2013, 04:54
von Sinnentlehrt
@Black Jack: das man beim Code schreiben mit ein bißchen Verstand herangehen sollte ist ja klar. Das sinnvolle benennen von Variablen ist natürlich bei jeder vorm von Programm Code unabdingbar. Das der Autor dieses Buches das zu vernachlässigen zu scheint ist natürlich schade. Ich werde versuchen deinen Ratschlag zu beherzigen.
@Sirius3: danke für dein Code Beispiel, ich finde es sehr schön und es hat mir einiges gezeigt. Leider wird es wohl es noch eine Weile dauern bis ich genauso schreiben werde.
Re: Ich habe programmiert und ..ähhm.. klappt nicht.
Verfasst: Mittwoch 17. April 2013, 20:46
von Tengel
Auch wenn ich etwas spät dran bin - das Buch ist leider nicht das Wahre - ich hab selbst damit angefangen und es ist doch sehr zweifelhaft inwieweit sich das als eignet - wohl auch abhängig davon was du "willst".
Wenn du "guten" Code schreiben willst - ist das definitiv ungeeignet - da du es dir durch das Buch einfach "falsch" beibringst.
Die try: - except: Anmerkungen sind da ein gutes Beispiel - und die ziehen sich das ganze Buch über "falsch" durch.
Auch von einem Freund der ehemaliger IT Student ist hab ich mir sagen lassen das dass Buch in der Uni als Türstopper verwendet wurde^^
Aber du hast den Weg hier her gefunden - das ist schon mal ein wichtiger richtiger Schritt^^ - lauter kompetente Leute hier.