Seite 1 von 14

Neuling sucht Rat

Verfasst: Sonntag 17. März 2013, 12:33
von Tengel
Hallo - ich als Python, bzw. allgemeiner Programmierneuling habe mich aus interessse an Phyton gewagt.

Ich verwende - Einstieg in Phyton von Thomas Theis.

Was ich nicht verstehe:
Ich bin noch recht am anfang(also bei den leichten Sachen) und es geht um input().

Im Buch wird z. B.

Code: Alles auswählen

z=input()
zahl=int(z) 
Umgewandelt - aber warum?
Man kann doch gleich

Code: Alles auswählen

zahl=int(input()) 
schreiben

Danke für euren Rat
Gruß
Tengel

Re: Neuling sucht Rat

Verfasst: Sonntag 17. März 2013, 12:45
von snafu
Hallo und willkommen im Forum.

Eines vorweg: Die Sprache heißt Python und nicht Phyton... ;)

Zu deiner Frage: Beim Programmieren ist es manchmal einfacher bzw verständlicher, Zwischenschritte an eigene Namen zu binden und diese dann zu verwenden. Naturgemäß ist dies eine Geschmacks-/Stilfrage des Programmierers. Im vorliegenden Beispiel hat der gesonderte Zwischenschritt IMHO keinen nennenswerten Vorteil in punkto Lesbarkeit. Ich würde das daher auch auf die von dir vorgeschlagene direktere Art machen. Bewirken tut es letztlich das selbe.

Re: Neuling sucht Rat

Verfasst: Sonntag 17. März 2013, 12:46
von BlackJack
@Tengel: Das müsstest Du den Autor von dem Buch fragen. Vielleicht dachte er ja das wäre für den Anfang zu kompliziert für Anfänger.

Re: Neuling sucht Rat

Verfasst: Sonntag 17. März 2013, 13:05
von Tengel
Also gibt es keine Nachteile/Probleme wen man das direkt als int deklariert?

Re: Neuling sucht Rat

Verfasst: Sonntag 17. März 2013, 13:09
von BlackJack
@Tengel: Hier wird nichts deklariert sondern eine Zeichenkette in eine ganze Zahl umgewandelt.

Konkret bei diesem Beispiel sehe ich den Nachteil, das `z` ein schlechter Name ist, weil der nichts über den Wert aussagt, der daran gebunden wird. `benutzer_eingabe` wäre beispielsweise ein besserer Name gewesen.

Re: Neuling sucht Rat

Verfasst: Sonntag 17. März 2013, 13:28
von Tengel
ok danke für die schnellen Antworten :)

Was anderes

Code: Alles auswählen

inch=2.54
zahl=1

while zahl==1:
    print("Geben sie eine Zahl ein: ")
    z=input()

    try:
        eingabe=int(z)
        ergebnis=z*inch
        print(z,"inch entspricht",ergebnis,"cm")
        zahl=0

    except:
        print("Falsche Eingabe:")
Das sollte eigentlich Inch in Cm umrechnen - sollte keine Zahl eingegeben werden - kommt ein Fehler und gibt nochmal die Möglichkeit zur Eingabe
aber
wenn ich das Ausführen lasse muss ich erst einmal Enter drücken das er das "Geben sie eine Zahl ein" bringt
und dann führt er auch das except aus obwohl ich eine Zahl eingegeben habe?


inch=2.54
zahl=1

while zahl==1:
print("Geben sie eine Zahl ein: ")
z=input()

try:
eingabe=int(z)
zahl=0

except:
print("Falsche Eingabe:")


ergebnis=inch*z
print(z,"inch entspricht",ergebnis,"cm")

Hm so funktionierts auch nicht -.-

Re: Neuling sucht Rat

Verfasst: Sonntag 17. März 2013, 13:41
von BlackJack
@Tengel: Bitte setze den Quelltext in Zukunft selbst in (Python-)Code-Tags. Sonst geht die Einrückung im Beitrag verloren und die ist bei Python ja ein wichtiger Bestandteil der Syntax. Ausserdem lässt sich Quelltext mit Syntax-Highlighting leichter lesen.

Man sollte kein „nacktes” ``except:`` verwenden ohne dort eine oder mehrere konkrete Ausnahmen anzugeben, die man erwartet und dort behandeln möchte. Sonst wird dort *jede* Ausnahme behandelt und in diesem Fall durch die Ausgabe ersetzt, dass es sich nicht um eine Zahl gehandelt hat, auch wenn die Ursache eine ganz andere wahr. Zum Beispiel wenn man sich bei einem Namen innerhalb des ``try``-Blocks vertippt hat. Solche Fehler sind dann unheimlich schwer zu finden. Hier geht es ja noch, aber in grösseren Programmen sucht man dann ewig nach so etwas.

Du musst einfach mal schauen was, wann an welchen Namen gebunden ist, und womit Du eigentlich rechnest.

Die Schleife mit `zahl` als Flag ist unschön. Weder Name noch Typ passen zu der Bedeutung von dem Wert. Es handelt sich nicht um eine Zahl, beziehungsweise wird die Zahl gar nicht ihrer Eigenschaft als Zahl wegen verwendet und für Wahrheitswerte gibt es den Typ `bool` mit den Werten `True` und `False`. Aber noch besser wäre es sich dieses Flag ganz zu sparen und mit ``while True:`` eine ”Endlosschleife” zu schreiben, die dann mit ``break`` verlassen werden kann.

Noch ein Lesetipp: Style Guide for Python Code

Re: Neuling sucht Rat

Verfasst: Sonntag 17. März 2013, 13:49
von Tengel

Code: Alles auswählen

inch=2.54
zahl=1

