Die break-Anweisung in Python
- Die break-Anweisung
Anweisung
.-------.
--->| break |--->
'-------'
Mit der break-Anweisung wird die Ausführung der (innersten) umgebenden Schleife beendet.
main.py
while True:
print( 'abc' )
break
print( 'def' )
print( 'ghi' )
- Protokoll
abc
ghi
Man kann gedanklich direkt hinter die while-Anweisung eine pass-Anweisung einfügen und sich dann vorstellen, daß unmittelbar nach der Ausführung der break-Anweisung die Ausführung des Programms beginnend bei jener pass-Anweisung fortgesetzt wird.
- Programm
while True:
print( 'abc' )
break
print( 'def' )
pass
print( 'ghi' )
- Ausgabe
abc
ghi
Anwendungsbeispiel
Das folgende Programm gibt Quadrate eingegebener Zahlen aus, bis »0« eingegeben wird. Es hat aber zwei unschöne Eigenschaften:
- Vor der Schleife muß eine Bindung an die Schleifenvariable erfolgen, damit die Schleife überhaupt erst einmal beginnt.
- Die Schleifenvariable wird bei jedem Durchlauf der Schleife zweimal geprüft.
- Programm
x = 1
while x:
x = int( input( 'Zahl (0 zum Beenden)? ' ))
if x: print( 'Quadrat = ' + str( x*x ))
print( 'Ende' )
Durch eine True-Schleife mit »break« können beide Probleme vermieden werden.
- Programm
while True:
x = int( input( 'Zahl (0 zum Beenden)? ' ))
if x == 0: break
print( 'Quadrat = ' + str( x*x ))
print( 'Ende' )
Man nennt solch eine Schleife auch „Schleife und eine halbe“, da die Schleife beim letzten Durchlauf nur „zur Hälfte“ (im Sinne von „teilweise“) durchlaufen wird.
Zahlenraten mit »break«
Für dieses Beispiel nehmen wir an, daß ein Modul »user« mit einer Funktion »get« angelegt wurde, die eine Zahl vom Benutzer einliest.
user.py
def get( prompt='' ):
return int( input( prompt ))
Das Zahlenratespiel kann die Anweisungen »break« nun verwenden, um aus der Ratenschleife auszubrechen, sobald die richtige Zahl eingegeben wurde.
main.py
from random import random
from user import getzahl = int( random() * 100 )
print( "Ich habe mir eine Zahl zwischen 0 und 99 ausgedacht." )while True:
eingabe = get( "Welche Zahl habe ich mir ausgedacht? " )
if eingabe > zahl:
print( "Zu groß!" )
elif eingabe < zahl:
print( "Zu klein!" )
else:
print( "Richtig!" )
break
Übungsfragen
? Übungsfrage
Was gibt das folgende Programm aus?
main.py
x = 3
while x < 8:
x = x + 2
if x == 5: break
print( x )
if x == 6: break
print( 'Ende' )
? Übungsfrage
Was gibt das folgende Programm aus?
main.py
x = 2
while x < 9:
x = x + 2
if x == 5: break
print( x )
if x == 6: break
print( 'Ende' )
Übungsaufgaben
/ Übungsaufgabe
Schreiben Sie die while-Schleife aus dem folgenden Beispiel so um, daß sich die Schleife weiterhin verhält wie im Beispiel, aber nach Eingabe von »0« nichts mehr ausgegeben wird.
Eine ähnliche Aufgabe wurde früher schon einmal gestellt. Bei der Lösung dieser Aufgabe hier soll nun »break« verwendet werden.
- Beispiel 0
x = 1
while x:
x = int( input( 'Zahl (0 zum Beenden)? ' ))
print( 'Quadrat = ' + str( x*x ))
- Möglicher Konsolendialog
Zahl (0 zum Beenden)? 2
Quadrat = 4
Zahl (0 zum Beenden)? 9
Quadrat = 81
Zahl (0 zum Beenden)? 0
Quadrat = 0
- (Ende des Programms)
/ Übungsaufgabe
Schreiben Sie eine Funktion, welche zu einer nicht-negativen ganzen Zahl n, die Liste aller Dezimalnumeralia nicht-negativer ganzer Zahlen von 0 bis n (ausschließlich) als Zeichenfolge ergibt (in aufsteigender Reihenfolge), wobei benachbarte Numeralia durch das Zeichenpaar », « (Komma und Leerzeichen) getrennt sein sollen.
Beispielsweise sollte ein Aufruf der Funktion mit dem Zahlenwert «3» die Zeichenfolge »0, 1, 2« ergeben.
Empfehlungen zur Vorgensweise: Zuerst die Dokumentation (einschließlich Tests) schreiben. Gedächtnisstütze für bei Modultests verwendete Schreibweisen: »from doctest import testmod«, »"""«, »>>> « und »testmod()«.
Vereinfachte Aufgabenstellung:
Eine Funktion soll eine Zahlenliste wie "0, 1, 2" ergeben.
Zwischen zwei Zahlen soll in dem Text immer ein Komma und ein Leerzeichen stehen.
Die erste Zahl soll 0 sein, die nächste Zahl 1, die nächste Zahl 2 und so weiter.
Diese Funktion wird mit einer Zahl als Argument aufgerufen.
Die größte Zahl der Zahlenliste soll eins weniger als der Wert dieses Arguments sein.
Beispielsweise kann jemand die Funktion mit dem Argumentwert 5 aufrufen.
Dann soll das Ergebnis der Funktion "0, 1, 2, 3, 4" sein.
Exercise text in English: Write a function that, given a non-negative integer n, will return a string with a list of all decimal numerals of non-negative integers from 0 up to n (excluding n ) as a string with adjacent numerals separated by the character pair », « (a comma and a space). For example, a call to the function with the number «3» should result in the string »0, 1, 2«.
Simplified exercise text in English:
A function should return a list of numbers as a string, such as "0, 1, 2".
There should always be a comma and a space between two numbers.
The first number should be 0, the next number 1, the next number 2 and so on.
The function is called with one number as an argument.
The largest number in the list should be one less than the value of this argument.
For example, someone may call the function with the argument value 5.
Then the result of the function should be “0, 1, 2, 3, 4”.
Strukturierte Programmierung ⃗
Ein Eingang eines Programmstücks besteht aus einem Teil eines Programmstücks, der beim Ablauf eines Programms zuerst ausgeführt werden könnte (vor anderen Teilen des Programmstücks).
- Ein Eingang einer while-Schleife
Eingang
|
|
Vwhile True:
x = int( input( 'Zahl (0 zum Beenden)? ' ))
if x == 0: break
print( 'Quadrat = ' + str( x*x ))
print( 'Ende' )
Ein Ausgang eines Programmstücks besteht aus einem Teil des Programmstücks, das als letztes ausgeführt werden kann und einem Teil außerhalb des Programmstücks, der als nächster ausgeführt werden kann (der zweite Teil kann auch das Ende des Programm sein).
- Ein Ausgang einer while-Schleife
while True:
x = int( input( 'Zahl (0 zum Beenden)? ' ))
if x == 0: break ---.
.---------------------------'
| print( 'Quadrat = ' + str( x*x ))
'-> print( 'Ende' )
Die Schule der strukturierten Programmierung verlangt, daß jede Anweisung nur genau einen Eingang und genau einen Ausgang hat. Dies ist bei der obigen True-Schleife der Fall! Der Eingang befindet sich am Anfang der Schleife und der Ausgang bei »break«.
Schleifen mit »break« könnten unübersichtlich werden, wenn es hinter »while« eine kompliziertere Bedingung als »True« gibt, oder mehrere break-Ausgänge verwendet werden.
Schleifen mit genau einem Eingang und genau einem Ausgang sollten bevorzugt werden, weil sie es einfacher machen, Anweisungen zum Programm hinzuzufügen, die vor oder hinter der Schleife ausgeführt werden sollen. Allerdings kann es besser sein, Abweichungen von dieser Regel in Kauf zu nehmen, wenn ihre Befolgung Nachteile mit sich bringt, welche die Vorteile ihrer Einhaltung überwiegen. Verstöße gegen diese Regel sind weniger schlimm, wenn alle Ausgänge eines Programmstücks zur selben Fortsetzung gehen oder wenn das betreffende Programmstück sich in einer Funktion befindet, deren Quelltext nur klein ist.