While-Schleife funktioniert (nur) in IDLE nicht

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
Cobalt
User
Beiträge: 32
Registriert: Freitag 4. April 2014, 11:54

(Achtung Anfängerfrage! Falls falsches Unterforum bitte sagen.)

Hallo,
ich scheitere grad an einfachsten While-Schleifen. Z.Bsp. folgender Code:

Code: Alles auswählen

secret = 1337 
guess = 0 
while guess != secret: 
    guess = input("Raten Sie: ") 
print "Sie haben es geschafft!"
Beim test in IDLE erhalte ich (versionsunabhängig) immer eine Fehlermeldung "SyntaxError: invalid syntax" und der print-Befehl in der letzten Zeile ist rot markiert. Die Schleife an sich funktioniert, wenn ich die letzte Zeile mit der print-Anweisung weglasse.
Wo liegt das Problem? Auch die simplen While-Schleifen meines Video-Tutorials sehen so aus und funktionieren ebensowenig...

Edit: das Problem existiert nur in IDLE, wie ich nach dem Test mit Codecademy leider erst jetzt festgestellt habe. Ursache ist aber weiterhin unklar. Der Code ist unter IDLE jedenfalls korrekt eingerückt.
Zuletzt geändert von Cobalt am Montag 14. April 2014, 13:51, insgesamt 7-mal geändert.
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

@Cobalt
Der Code ist für Python 2.x, Du verwendest offensichtlich allerdings Python 3.x. Seit Python 3 ist ``print`` kein Statement mehr, sondern eine Funktion. Das heißt, Du musst `print` wie eine Funktion aufrufen und die gewünschten Argumente übergeben:

Code: Alles auswählen

>>> print('Sie haben es geschafft!')
mutetella

EDIT: Allerdings verwendet der Code `input` und nicht, wie unter Python 2.x unbedingt zu empfehlen, `raw_input`...??
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Cobalt
User
Beiträge: 32
Registriert: Freitag 4. April 2014, 11:54

Hallo,
nein, ich habe habe Python 2.7.6 und 3.4 installiert und unter 3.4 "print" auch als Funktion aufgerufen. Daran liegt es nicht. Das hier "input" statt "raw_input" verwendet wird ist mir auch aufgefallen, spielt hier aber auch keine Rolle. Der Block innerhalb der Schleife ist irrelevant. Ich habe diverse While-Schleifen getestet. Hier ein weiteres Beispiel mit identischer Fehlermeldung:

Code: Alles auswählen

num = 0
while num <= 5:
    print num
    num += 1

print "Outside of loop"
print num
Auch hier wird die erste print-Anweisung nach dem Schleifenblock bemäkelt. Auch hier (nach Anpassung der print-Anweisung) unter 2.7.6 und 3.4 das gleiche. Lasse ich die print-Anweisung weg funktioniert auch hier alles soweit. Die Zeilen mit der print-Anweisung separat ausgeführt funktionieren auch. Nur unmittelbar am Ende der While-Schleife macht sie (zumindest laut Fehlermeldung) Probleme.
Änder ich die vorletzte Zeile zu

Code: Alles auswählen

else: print "Outside of loop"
und lasse die letzte Zeile weg funktioniert es auch.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Cobalt hat geschrieben:Hallo,
nein, ich habe habe Python 2.7.6 und 3.4 installiert und unter 3.4 "print" auch als Funktion aufgerufen. Daran liegt es nicht.
Starte doch mal eine Shell (unter Windows cmd oder Powershell z.B.). Dann gibt dort ``python`` ein und schau Dir an, welche Version gestartet wird. Danach gibst Du entsprechend Dein Snippet entweder mit ``print`` als Funktion (3.x) oder ``print`` als Statement ``2.x`` ein.

Dann wirst Du sehen, dass alles klappt! ;-)
Cobalt hat geschrieben: Das hier "input" statt "raw_input" verwendet wird ist mir auch aufgefallen, spielt hier aber auch keine Rolle.
Bei Versions-Chaos spielt das immer eine Rolle ;-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Cobalt
User
Beiträge: 32
Registriert: Freitag 4. April 2014, 11:54

Hallo,
es hat wie gesagt definitiv nichts mit den Versionen zu tun. Umgebungsvariable ist übrigens gar nicht gesetzt.
Jedenfalls ist die print-Anweisung stets korrekt, auch wenn die automatisch generierte Fehlemeldung suggeriert dort sei ein Syntax-Fehler. Die Print-Anweisung innerhalb des Schleifenblocks funktioniert ja auch. Nur wenn sie am Ende steht kommt die Fehlermeldung.
Es scheint auch egal zu sein welche Anweisung am Ende steht. Lautet die letzte Zeile bspw. num += 10 kommt dieselbe Fehlermeldung. Vielleicht liegt der Fehler auch gar nicht in dieser Zeile, es ist ja eh nur eine automatisch generierte Fehlermeldung.

