Interessant in Python: For-Else / While-Else
Seit ich mich mit der Steem-API auseinandersetze, um einen Bot zu programmieren, habe ich auch einiges über Python gelernt. Ich habe überlegt, hier eventuell immer mal einige Dinge vorzustellen, die mir neu waren oder die meines Wissens nach nicht in anderen Programmiersprachen vorhanden sind.
Den Anfang macht:
For-Else / While-Else
Schleifen sind etwas sehr nützliches in der Programmierung. Man kann einen Code eine bestimmte Anzahl Wiederholungen durchlaufen lassen oder viele Variablen nacheinander abarbeiten.
5malige Wiederholung | Zählen | Abarbeiten einer Liste |
---|---|---|
|
|
|
Hi Hi Hi Hi Hi |
0 1 2 3 |
< Item1 > < Item2 > < Item3 > ... |
An diesem Punkt sei erwähnt, dass es auch While-Schleifen gibt, diese aber als Beispiele hier nicht gut taugen und ich sie deshalb nicht weiter beachte.
Es gibt auch für bestimmte Situationen die Möglichkeit, eine Schleife abzubrechen, indem man unter Bestimmten Bedingungen ein break
aufruft. Beispielsweise würde
for i in range(0, 20):
if i > 9:
break
else:
print(i)
print('stopped')
nicht bis 20 zählen, sondern nur bis 10 und stopped
ausgeben, da dort die Schleife abgebrochen wird.
In diesem Beispiel erkennt man auch die If-Else-Struktur. Wenn die Bedingnung zutrifft, dann wird der Block unter IF ausgefüht, sonst der unter ELSE.
Während also in eigentlich allen Sprachen ein If-Else-Konstukt vorhanden ist, kenne ich ein Else nach einer Schleife nur aus Python. Und diese Ungewöhnlichkeit hat etwas sehr positives. Möchte ich beispielsweise aus einer Liste von Posts den ersten herausfiltern, der einen der Tags deutsch
, programming
und python
trägt, muss ich einerseits eine Schleife anlegen, um die Liste der Posts abzulaufen und darin wiederum eine Schleife, die die Liste der Tags des einzelnen Posts durchläuft. Erst dann kann ich mit einer IF-Abfrage überprüfen, ob der einzelne Tag einer der gesuchten ist.
for post in post_list:
for tag in post['tags']:
if tag in wanted_tags:
print(post)
Dieser Code sieht schon gut aus, gibt jedoch noch alle Posts mit diesen Tags aus. Wir wollen aber nur den ersten Post und dann den Code beenden. Aber der erste Versuch dies mit einem break
zu realisieren scheitert. Der Code
for post in post_list:
for tag in post['tags']:
if tag in wanted_tags:
print(post)
break
bricht zwar die Schleife ab, jedoch nur die innere. Das bedeutet, das Programm sucht nur noch bis zum ersten passenden Tag, bricht ab, aber sucht dann im nächsten Post weiter, bis alle Posts durchsucht wurden. Für uns ist also keine Veränderung sichtbar.
Hier kommt der ELSE-Block ins Spiel.
for post in post_list:
for tag in post['tags']:
if tag in wanted_tags:
print(post)
break
else:
continue
break
Tatsächlich sieht dieser Code etwas unlogisch aus, da der ELSE-Block ausgefürt wird, wenn die Schleife nicht abgebrochen wurde. Der Befehl continue
bewirkt in Schleifen den Abbruch des aktuellen Durchgangs und den sofortigen Beginn des nächsten. In diesem Falle würde auch das letzte break
übersprungen werden.
Das bedeutet, das wir, wenn ein passender Tag gefunden und der entsprechende Post ausgegeben wurde, die innere Schleife abgebrochen wird, das continue
ausgelassen und auch die äußere Schleife abbricht.
In anderen Sprachen ist eine gleiche Wirkung etwas umständlicher zu erzielen. Es ist zum Beispiel eine zusätzliche Variable nötig.
(Bsp. Java)
boolean stop = false;
for Post post : post_list{
for Tag tag : post.get("tags"){
if (tag == wanted_tags[0] || tag == wanted_tags[1] || tag == wanted_tags[2]){
System.print(post);
stop = true;
break();
}
if (stop){
break();
}
}
Ich hoffe, es war interessant und einigermaßen verständlich zu lesen. Wenn ja, freue ich mich über einen Vote. Kommentare sind natürlich auch gern gesehen.
Guten Tag,
Ich bin der Germanbot und du hast von mir ein Upvote erhalten! Als Upvote-Bot möchte ich, hochwertigen deutschen Content fördern. Noch bin ich ein kleiner Bot, aber ich werde wachsen.
Jeden Tag erscheint ein Voting Report, in dem dein Beitrag mit aufgelistet wird. Auch werden meine Unterstützer mit erwähnt. Mach weiter so, denn ich schaue öfter bei dir vorbei.
Gruß
GermanBot