Kontrollfluss in PythonInhaltDas dritte Kapitel geht auf die Steuerung des Kontrollflusses von Programmen durch Bedingungen und Schleifen ein und deckt die folgenden Konzepte ab:
Ein Kernkonzept vieler Programmiersprachen ist die bedingte Ausführung von Teilen des Quelltextes. Hierdurch lassen sich Entscheidungen treffen und Abläufe definieren. In Python gibt es hierfür, wie in vielen anderen Sprachen auch, das Schlüsselwort if.
Ausführung vom Programm
>>> python3 ifStatement.py
do something
executed because the condition is true
Natürlich macht ein Beispiel wie oben, wo fest “True” oder “False” im Quelltext steht, in der Regel keinen Sinn. Stattdessen nutzt man Bedingungen. Häufig will man, dass eine Aktion ausgeführt wird, falls eine Bedingung erfüllt ist, und eine andere, falls die Bedingung nicht erfüllt ist. Hierzu gibt es das Schlüsselwort else. Der Block nach dem else wird nur dann ausgeführt, falls die Bedingung nicht zu trifft. Man hat also ein "entweder/oder" Konstrukt.
Ausführung vom Programm
>>> python3 if_else_Bedingung.py
Please type an integer: 13
The number is odd.
Will man zwischen mehr als zwei Fällen unterscheiden, gibt es in anderen Programmiersprachen wie java zum Beispiel switch Anweisungen oder das hintereinanderschalten von mehreren if/else blöcken (else if). In Python gibt es einen ähnlichen Ansatz durch das Schlüsselwort elif. Hierdurch lassen sich mehrere Bedingungen kombinieren. Man beginnt mit einem if, dann folgen beliebig viele elif, zuletzt kann man auch noch ein else benutzen.
Ausführung vom Programm
>>> python3 if_elif_Bedingung.py
Please type an integer: 42
The number is greater than 10 and less than 100.
BlöckeAls Nebenprodukt der if Anweisungen wurden oben bereits Blöcke verwendet. Blöcke sind Quelltextteile, die Sequentiel abgearbeitet werden. In Java werden Blöcke zum Beispiel durch Klammerung definiert ({}). In Python wird auf derartige Klammern verzichtet. Stattdessen zählt die die Einrückung. Zeilen in der gleichen Einrückungstiefe gehören zum gleichen Block. Üblicherweise verwendet man vier Leerzeichen pro Block als Einrückungstiefe, eine beliebige Anzahl von Leerzeichen oder auch Tabulatoren ist jedoch möglich. Wichtige zu beachtende Eigenschaften bezüglich der Einrückung in Python sind:
Man kann Blöcke ineinerander Verschachteln, wenn man zum Beispiel innerhalb eines Blocks eine weitere Bedingung überprüfen möchte. Komplett leere Blöcke, also Blöcke ohne jeglichen Quelltext sind in Python nicht möglich. Dies folgt direkt aus der Tatsache, das Blöcke über die Einrückung des Quelltextes definiert werden. Benötigt man dennoch einen leeren Block, zum Beispiel aus syntaktischen Gründen oder weil man einen nicht behandelten Sonderfall kommentieren möchte, kann man dies mit Hilfe des Schlüsselworts pass umsetzen.
Ausführung vom Programm
>>> python3 if_else_Bloecke.py Please type an integer: -42 The number is even. The number is also negative. >>> python3 if_else_Bloecke.py Please type an integer: -42 The number is even. SchleifenSchleifen sind das Mittel der Wahl, um die gleichen Anweisungen mehrfach auszuführen. In der Regel ändern sich die Daten mit jeder Wiederholung der Ausführung einer Schleife. In Python gibt es zwei Arten von Schleifen: while und for Schleifen. 1. While SchleifenDas Konzept von while ist, dass ein Block solange wiederholt wird, bis eine festgelegte Bedingung erfüllt wird. Die Syntax ist daher grundsätzlich ähnlich zum if. Ausführung While Schleife
>>> count = 0 >>> while count<10: ... count += 1 # same as count=count+1 ... print(count) ... 1 2 3 4 5 6 7 8 9 10 Mit den bisher eingeführten Konzepten ist Python bereits Turingvollständig, man kann also theoritisch jeden Algorithmus programmieren. Das Beispiel unten zeigt, wie man mit Hilfe einer while Schleife und dem Heron-Verfahren die Quadratwurzel einer beliebigen ganzen Zahl $$ x_{n+1} = {{1 \over 2 } \cdot ({x_n + a \over x_n})}$$ Die Folge konvergiert für eine beliebe positive Zahl als Startwert \(x_1\) gegen \(\sqrt{a}\). Die Abbruchbedingung der Schleife ist die Abweichung des Quadrats von \(x_n\) von \(a\). <\p>
Ausführung vom Programm
>>> python3 while.py
Please type a positive number: 4.2
2.6
2.1076923076923078
2.0501965188096576
2.049390311768306
2. For SchleifenDer zweite Typ von Schleifen in Python sind for Schleifen. Mit for Schleifen iteriert man über Sequenzen von Daten, zum Beispiel Listen oder Sets. Der Vorteil von for Schleifen ist, dass man sehr einfach Aktionen für alle Elemente einer Sequenz durchführen kann, zum Beispiel alle Elemente einer Liste ausgeben. Da Zeichenketten auch Sequenzen sind, kann man auch über die einzelnen Buchstaben iterieren. Auf diese Art kann man zum Bespiel nur die Großbuchstaben ausgeben. Ausführung for Schleife
>>> for item in [1, 2, 3, 4, 5, 6]: ... print(item) ... 1 2 3 4 5 6 >>> for char in "Hello World!": ... if char.isupper(): ... print(char) # only print uppercase letters ... H W Die for Schleifen in Python sind for-each Schleifen, da für jedes Element einer Sequenz etwas durchgeführt wird. Dies ist anders als in C-Style for Schleifen, die über ein Inkrement und ein Abbruchkriterium definiert werden. In C, for Schleifen iteriert daher häufig über den index einer Sequenz. Will man zum Beispiel über zwei Listen gleichzeitig iterieren, muss man auch in Python auf ähnliche Art durch Sequenzen iterieren können. An dieser Stelle hilft die range() Funktion. Mit Hilfe von range lassen sich logische Sequenzen über Zahlen definieren, basierend auf einem Startwert, einem Stopwert, und einer Schrittgröße. Da es sich bei range um logische Sequenzen handelt, werden die einzelnen Werte nicht generiert. Das ist insbesondere bei einer besonders großen Anzahl von Werten innerhalb einer range hilfreich, da hierdurch viel Laufzeit und Arbeitsspeicher gespart wird. Will man die Werte eine range physisch im Arbeisspeicher generieren, muss man diese in eine Liste umwandeln. range-Funktion
>>> # logical range of values between 0 (inclusive) and 10 (exclusive), values not created >>> print(range(10)) range(0, 10) >>> # creates a list from the range, values are created >>> print(list(range(10))) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> # range between 1 (inclusive) and 10 (exclusive) >>> print(list(range(1,10))) [1, 2, 3, 4, 5, 6, 7, 8, 9] >>> # range between 1 (inclusive) and 10 (exclusive) and a step size of 2 >>> print(list(range(1,10,2))) [1, 3, 5, 7, 9] >>> # negative steps also possible >>> print(list(range(9,-1,-1))) [9, 8, 7, 6, 5, 4, 3, 2, 1, 0] >>> # be careful that not to mix up start and stop, this could lead to empty ranges >>> print(list(range(0,10,-1))) [] Durch range ist es sehr einfach mit Python eine C-Style for Schleife umzusetzen. Ausführung for mit range-Funktion
>>> list_one = [1, 2, 4, 8, 16] >>> list_two = [1, 3, 9, 27, 81] >>> for i in range(len(list_one)): ... print(list_one[i]+list_two[i]) ... 2 5 13 35 97 3. break and continueEs gibt Situationen, in denen man einen Schleifendurchlauf vorzeitig beenden möchte. Hierzu dienen die Schlüsselwörter break und continue. Bei einem break verlässt man den Block der Schleife komplett. Ein typischer Anwendungsfall von break ist das Suchen nach dem ersten Auftauchen eines bestimmten Ereignisses. break-Funktion
>>> for char in "aldkfjsdlfkasldkjsadJlaskdKLjasd": ... if char.isupper(): ... print(f"found first upper case character: {char}") ... break # stop loop, we only want the first occurance ... found first upper case character: J Bei einem continue wird der aktuelle Schleifendurchlauf vorzeitig beendet und der nächste Durchlauf beginnt. continue wird typischerweise aus Effizienzgründen eingesetzt um den Rest vom Schleifendurchlauf zu überspringen. Ein weiterer Grund für den Einsatz von continue ist die Reduktion der Blocktiefe. Im folgenden Beispiel wird durch das continue kein else benötigt, wodurch die Blocktiefe der zweiten print Anweisung reduziert ist. continue-Funktion
>>> for value in range(1,10):
... if value%2==0:
... print(f"even number: {value}")
... continue
... print(f"odd number: {value}")
...
odd number: 1
even number: 2
odd number: 3
even number: 4
odd number: 5
even number: 6
odd number: 7
even number: 8
odd number: 9
Man muss beachten, dass es sich bei break und continue um unconditional jumps handelt, also Sprünge innerhalb des Kontrollflusses, die nicht direkt an eine Bedindung geknüpft sind. Derartige Sprünge sollten nach Möglichkeit vermieden werden. Man sollte zum Beispiel continue nur zur Reduzierung der Blocktiefe benutzen, wenn besonders viele Anweisungen betroffen sind und nicht für einzelne Anweisungen wie im obigen Beispiel. 4. Enumerateenumerate ist eine Hilfsfuntion, mit der man über Elemente einer Sequenz mit einer for Schleife iterieren kann, so dass man auch den Index des aktuellen Elements kennt. Der Rückgabewert von enumerate ist ein Iterator über Tupel, wobei die Tupel aus Paaren vom Index und Wert von Elementen einer Sequenz bestehen. enumerate-Funktion
>>> my_list = [1,2,3,4] >>> for enumerated_item in enumerate(my_list): ... print(enumerated_item) ... (0, 1) (1, 2) (2, 3) (3, 4) Die Tupel die bei enumerate entstehen werde üblicherweise direkt mit Hilfe von unboxing zwei Variablen zugewiesen, dem Index und dem Element der Sequenz. enumerate2-Funktion
>>> my_list = [1,2,3,4] >>> for i,item in enumerate(my_list): ... print(f"item at index {i}: {item})") ... item at index 0: 1) item at index 1: 2) item at index 2: 3) item at index 3: 4)
|