{ "cells": [ { "cell_type": "markdown", "metadata": { "pycharm": { "name": "#%% md\n" }, "slideshow": { "slide_type": "slide" } }, "source": [ "# Software Entwicklung \n", "\n", "## Kapitel 2: Kontrollfluss" ] }, { "cell_type": "markdown", "metadata": { "pycharm": { "name": "#%% md\n" }, "slideshow": { "slide_type": "slide" } }, "source": [ "### 2.6 Schleife \n", "\n", "Häufig möchte man eine oder mehrere Anweisungen wiederholen, solange eine *Laufbedingung* erfüllt ist.\n", "Ein solcher Kontrollfluss wird auch als *Schleife* bezeichnet. Sofern die Bedingung geprüft wird, bevor\n", "die zu wiederholende Anweisung ausgeführt wird, spricht man von einer *kopfgesteuerten Schleife*.\n", "Wird erst nach der Ausführung überprüft, ob eine Wiederholung stattfinden soll, so handelt es\n", "sich um eine *fußgesteuerte Schleife*.\n", "\n", "![kopfgesteuerte Schleife](../img/SchleifeKopf.png \"Kopfgesteuerte Schleife\") " ] }, { "cell_type": "markdown", "metadata": { "pycharm": { "name": "#%% md\n" }, "slideshow": { "slide_type": "slide" } }, "source": [ "Mit dem Schlüsselwort while wird in Python eine kopfgesteuerte Schleife begonnen. Die Laufbedingung\n", "folgt unmittelbar danach abgeschlossen mit einem Doppelpunkt. Die zu wiederholenden Anweisungen werden\n", "wieder als eingerückter Block angegeben. Diesen Block nennt man auch *Schleifenrumpf*." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "pycharm": { "is_executing": false, "name": "#%%\n" } }, "outputs": [], "source": [ "a = 1\n", "\n", "while a < 10:\n", " print(a)\n", " a = a + 1\n", " \n", "print(\"Fertig\")" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "Eine Schleife kann jederzeit abgebrochen werden, wenn im Schleifenrumpf das Schlüsselwort break \n", "auftaucht. Die Schleife wird dann sofort verlassen und die Ausführung mit dem nächsten Befehl nach dem Schleifenrumpf\n", "fortgesetzt. Aufgrund der besseren Lesbarkeit sollte break eher sparsam eingesetzt werden." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "pycharm": { "is_executing": false, "name": "#%%\n" } }, "outputs": [], "source": [ "a = 1\n", "\n", "while a < 10:\n", " print(a)\n", " if a == 5:\n", " break\n", " a = a + 1\n", "\n", "print(\"Fertig\", a)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "In Python gibt es zunächst einmal nur kopfgesteuerte Schleifen, jedoch können fußgesteuerte Schleifen\n", "recht einfach nachgebaut werden. Auch hier gilt wieder der Verweis auf eine bessere Lesbarkeit durch einen sparsamen Einsatz von break. Endlosschleifen sollten generell vermieden werden." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "pycharm": { "is_executing": false, "name": "#%%\n" } }, "outputs": [], "source": [ "a = 1\n", "\n", "while True:\n", " print(a)\n", " a = a + 1\n", " if a >= 6:\n", " break\n", "\n", "print(\"Fertig\")" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "Neben dem vollständigen Schleifenabbruch mit break kann mittels continue auch nur der \n", "aktuelle Schleifendurchlauf abgebrochen werden. Aufgrund besserer Lesbarkeit sollte man sich aber immer die Frage stellen, ob sich ein continue nicht auch vermeiden lässt, z.B. durch entsprechende bedingte Ausführungen." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "pycharm": { "is_executing": false, "name": "#%%\n" } }, "outputs": [], "source": [ "a = 0\n", "\n", "while a < 10:\n", " a = a + 1\n", " if a % 2 != 0:\n", " continue\n", " print(a)\n", "\n", "print(\"Fertig\")" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "Eine eher selten anzutreffende Variante ist die Verwendung eines optionalen else nach einer \n", "while-Schleife. Der else-Zweig wird dann ausgeführt, wenn die Laufbedingung \n", "nicht erfüllt ist *und* die Schleife nicht mit break verlassen wird. " ] }, { "cell_type": "code", "execution_count": null, "metadata": { "pycharm": { "is_executing": false, "name": "#%%\n" } }, "outputs": [], "source": [ "a = 5\n", "\n", "while a > 0:\n", " print(a)\n", " if a < -1:\n", " break\n", " a = a - 1\n", "else:\n", " print(\"Else!\")\n", "\n", "print(\"Fertig\")" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "Python bietet zudem eine for-Schleife an, mit der speziell Listen bzw. iterierbare Konstrukte durchlaufen werden können. Wir werden diese im Zusammenhang mit Listen in einem späteren Kapitel genauer betrachten." ] } ], "metadata": { "celltoolbar": "Slideshow", "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.9.9" }, "pycharm": { "stem_cell": { "cell_type": "raw", "metadata": { "collapsed": false }, "source": [] } } }, "nbformat": 4, "nbformat_minor": 1 }