newbi-Fragen

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
bernerdrive
User
Beiträge: 6
Registriert: Mittwoch 16. April 2014, 11:36

hallo zusammen,
bin gerade am Durchlesen bzw. Durcharbeiten von openbook "Das umfassende Handbuch - Aktuell zu Python 2.5"
Dazu habe ich mir die aktuelle Version(V3.4.0) von Python herunter geladen.
Als erstes sind mit die Klammern bei "print" aufgefallen.
Also die Version 3.4 will zusätzlich Klammern haben.
Nun aber steh ich vor einem weiteren Problem.
Das Beispiel mit der while-Funktion in Kapitel 6

Code: Alles auswählen

secret = 1337 
guess = 0 
while guess != secret: 
    guess = input("Raten Sie: ") 
else: 
    print ("Sie haben es geschafft!")
Mit der Version 3.4 wird die "else:" ignoriert und in der Version 2.7, die ich mir nun auch noch installiert habe, funktioniert es.
Das verwirrt mich als Anfänger doch sehr.
in dem vorherige Beispiel funktioniert die "else" noch

Code: Alles auswählen

x=3
if x ==1:
    print ("x hat den Wert 1")
elif x==2:
    print ("x hat den Wert 2")
else:
    print ("x ungleich 1 und ungleich 2")

Kann mir jemand helfen und den Fehler in der Version 3.4. zeigen.


Danke schon mal.

PS. Ich hoffe nicht gleich gesteinigt zu werden.
Zuletzt geändert von Hyperion am Dienstag 22. April 2014, 09:31, insgesamt 1-mal geändert.
Grund: Code in Python-Code Tags gesetzt.
Sirius3
User
Beiträge: 18335
Registriert: Sonntag 21. Oktober 2012, 17:20

@bernerdrive: ist sind nicht nur die Klammern die sich von Python 2 nach 3 geändert haben, sondern einige Funktionen verhalten sich anders oder heißen jetzt anders. Was in Python 3 input ist, ist in Python 2 raw_input. Beides mal bekommst Du einen String zurück, der natürlich nicht gleich einer Zahl ist. Das "input" von Python 2 dagegen solltest Du nicht verwenden, da es die Eingabe interpretiert und deshalb seltsame bis ungewollte Dinge passieren.

Zum Lernen bleibe am besten bei Deinem Python 2.7. Das ist das zur Zeit am meisten benutzte Python mit der größten Auswahl an Bibliotheken. Das städnige hin und her verwirrt Dich als Anfänger im besten Fall nur.
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Sirius3 hat geschrieben:Zum Lernen bleibe am besten bei Deinem Python 2.7. Das ist das zur Zeit am meisten benutzte Python mit der größten Auswahl an Bibliotheken.
Wenn man ein passendes Tutorial für Python 3 hat spricht meiner Meinung nach nichts dagegen, Python 3 zu verwenden. Gerade ein Anfänger wird vermutlich einige Zeit brauchen bis er auf eine der wenigen noch nicht auf Python 3 portierten Bibliotheken stößt und selbst dann stellt sich immer noch die Frage, ob es nicht eine Alternative dazu gibt.
bernerdrive
User
Beiträge: 6
Registriert: Mittwoch 16. April 2014, 11:36

@Sirius3:
vielen Dank für deine rasche Antwort.
Dann werde ich mich mal von der Version 3.4 verabschieden und bei 2.7 bleiben.
Das mit "input" ist Bestandteil des Buches: :K
http://openbook.galileocomputing.de/pyt ... 4649a9fbd0
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

bernerdrive hat geschrieben:Das mit "input" ist Bestandteil des Buches: :K
http://openbook.galileocomputing.de/pyt ... 4649a9fbd0
Das OpenBook hat nicht umsonst einen nicht all zu guten Ruf.
bernerdrive
User
Beiträge: 6
Registriert: Mittwoch 16. April 2014, 11:36

@me:
kennst du ein gutes deutschsprachiges Tutorial für Python 3, ähnlich wie das von openbooks?

meine Bestreben die Version 3.4 zu benutzen... ich bin nicht vorbelastet.
Einzig ein bischen asm habe ich vor einiger Zeit probiert.
BlackJack

