Neuling sucht Rat

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.
Tengel
User
Beiträge: 210
Registriert: Sonntag 17. März 2013, 12:29

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
Zuletzt geändert von Hyperion am Sonntag 17. März 2013, 13:07, insgesamt 2-mal geändert.
Grund: Code in Python-Code Tags gesetzt
Benutzeravatar
snafu
User
Beiträge: 6861
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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.
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.
Tengel
User
Beiträge: 210
Registriert: Sonntag 17. März 2013, 12:29

Also gibt es keine Nachteile/Probleme wen man das direkt als int deklariert?
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.
Tengel
User
Beiträge: 210
Registriert: Sonntag 17. März 2013, 12:29

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 -.-
Zuletzt geändert von Anonymous am Sonntag 17. März 2013, 13:31, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
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
Tengel
User
Beiträge: 210
Registriert: Sonntag 17. März 2013, 12:29

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.
Zuletzt geändert von Tengel am Sonntag 17. März 2013, 13:50, insgesamt 1-mal geändert.
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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))
Tengel
User
Beiträge: 210
Registriert: Sonntag 17. März 2013, 12:29

:K
Davon kenne ich die meisten Befehle leider nicht :(
Aber das ich Variablennamen ohne Aussagekraft nehme ist wahr ja - das sollte ich ändern.
Tengel
User
Beiträge: 210
Registriert: Sonntag 17. März 2013, 12:29

Hm - gerade beim Kapitel über Zeichenketten darauf gekommen das es mehrere Möglichkeiten gibt diese auszugeben.

Aber ich muss mal ganz dumm fragen warum?
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.
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

@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.
Tengel
User
Beiträge: 210
Registriert: Sonntag 17. März 2013, 12:29

Ich frage mich warum es mit
"
'
"""
geht - gut """ ist einleuchtend aber warum gibts noch '?



*sry meinte eingeben
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Tengel hat geschrieben:[...]

Code: Alles auswählen

print "'"
print '"'
Tengel
User
Beiträge: 210
Registriert: Sonntag 17. März 2013, 12:29

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
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.
Tengel
User
Beiträge: 210
Registriert: Sonntag 17. März 2013, 12:29

Ja das ist gut möglich, ich glaube ich sollte das Projekt erst mal auf Eis legen und mich weiter durchs Buch wursteln .)
Tengel
User
Beiträge: 210
Registriert: Sonntag 17. März 2013, 12:29

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?
Sirius3
User
Beiträge: 18264
Registriert: Sonntag 21. Oktober 2012, 17:20

überleg mal, wann was umgewandelt wird.
Antworten