Verständnisproblem mit continue Statement

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
ViciousKitty
User
Beiträge: 8
Registriert: Dienstag 17. Dezember 2013, 13:05

Hallo Schlangenfreunde :)

leider hänge ich beim Verständnis des continue Statements.

Das Skript soll die Zahlen 1 bis 5 ausgeben, dabei aber die Drei überspringen.
Also die Ausgabe habe ich mir in etwa so vorgestellt

Code: Alles auswählen

x = 1
while x < 6:
	if x == 3:
		continue
	print x
	x+=1
Tatsächlich scheint das Programm aber zu hängen. Ich verstehe nicht wieso, continue soll doch mit der nächsten Zahl die Schleife wieder durchlaufen, oder verstehe ich da was falsch.
Yelp Help :K
BlackJack

@ViciousKitty: Da verstehst Du etwas falsch. ``continue`` geht *sofort* wieder an den Schleifenanfang sobald es ausgeführt wird. `x` bleibt also immer 3 und damit hängt das Programm dann in einer Endlosschleife.

Das ist hier ja anscheinend nur zu Übungszwecken, aber in echten Programmen solltest Du vielleicht ``continue`` versuchen zu vermeiden. Das macht den Quelltext schwerer zu durchschauen, eben weil es ein unbedingter Sprung an den Schleifenanfang ist, und ist auch sehr selten tatsächlich nötig.

Edit: Der übliche Weg die gewünschte Ausgabe zu erhalten:

Code: Alles auswählen

    for i in xrange(1, 6):
        if i != 3:
            print i
ViciousKitty
User
Beiträge: 8
Registriert: Dienstag 17. Dezember 2013, 13:05

Okay vielen Dank schonmal :)

Wenn ich bei meinem, für Geübte bestimmt grauenhaft anzusehende Skript folgendes ändere klappt es

Code: Alles auswählen

x = 1
while x < 6:
	if x == 3:
		x+=1
		continue
	print x
	x+=1
Ich denke ich hab's jetzt verstanden.

Wenn ich jetzt zB zwei oder mehrere Zahlen überspringen will, hänge ich an die if expression (=Ausdruck?) einfach

Code: Alles auswählen

 ... and i != 4:
dran, oder gibt es da bessere Wege? Und warum hast du eine for-Schleife daraus gemacht? Einfach weil es eleganter aussieht, oder hat das andere Gründe? (Geschwindigkeit)

Bei dem dranhängen habe ich noch ein Verständnisproblem - habs leider noch nicht so mit Mathematik.
Warum muss ich mit ands die Zahlen dranhängen und nicht mit or? Intuitiv hätte ich auf or gesetzt, aber dann passt die Ausgabe nicht - also so, als müsste i dann beide Zahlen gleichzeitig annehmen. Genau anders rum als ich es gedacht habe... Was muss ich mir diesbezüglich im Mathebuch reinpfeifen? Aussagenlogik?

Danke und LG Alina
Benutzeravatar
/me
User
Beiträge: 3556
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

ViciousKitty hat geschrieben:

Code: Alles auswählen

x = 1
while x < 6:
	if x == 3:
		x+=1
		continue
	print x
	x+=1
Der Code könnte so mit weniger Redundanz gestaltet werden:

Code: Alles auswählen

x = 0
while x < 5:
    x += 1
    if x == 3:
        continue
    print x
Wenn es mehrere Zahlen sein sollen, dann kannst du folgendes verwenden:

Code: Alles auswählen

    if x in (3, 4):
Normalerweise setzt man while-Schleifen dann ein, wenn man die Anzahl der Durchläufe nicht kennt. Hier wäre, wie BlackJack bereits geschrieben hat, eine Lösung mit einer for-Schleife vorzuziehen.

Eine kleine Anmerkung noch zum Code: Bitte gewöhne dir direkt an mit 4 Leerzeichen statt mit Tabulatoren einzurücken. Du bist dann konform mit PEP-8 (Style Guide for Python Code).
BlackJack

@ViciousKitty: Nochmal: Der Code ist in der Regel weniger komplex wenn man auf ``continue`` verzichtet. Man muss ja nur die Bedingung umdrehen und das was man machen will in den ``if``-Zweig schreiben.

An der ``for``-Schleife solltest Du doch direkt sehen können warum die besser ist: Man muss vor der Schleife `x` nicht initialisieren und in der Schleife `x` nicht selber hoch zählen.