Mittlerweile habe ich beim Test mit Online-Editoren auch festgestellt, daß der Code dort wie erwartet fehlerfrei funktioniert. Ich hatte schon den Verdacht, daß es irgendwie mit IDLE zusammenhängt. Dies hat sich also nun bestätigt, weshalb ich die Themen-Überschrift gerade mal angepasst habe (prima, daß dies hier nachträglich möglich ist).
Komisch fand ich bereits, daß nach Reinkopieren des gesamten Codes und anschl. ENTER gar nichts kommt, nur eine neue Eingabeaufforderung ">>>". Ich muß die Variable num erst separat deklarieren bzw. auf Null setzen und mit Enter bestätigen. Erst unter der neuen Eingabeaufforderung ">>>" gebe ich dann den Rest ein. Nur in dieser Reihenfolge kommt überhaupt eine Reaktion, also entweder eben die Fehlermeldung oder aber es läuft soweit wenn ich die print-Anweisung am Ende auslasse.
BlackJack

@Cobalt: *Wie* testest Du denn? Ich habe bis zum letzten Beitrag immer gedacht, dass Du das als Quelltext schreibst und dann ausführst, jetzt klingt es nach der Python-Shell. Die ist nicht für so etwas gedacht und die von IDLE anscheinend auch nicht wirklich geeignet. Wenn ich in meine IDLE zum Beispiel das komplette Beispiel rein kopiere wird nur die allererste Zeile ausgeführt, und der Rest ignoriert.

Und wo kommt der Quelltext her? Manche Blogsoftware ändert zum Beispiel gerne mal die ASCII-Anführungszeichen zu typographisch korrekteren Anführungszeichen um, mit denen dann Compiler nichts mehr anfangen können, oder machen aus ASCII-Minuszeichen Gedankenstriche oder ”echte” Minuszeichen, oder fügen unsichtbare Steuerzeichen ein, oder ähnliches.
Cobalt
User
Beiträge: 32
Registriert: Freitag 4. April 2014, 11:54

Hi, ich teste wie gesagt in IDLE und es scheint tatsächlich nicht wirklich dafür geeignet. Im letzten Beispiel mußte ich auch wie schon erwähnt die erste Zeile num = 0 getrennt vom restlichen Code eingeben. Ob's am Kopieren liegt habe ich auch getestet, indem ich ihn manuell eingetippt habe. Aber das hatte keine Auswirkung.
Wozu ist IDLE eigentlich genau da? Jedenfalls scheint die zweifache ENTER-Eingabe ja Code direkt auszuführen. ich dachte IDLE wäre ein rudimentärer Editor, in dem man den Code auch direkt zum test ausführen kann.
Am liebsten wäre mir ein Editor, der ähnlich wie der von Codecademy einen "Run"-Button o.ä. hat, mit dem der im Editor befindliche Code dann in einem anderen Fenster ausgeführt wird, so daß ich ihn immer direkt testen kann. Ich habe mir grad mal Komodo runtergeladen, hat der diese Funktion?
BlackJack

@Cobalt: IDLE ist eine interaktive Python-Shell wo man direkt Anweisungen eintippen kann, die dann ausgeführt werden *und* es ist ein Editor. Allerdings scheinst Du den Code im Shell-Fenster einzugeben bzw. ihn dort hinein zu kopieren. Mach ein Editorfenster auf (File → New Window, oder Strg+N) und kopiere den Text dort hinein und führe ihn dann mit den entsprechenden Menüpunkt beziehungsweise der F5 Taste aus.

Wenn man Anweisungen in der Shell direkt eingibt muss man auch nur einmal Enter drücken um sie auszuführen.
Cobalt
User
Beiträge: 32
Registriert: Freitag 4. April 2014, 11:54

@BlackJack: Danke! Das war also das Problem. Wofür ist dann die eigentlich Shell selbst genau da?
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

@Cobalt
Um kleine Codeschnipsel, meistens Einzeiler, auszuprobieren...

mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
BlackJack

@Cobalt: Naja, zum Ausprobieren von Code. Welchen den man dort eintippt. Soweit ich das in Erinnerung habe werden Module die man mit F5 ausführt auch in dem Namensraum der Shell ausgeführt. Das heisst wenn man im Editor Funktionen und Klassen definiert und das Modul ausführt, dann kann man diese Funktionen und Klassen in der Shell direkt interaktiv ausprobieren.
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

@BlackJack
Ich hab' dafür ein offenes vim und ein Ipython und regel das dann via ``import`` und `reload()`. Wie verhält sich die IDLE, wenn man ein ausgeführtes Modul verändert und erneut ausführt? Wird das dann überschrieben?

mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
BlackJack

@mutetella: Ich bin kein IDLE-Experte, ich nehme einfach mal an dass das Modul im Namensraum der Shell ausgeführt wird. Also jedes Modul das man mit F5 ausführt.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

@Cobalt: Hättest Du meinen Rat befolgt, wärst Du schneller auf Idle bzw. eine falsche Bedienung gekommen ;-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Antworten