while zahl==1:
    print("Geben sie eine Zahl ein: ")
    z=input()

    try:
        eingabe=int(z)
        zahl=0
        ergebnis=inch*eingabe
        print(z,"inch entspricht",ergebnis,"cm")

        
    except:
        print("Falsche Eingabe:")
Ha - so stimmts, zumindest macht es das was ich will.
Sry das mit den Einrückungen hab ich wohl versäumt.

Re: Neuling sucht Rat

Verfasst: Sonntag 17. März 2013, 13:49
von /me
Tengel hat geschrieben:und dann führt er auch das except aus obwohl ich eine Zahl eingegeben habe?
Du hast unpraktische Namen für die Bezeichner. Unter inch würde ich einen Wer in Inch erwarten, nicht den Faktor für die Umrechnung von Inch in Zentimeter. Irgendwann hast du dich dann darin verlaufen und konvertierst zwar den eingegebenen String in ein Integer mit dem Namen eingabe, verwendest diesen Wert aber abschließend nicht.

Dein Code in aufgeräumt würde etwa so aussehen:

Code: Alles auswählen

FACTOR_INCH_CM = 2.54
while True:
    inch = input('Geben Sie eine Zahl ein: ')
    try:
        cm = float(inch) * FACTOR_INCH_CM
    except ValueError as e:
        continue
    break
print('{0} inch entspricht etwa {1:.2f} cm.'.format(inch, cm))

Re: Neuling sucht Rat

Verfasst: Sonntag 17. März 2013, 14:00
von Tengel
:K
Davon kenne ich die meisten Befehle leider nicht :(
Aber das ich Variablennamen ohne Aussagekraft nehme ist wahr ja - das sollte ich ändern.

Re: Neuling sucht Rat

Verfasst: Sonntag 17. März 2013, 20:31
von Tengel
Hm - gerade beim Kapitel über Zeichenketten darauf gekommen das es mehrere Möglichkeiten gibt diese auszugeben.

Aber ich muss mal ganz dumm fragen warum?

Re: Neuling sucht Rat

Verfasst: Sonntag 17. März 2013, 20:37
von BlackJack
@Tengel: Was genau meinst Du denn jetzt *ausgeben* oder *formatieren*? Ich tippe mal auf letzteres. Der ``%``-Operator auf Zeichenketten ist von der Programmiersprache C inspiriert. Die Syntax für die Platzhalter in der Zeichenkette ist von dort übernommen. Die `format()`-Methode ist neuer und flexibler was die Platzhalter, ihre Reihenfolge, und Zusatzangaben angeht, welche die Formatierung beeinflussen können.

Re: Neuling sucht Rat

Verfasst: Sonntag 17. März 2013, 20:42
von jerch
@Tengel: Für die Ausgabe über STDOUT gibts eigentlich nur eine empfohlene high level-Variante mit print. Die darunterliegenden Möglichkeiten mit sys.stdout.write und os.write dürften Dich als Beginner kaum interessieren. Wegen Formatierung siehe BlackJacks Post.

Re: Neuling sucht Rat

Verfasst: Sonntag 17. März 2013, 20:47
von Tengel
Ich frage mich warum es mit
"
'
"""
geht - gut """ ist einleuchtend aber warum gibts noch '?



*sry meinte eingeben

Re: Neuling sucht Rat

Verfasst: Sonntag 17. März 2013, 20:48
von /me
Tengel hat geschrieben:[...]

Code: Alles auswählen

print "'"
print '"'

Re: Neuling sucht Rat

Verfasst: Montag 18. März 2013, 19:05
von Tengel
Hallo da bin ich wieder zum nerven :)

Nächste Frage ich möchte eine "Tabelle" 3x3 erstellen
123
456
789

Hm wie drück ich es aus.
Ich hätte gerne das erst
---
---
---
Dargestellt wird aber jedes Element seinen eigenen Index hat
also:
[0][1][2]
[3][4][5]
[6][7][8]
mit einem simplen
tabelle="""---
---
---"""
wird das wohl nicht funktionieren?
Und ich hätte auch gern die Möglichkeit das jeweilige Element zu ändern.

Gruß
Tengel

Re: Neuling sucht Rat

Verfasst: Montag 18. März 2013, 19:20
von BlackJack
@Tengel: Du vermischst in Deinem Wunsch glaube ich die interne Datenstruktur mit einer möglichen Anzeige. Man könnte zum Beispiel eine Liste mit neun Elementen anlegen und die dann entsprechend mit drei Elementen pro Zeile ausgeben. Oder man speichert die Tabelle auch als zweidimensionale Datenstruktur, also beispielsweise als verschachtelte Listen: Eine Liste die drei Listen mit jeweils drei Elementen enthält.

Re: Neuling sucht Rat

Verfasst: Montag 18. März 2013, 19:24
von Tengel
Ja das ist gut möglich, ich glaube ich sollte das Projekt erst mal auf Eis legen und mich weiter durchs Buch wursteln .)

Re: Neuling sucht Rat

Verfasst: Dienstag 19. März 2013, 00:52
von Tengel
Ok zum nächsten was ich nicht verstehe.

Code: Alles auswählen

a=input()
b=input()

c=a+b
print(c)

Hier werden die Eingaben nicht berechnet - sondern einfach nacheinander ausgegeben - weil input ja kein int oder float ist - sondern ein string.

Aber warum funktioniert dann

Code: Alles auswählen

a=23
b=7.5
c=a+b

#Ausgabe 1
print(a,"+",b,"=",c)

#Ausgabe 2
print(str(a)+"+"+str(b)+"="+str(c))
Man wandelt das ja in einen String um - warum kann er das dann trotzdem berechnen?

Re: Neuling sucht Rat

Verfasst: Dienstag 19. März 2013, 07:17
von Sirius3
überleg mal, wann was umgewandelt wird.