Falls es tatsächlich um so wenige feste Zahlen gehen, könnte man auch direkt die Daten hinschreiben und sich das ``if`` sparen.
Benutzeravatar
snafu
User
Beiträge: 6741
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Zum Logik-Problem: Bei ``if zahl != 3 and zahl != 4: print zahl`` ist das ``and`` nötig, weil die Bedingung ja nur auf Zahlen zutreffen soll, die gleichzeitig nicht 3 und nicht 4 sind. Bei einem ``or`` (was ohne Zweifel erstmal näher an der natürlichen Sprache ist - besonders für mathematisch weniger geübte Sprecher) wäre für alle Zahlen, außer der 3 immer ``True`` rausgekommen. Der Grund dafür ist, dass für den Wahrheitswert eines ``or``-Ausdrucks nur wichtig ist, ob auf einer der beiden Seiten ``True`` rauskommt. Dann wird gesamte Ausdruck nämlich automatisch wahr. Wenn du jetzt z.B. eine 4 hast, dann kommt ``True`` raus, da ja für die linke Seite bereits ``4 != 3`` gilt. Das heißt: Alle Zahlen, die sozusagen bei der ersten "Eingangskontrolle" durchgelassen werden (also ein ``True`` erhalten), kommen anschließend ohne weitere Prüfung durch alle weiteren Kontrollen durch, da sie aufgrund ihres ``True``-VIP Ausweises einfach nur noch durchgewunken werden. Vielleicht hilft dir diese tolle Metapher ja irgendwie weiter. :mrgreen:
ViciousKitty
User
Beiträge: 8
Registriert: Dienstag 17. Dezember 2013, 13:05

Danke :)

Ja, ich war nur verwundert, dass da plötzlich eine for Schleife in der Antwort kam ^^
Die ist doch irgendwie schon arg anders in Python als ich sie aus Java mal kennen gelernt habe.

Das Beispiel entsprang nur meinem wirren Kopf, wollte nur ein einfaches Beispiel für continue suchen.
Aber auch wenn es so unleserlich ist, es wird doch sicher auch Anwendungsfälle dafür geben?
Danke für den Hinweis mit in(), das ist praktisch :)

/me danke für die Verbesserung, darauf wäre ich wohl nicht gekommen und hätte mich mit meiner Version erstmal zufrieden gegeben ^^
Bezüglich der Leerzeichen. Ist das sozusagen konvention?
Du meintest mein Code ist redundant und das sehe ich wenn ich's mit deinem Vergleiche, aber warum tut man sich das mit den Leerzeichen an, anstelle von Tab? Und das dann direkt vier mal?
Was wenn man mal vier Verschachtelungen hat, da klopft man dann wirklich 16x auf die Leertaste? Ist das nicht auch eine Art Redundanz?

snafu, danke, die Vorstellung hilft ein wenig dabei - und wenn ichs mir etwas genauer überlege macht das dann Sinn. Aber du hast das gut erkannt, dass es für matheferne Menschen ein wenig seltsam wirkt :mrgreen:

LG Alina
Benutzeravatar
snafu
User
Beiträge: 6741
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Wegen den Leerzeichen: Geh mal in die Einstellungen deines Editors bzw deiner IDE. Dort wird irgendwo ein Bereich sein, wo man die Tabulorbreite ändern kann. In diesem Bereich müsstest du auch eine Option finden, damit der Editor Leerzeichen anstatt Tabs verwendet.

EDIT: Und wegen der ``for``-Schleife: So kompliziert ist das gar nicht mal. Ein ``for i in range(n)`` in Python entpricht einem ``for (int i = 0; i < n; i++)`` in Java. Mehr muss für den Anfang meist nicht wissen. Höchstens noch, dass Anfänger mit diesem Wissen gerne Fehler machen, dass sie Dinge wie ``for i in range(len(meine_liste)): do_something(meine_liste)`` schreiben. Tu das bloß nicht...! :twisted:
Zuletzt geändert von snafu am Dienstag 17. Dezember 2013, 15:26, insgesamt 2-mal geändert.
ViciousKitty
User
Beiträge: 8
Registriert: Dienstag 17. Dezember 2013, 13:05

Okay, danke.
Hatte bisher nur in der Command Line geschrieben. Da dachte ich mir wie nervig das sein muss die Leerzeichen mitzählen zu müssen :o
Antworten