Anfängerfehler bei If - Übung

Code-Stücke können hier veröffentlicht werden.
Antworten
Kowkas
User
Beiträge: 7
Registriert: Mittwoch 4. März 2020, 00:45

Mittwoch 4. März 2020, 01:04

Hallo allerseits,

ich bin ein bloody beginner und versuche mich mit Buch (Kofler) und später sicher noch anderen Lernmitteln an Python. Leider scheitere ich schon an so einfachen Sachen wie einer If - Verzweigung.
Hier der simple Code:
>>> tag = 3
>>> if tag in (1, 2, 3, 4, 5):
print ('geh arbeiten')
elif tag in (6, 7):

Wenn ich nun den nächsten Teil (Auswertung der elif - Anweisung) schreiben will, kommen folgende Fehlermeldungen:
SyntaxError: multiple statements found while compiling a single statement bzw.
SyntaxError: unindent does not match any outer indentation level

Das hängt damit zusammen, ob ich die Einrückung mit Leerzeichen mache. Ich hatte es so verstanden, dass Python die Einrückung selbtändig ind er korrekten Form vornimmt. War offensichtlich ein Trugschluß. Was genau mache ich denn falsch? Bzw. wie kann ich absichern, dass diese Fehler in Zukunft vermieden werden?

Ach so, der Code sollte dann so weitergehen:
print ('Wochenende')
else:
print ('ungültig') #der gesamte Code stammt aus dem Buch den Herrn Kofler


Vielen Dank schonmal für Eure Hilfe,

LG, Kowkase
Benutzeravatar
sparrow
User
Beiträge: 1831
Registriert: Freitag 17. April 2009, 10:28

Mittwoch 4. März 2020, 06:17

Einrückungen sind in Python wichtig. Sie kennzeichnen Blöcke. In manchen Sprachen, wie Java oder C, werden Blöcke in geschweiften Klammern geschrieben. Aber auch dort sollte man sie, damit der Code besser zu lesen ist, einrücken. Bei Python ist das in den Syntax direkt übernommen worden.

Es wird also auf gar keinen Fall automatisch eingerückt, sondern du mussr entsprechend einrücken und Blöcke damit kenntlich machen.

Code: Alles auswählen

tag = 3
if tag in (1, 2, 3, 4, 5):
    print ('geh arbeiten')
elif tag in (6, 7):
    pass
Kowkas
User
Beiträge: 7
Registriert: Mittwoch 4. März 2020, 00:45

Donnerstag 5. März 2020, 11:55

Hi Sparrow,

vielen Dank für Deine Erläuterung. So in der Art hatteich das auch in dem Buch gelesen. Daher habe ich ja schon vermutet, dass es daran liegt.
Nun habe ich Deinen Code mal in´s Temrinalfenster kopiert. Beim Ausführen kommt dann diese Meldung: SyntaxError: multiple statements found while compiling a single statement
Ich habe die Einrückungen sowohl mit Leerzeichen als auch mit Tab probiert. Leider geschieht dann immer das selbe....
Mir fehlt halt irgendiwie die Idee, wie ich die Einrückung so machen kann das es funktioniert. Sooo kmpliziert ist ja das Snipped nicht ;-)
Sirius3
User
Beiträge: 11979
Registriert: Sonntag 21. Oktober 2012, 17:20

Donnerstag 5. März 2020, 12:03

In welches Terminalfenster hast du das kopiert?
Kowkas
User
Beiträge: 7
Registriert: Mittwoch 4. März 2020, 00:45

Donnerstag 5. März 2020, 12:26

Ich arbeite auf nem Mac.
mit dem Terminalfenster ist die "Python 3.8.1 Shell" gemeint
Benutzeravatar
__blackjack__
User
Beiträge: 5993
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Donnerstag 5. März 2020, 12:40

Also wahrscheinlich IDLE. Wenn ich dort den Code von Sparrow rein kopiere bekomme ich die gleiche `SyntaxError`-Ausnahme. Wenn ich tatsächlich ein Terminalfenster aufmache, da ``python3.8`` eingebe und dort dann den Code einfüge funktioniert es bei mir (nachdem ich noch mal die Eingabetaste gedrückt habe).
long long ago; /* in a galaxy far far away */
Kowkas
User
Beiträge: 7
Registriert: Mittwoch 4. März 2020, 00:45

Freitag 6. März 2020, 00:31

whuaaaa,
das war die Lösung. Du hast richtig getippt (IDLE3)
Hab es jetzt genauso gemacht und es geht...
Mal ganz ehrlich, ist das jetzt so und warum hat das sonst keiner?
Benutzeravatar
__blackjack__
User
Beiträge: 5993
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Freitag 6. März 2020, 00:35

