Interessant in Python: For-Else / While-Else

in #deutsch6 years ago

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
for i in range(0, 5):
    print('Hi')
for i in range(0, 4):
    print(i)
for item in list_of_items:
    print(item)
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, programmingund 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.


Gute Nacht :)

Sort:  

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

Coin Marketplace

STEEM 0.19
TRX 0.18
JST 0.033
BTC 87739.92
ETH 3095.67
USDT 1.00
SBD 2.77