@bernerdrive: Das Problem bei `input()` in Python 2.x ist, dass der Benutzer dort Python-Ausdrücke eingeben kann, die dann ausgewertet werden. Das kann letztendlich zu jedem Fehler führen den man so bekommen kann, inklusive `SyntaxError` wenn der Benutzer kein korrektes Python eingibt, und es kann eine Sicherheitslücke sein, weil der Benutzer da nicht nur so harmlose Sachen wie 42 oder 1 + 3 eingeben kann, sondern auch Ausdrücke die dazu führen dass Dateien gelöscht werden, oder ähnliches.

Darum sollte man `input()` vermeiden und lieber `raw_input()` verwenden, was die Eingabe des Benutzers als Zeichenkette liefert, und diese dann explizit in eine Zahl umwandeln. Die möglichen Fehler die dabei passieren können, ist deutlich überschaubarer, hauptsächlich `ValueError` wenn sich die Eingabe nicht in eine Zahl umwandeln lässt, und es wird nicht mehr vom Benutzer eingegebener Code ausgeführt. Für das Beispiel bedeutet das:

Code: Alles auswählen

secret = 1337 
guess = 0 
while guess != secret: 
    guess = int(raw_input('Raten Sie: '))
bernerdrive
User
Beiträge: 6
Registriert: Mittwoch 16. April 2014, 11:36

also in Python 2.x muss es raw_input

Code: Alles auswählen

secret = 1337
guess = 0
while guess != secret:
    guess = int(raw_input('Raten Sie: '))
und in Python 3.x muss es input heißen?

Code: Alles auswählen

secret = 1337
guess = 0
while guess != secret:
    guess = input('Raten Sie: ')
Oder gibt es in Python 3.x damit auch Probleme
BlackJack

@bernerdrive: Ja, denn in Python 3 ist `input()` das was in Python 2 `raw_input()` war. Das liefert also eine Zeichenkette, die niemals gleich irgendeiner Zahl ist. Man muss sie also in eine Zahl umwandeln, wie in Python 2.
bernerdrive
User
Beiträge: 6
Registriert: Mittwoch 16. April 2014, 11:36

noch einmal zu mein ursprüglichen Problem zurück:

Python 2.x funktioniert die "else"

Code: Alles auswählen

secret = 1337
guess = 0
while guess != secret:
    guess = int(raw_input('Raten Sie: '))
else:
    print ("richtig geraten")   
Python 3.x funktioniert die "else" nicht

Code: Alles auswählen

secret = 1337
guess = 0
while guess != secret:
    guess = input('Raten Sie: ')
else:
    print ("richtig geraten")   
die Eingabe von 1337 unterbricht nicht die Schleife

habe es gefunden :oops:

Code: Alles auswählen

secret = 1337
guess = 0
while guess != secret:
    guess = int(input('Raten Sie: '))
else:
    print ("richtig geraten")   
die Angabe des Dateityps der Variable fehlte
Zuletzt geändert von bernerdrive am Dienstag 22. April 2014, 10:21, insgesamt 1-mal geändert.
BlackJack

@bernerdrive: Das hat nichts mit dem ``else`` zu tun, sondern das Du die Zeichenkette die der Benutzer eingibt, nicht in eine Zahl umwandelst. Damit wird der Vergleich niemals wahr und die Schleife niemals abgebrochen.

Code: Alles auswählen

In [1]: 42 == '42'
Out[1]: False

In [2]: 42 == int('42')
Out[2]: True
bernerdrive
User
Beiträge: 6
Registriert: Mittwoch 16. April 2014, 11:36

Leider hat "me" in dem Fall doppelt Recht.
Das Buch http://openbook.galileocomputing.de/pyt ... 2726e071dc ist in dem Fall etwas ungenau.

Kann mir jemand ein anderes "besseres" Tutorial zum Lernen empfehlen?
Gerade als Anfänger saugt man der Art Ungenauigkeiten bzw. Fehler in sich auf.... :cry:
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

bernerdrive hat geschrieben: Gerade als Anfänger saugt man der Art Ungenauigkeiten bzw. Fehler in sich auf.... :cry:
Benutze die Suchfunktion! Das Thema haben wir hier gaaaaaaaanz oft ;-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Antworten