Es verwendet keiner IDLE. Und/oder es kopiert niemand Code dort in die Shell. Wenn man es eintippt dann funktioniert es.
long long ago; /* in a galaxy far far away */
Kowkas
User
Beiträge: 7
Registriert: Mittwoch 4. März 2020, 00:45

Freitag 6. März 2020, 01:22

ok, ich verwende IDLE, weil ich keinen anderen Weg kenne...
Und ich habe diesen Code natürlich dort selber getippt. Wäre es möglich hier Grafiken einzufügen, könnte ich Dir nen Screeni posten, wo all diese Sachen zu sehen sind.
Wenn IDLE nicht das Mittel der Wahl ist, wlcher Weg ist denn dann der Bessere?
Benutzeravatar
ThomasL
User
Beiträge: 934
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Freitag 6. März 2020, 07:19

Schau mal hier rein: https://www.youtube.com/watch?v=eXinDi55iOk

Des Weiteren probiere mal hier https://jupyter.org/try Jupyterlab aus.
Das kann man natürlich auch lokal installieren.
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Jankie
User
Beiträge: 321
Registriert: Mittwoch 26. September 2018, 14:06

Freitag 6. März 2020, 07:23

Kowkas hat geschrieben:
Freitag 6. März 2020, 01:22
ok, ich verwende IDLE, weil ich keinen anderen Weg kenne...
Und ich habe diesen Code natürlich dort selber getippt. Wäre es möglich hier Grafiken einzufügen, könnte ich Dir nen Screeni posten, wo all diese Sachen zu sehen sind.
Wenn IDLE nicht das Mittel der Wahl ist, wlcher Weg ist denn dann der Bessere?
Ich hab mir anfangs Notepad++ heruntergeladen und dort Python als Sprache eingestellt (Syntax-Highlighting). Die Dateien habe ich dann unter irgend_ein_name.py gespeichert. Diese Datei habe ich dann über das Terminal aufgerufen über "python3 irgend_ein_name.py".
Benutzeravatar
__blackjack__
User
Beiträge: 5993
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Freitag 6. März 2020, 08:06

@Kowkas: Wenn man das selbst in IDLE in der Python-Shell eintippt dann sollte es aber funktionieren. Beziehungsweise funktioniert auch kopieren und einfügen wenn man das beachtet was in der Fehlermeldung steht: man darf nicht beide Anweisungen auf einmal einfügen weil das der Compiler nicht kann wenn man ihm sagt er soll *eine* Anweisung übersetzen. Denn das macht IDLE da: es erwartet beim ">>>"-Prompt *eine* Anweisung die dann übersetzt und ausgeführt wird, um dann wieder den Prompt anzuzeigen und die nächste Anweisung entgegen zu nehmen, zu übersetzen, und auszuführen. Und so weiter.

Wenn man also erst ``tag = 3`` einfügt und ausführt und dann erst das ``if``/``elif``-Konstrukt, dann geht es auch in der IDLE-Python-Shell:

Code: Alles auswählen

>>> tag = 3
>>> if tag in (1, 2, 3, 4, 5):
    print ('geh arbeiten')
elif tag in (6, 7):
    pass

geh arbeiten
In einer normalen Python-Shell funktioniert es bei mir sowohl mit eintippen als auch wenn man den Code von woanders kopiert und einfügt, weil einfügen beim Terminal letztlich ja das gleiche ist wie eintippen. Die Anwendung die da im Terminal läuft sieht keinen Unterschied ob man ein Zeilenendezeichen einfügt oder die Eingabetaste drückt, und damit bekommt die Python-Shell zwei einzelne Anweisungen nacheinander statt beide auf einmal:

Code: Alles auswählen

>>> tag = 3
>>> if tag in (1, 2, 3, 4, 5):
...     print ('geh arbeiten')
... elif tag in (6, 7):
...     pass
... 
geh arbeiten
Hier ist auch schöner das die Python-Shell in Zeilen wo die Anweisung noch nicht zuende ist/sein kann den "..."-Prompt ausgibt und damit die Einrückung sinnvoller dargestellt wird als in der IDLE-Python-Shell, weil die erste Zeile durch den ">>>"-Prompt optisch nicht ”besonders” ist.

Etwas mehr Funktionalität bietet die IPython-Shell. Unter anderem hat man dort die Möglichkeit den gesamten mehrzeiligen Code zu bearbeiten und nicht nur die aktuelle Zeile, wie in der normalen Python-Shell und man kann auch mehr als eine Anweisung auf einmal einfügen:

Code: Alles auswählen

In [1]: tag = 3 
   ...: if tag in (1, 2, 3, 4, 5): 
   ...:     print ('geh arbeiten') 
   ...: elif tag in (6, 7): 
   ...:     pass 
   ...:                                                                         
geh arbeiten
Auch ganz gut geeignet zum ”live” herumspielen mit Code ist Jupyter-Lab, was letztlich auch IPython — mit noch mehr Funktionalität ist. Und bei „Notebooks“ auch mit der Möglichkeit Shell-Sitzungen zu speichern und zu laden und mit formatierten Textanmerkungen zu versehen.
long long ago; /* in a galaxy far far away */
Kowkas
User
Beiträge: 7
Registriert: Mittwoch 4. März 2020, 00:45

Freitag 6. März 2020, 12:49

ThomasL hat geschrieben:
Freitag 6. März 2020, 07:19
Schau mal hier rein: https://www.youtube.com/watch?v=eXinDi55iOk

Des Weiteren probiere mal hier https://jupyter.org/try Jupyterlab aus.
Das kann man natürlich auch lokal installieren.
Wow, vielen Dank für die Links. Der Mensch in dem YT-Video schnattert zwar nen bischen schnell, ist aber gut zu verstehen. Hat mir erstmal einen guten Überblick verschafft...
Kowkas
User
Beiträge: 7
Registriert: Mittwoch 4. März 2020, 00:45

Freitag 6. März 2020, 19:05

__blackjack__ hat geschrieben:
Freitag 6. März 2020, 08:06
@Kowkas: Wenn man das selbst in IDLE in der Python-Shell eintippt dann sollte es aber funktionieren. Beziehungsweise funktioniert auch kopieren und einfügen wenn man das beachtet was in der Fehlermeldung steht: man darf nicht beide Anweisungen auf einmal einfügen weil das der Compiler nicht kann wenn man ihm sagt er soll *eine* Anweisung übersetzen. Denn das macht IDLE da: es erwartet beim ">>>"-Prompt *eine* Anweisung die dann übersetzt und ausgeführt wird, um dann wieder den Prompt anzuzeigen und die nächste Anweisung entgegen zu nehmen, zu übersetzen, und auszuführen. Und so weiter.

Wenn man also erst ``tag = 3`` einfügt und ausführt und dann erst das ``if``/``elif``-Konstrukt, dann geht es auch in der IDLE-Python-Shell:

Code: Alles auswählen

>>> tag = 3
>>> if tag in (1, 2, 3, 4, 5):
    print ('geh arbeiten')
elif tag in (6, 7):
    pass

geh arbeiten
In einer normalen Python-Shell funktioniert es bei mir sowohl mit eintippen als auch wenn man den Code von woanders kopiert und einfügt, weil einfügen beim Terminal letztlich ja das gleiche ist wie eintippen. Die Anwendung die da im Terminal läuft sieht keinen Unterschied ob man ein Zeilenendezeichen einfügt oder die Eingabetaste drückt, und damit bekommt die Python-Shell zwei einzelne Anweisungen nacheinander statt beide auf einmal:

Code: Alles auswählen

>>> tag = 3
>>> if tag in (1, 2, 3, 4, 5):
...     print ('geh arbeiten')
... elif tag in (6, 7):
...     pass
... 
geh arbeiten
Hier ist auch schöner das die Python-Shell in Zeilen wo die Anweisung noch nicht zuende ist/sein kann den "..."-Prompt ausgibt und damit die Einrückung sinnvoller dargestellt wird als in der IDLE-Python-Shell, weil die erste Zeile durch den ">>>"-Prompt optisch nicht ”besonders” ist.

Etwas mehr Funktionalität bietet die IPython-Shell. Unter anderem hat man dort die Möglichkeit den gesamten mehrzeiligen Code zu bearbeiten und nicht nur die aktuelle Zeile, wie in der normalen Python-Shell und man kann auch mehr als eine Anweisung auf einmal einfügen:

Code: Alles auswählen

In [1]: tag = 3 
   ...: if tag in (1, 2, 3, 4, 5): 
   ...:     print ('geh arbeiten') 
   ...: elif tag in (6, 7): 
   ...:     pass 
   ...:                                                                         
geh arbeiten
Auch ganz gut geeignet zum ”live” herumspielen mit Code ist Jupyter-Lab, was letztlich auch IPython — mit noch mehr Funktionalität ist. Und bei „Notebooks“ auch mit der Möglichkeit Shell-Sitzungen zu speichern und zu laden und mit formatierten Textanmerkungen zu versehen.

Hey hey, vielen Dank für diese ausführliche Erklärung und gleich die Beispiele dazu. SUPER

By the way. Bin wie beschrieben neu uf dem Gebiet und in diesem Forum. War ne sehr gute Wahl :-)
Euch allen vielen Dank für die engagierte Hilfe

der Kow
__deets__
User
Beiträge: 8090
Registriert: Mittwoch 14. Oktober 2015, 14:29

Freitag 6. März 2020, 19:18

Bitte nicht den gesamten Beitrag davor zitieren. Der steht doch schon da.
Antworten