Datentyp bool
Sie kennen bisher drei Datentypen: int
für Ganzzahlen, float
für Dezimalzahlen und str
für Text.
Doch was passiert eigentlich, wenn wir die Bedingung aus einer while
-Schleife oder einer if
-Verzweigung in eine Variable abspeichern? Schauen wir uns das mal an.
Hier ein Beispiel, das Sie bereits kennen:
from random import *
wurf = randint(1, 6)
print('Gewürfelt: ' + str(wurf))
if wurf < 4:
print('Du hast gewonnen!')
Die Bedingung auf Zeile 6 können wir problemlos in eine Variable auslagern:
from random import *
wurf = randint(1, 6)
print('Gewürfelt: ' + str(wurf))
gewonnen = wurf < 4
if gewonnen:
print('Du hast gewonnen!')
Die Variable gewonnen
ist nun weder ein int
, noch ein float
, und definitiv kein str
. Es handelt sich hierbei um einen neuen Datentyp – nämlich um einen bool
, oder Boolean1. Booleans sind speziell, denn sie können genau zwei Werte annehmen: True
(wahr, ja, 1, zutreffend, …) und False
(falsch, nein, 0, nicht zutreffend, …).
Für Boolean-Variablen gibt es nur zwei mögliche Werte: nämlich True
und False
(ohne Anführungszeichen).
Im obigen Beispiel schreiben wir aber nicht
gewonnen = True
oder
gewonnen = False
Das wäre zwar erlaubt und wird auch oft gemacht. In unserem Programm soll der Wert von gewonnen
aber natürlich vom gewürfelten wurf
abhängig sein. Wir schreiben deshalb:
gewonnen = wurf < 4
Dabei ist wurf < 4
ein sogenannter boolescher Ausdruck: Das ist quasi eine Art "Rechnung", deren Ergebnis nicht eine Zahl, sondern eben entweder True
oder False
ist. Schauen wir uns ein paar mögliche Ergebnisse dieses booleschen Ausdrucks an:
wurf (Datentyp: int ) | wurf < 4 (Datentyp: bool ) |
---|---|
1 | True |
2 | True |
3 | True |
4 | False |
5 | False |
6 | False |
… | … |
Nun können wir unsere Datentypen-Übersicht vervollständigen:
Datentyp | Langbezeichnung | Bedeutung | Beispiel |
---|---|---|---|
int | Integer | Ganzzahl | x = 20 |
float | Floating Point Number | Dezimalzahl (Gleitkommazahl) | x = 2.0 |
str | String | Text | x = '20' x = 'Hallo' |
bool | Boolean | Binärer Wahrheitswert (True oder False ) | x = True |
Boolesche Operatoren
Boolesche Ausdrücke sind also "Rechnungen", deren Ergebnis entweder True
oder False
ist. Bei diesen Rechnungen sind zwei Arten von Operatoren relevant:
- Vergleichsoperatoren
- Erzeugen Werte von Typ
bool
.- Beispiele:
<
,>
,==
, etc. - Beispiele:
- Boolesche (logische) Operatoren
- Operieren auf Werten vom Typ
bool
.- Beispiele:
and
,or
,not
. - Beispiele:
Mit booleschen Operatoren (auch logische Operatoren genannt) können wir mehrere boolesche Werte (resp. Ausdrücke) miteinander "verbinden". Nehmen wir an, wir haben die folgenden zwei booleschen Ausdrücke:
wurf < 4
wurf > 1
Wir möchten nun ausdrücken, dass man gewonnen hat, wenn der Wurf kleiner als 4 und grösser als 1 ist. Dazu brauchen wir den logischen Operator and
:
gewonnen = wurf < 4 and wurf > 1
Das ganze Konstrukt wurf < 4 and wurf > 1
nennen wir auch wieder einen booleschen Ausdruck.
Wenn wir mit einem Würfel im Bereich 1-6 arbeiten, könnten wir die gleiche Gewinnbedingung auch so ausdrücken: Man hat gewonnen, wenn man entweder eine 2 oder eine 3 würfelt. Dazu brauchen wir den logischen operator or
:
gewonnen = wurf == 2 or wurf == 3
Zur besseren Lesbarkeit kann es auch helfen, die booleschen Ausdrücke je in Klammern zu packen:
gewonnen = (wurf == 2) or (wurf == 3)
Die folgenden logischen Operatoren sind beim Programmieren wichtig:
Operator | Beispiel | Name / Beschreibung | Wahrheitswert |
---|---|---|---|
and | a and b | logisches und | Ist genau dann wahr, wenn a und b wahr sind. |
or | a or b | logisches oder | Ist genau dann wahr, wenn a oder b oder beide wahr sind. |
not | not a | Negation | Ist genau dann wahr, wenn a falsch ist. |
Die Wahrheitswerte dieser Operatoren sind in folgender Tabelle zusammengefasst:
a | b | a and b | a or b | not a | not b |
---|---|---|---|---|---|
False | False | False | False | True | True |
False | True | False | True | True | False |
True | False | False | True | False | True |
True | True | True | True | False | False |
Verkettung logischer Operatoren
In einer "normalen" Rechnung können mehrere Additionen, Multiplikationen, etc. vorkommen. Genauso können in einem booleschen Ausdruck auch mehrere logische (boolesche) Operatoren vorkommen. Dabei gelten (fast) die gleichen Regeln wie in der arithmetischen Mathematik:
not
vorand
voror
(fast wie Punkt vor Strich).- Klammern werden zuerst ausgerechnet – und zwar von innen nach aussen.
- Abgesehen davon wird von links nach rechts ausgerechnet.
Welchen Wert hat also die Variable ergebnis
, wenn wir dieses Programm ausführen? Stellen Sie zuerst eine Vermutung auf und probieren Sie es dann aus.
ergebnis = True or False and False
print(ergebnis)
Erklärung
Hier wird wie folgt ausgerechnet:
- Das
and
wird vor demor
ausgerechnet.False and False
gibtFalse
. Es bleibt:ergebnis = True or False
. True or False
gibtTrue
. Es bleibt:ergebnis = True
.
Mit gezielter Klammersetzung können wir die Reihenfolge verändern, in der die Werte ausgerechnet werden. Wie lautet hier nun das Ergebnis?
ergebnis = (True or False) and False
print(ergebnis)
Erklärung
Jetzt wird wie folgt ausgerechnet:
- Die Klammern werden zuerst ausgerechnet.
True or False
gibtTrue
. Es bleibt:ergebnis = True and False
. True and False
gibtFalse
. Es bleibt:ergebnis = False
.
Und noch ein letztes Beispiel: Wie lautet hier das Ergebnis?
ergebnis = (True or False) and not False
print(ergebnis)
Erklärung
Jetzt wird wie folgt ausgerechnet:
- Die Klammern werden zuerst ausgerechnet.
True or False
gibtTrue
. Es bleibt:ergebnis = True and not False
. - Das
not
wird vor demand
ausgerechnet.not False
gibtTrue
. Es bleibt:ergebnis = True and True
. True and True
gibtTrue
. Es bleibt:ergebnis = True
.
Theorieaufgaben
Vervollständigen Sie die Tabelle, indem Sie jeweils den Wahrheitswert (True
oder False
) des angegeben logischen (boolschen) Ausdrucks mit den entsprechenden Variablenwerten ausrechnen.
Überprüfen Sie Ihre Antworten, indem Sie jeweils auf den -Button klicken.
a | b | c | logischer Ausdruck | Wahrheitswert |
---|---|---|---|---|
True | False | False | a and b and c | |
True | False | False | a or b or c | |
False | False | False | a or b or c | |
True | True | a or b | ||
True | False | a and not b | ||
True | False | not a and b | ||
False | True | not(a and b) | ||
4 == 4 | 10 != 20 | a and b | ||
7 | 12 | a >= b | c or a < 10 |
Übungen
Programmieren Sie ein neues Würfelspiel: Diesmal sollen zwei Würfel (je 1-6) gerollt werden. Gewonnen hat man, wenn beide Würfel die gleiche Zahl zeigen, oder wenn beide Würfel mindestens eine 5 zeigen (oder beides).
Das Programm soll zuerst die beiden Würfelergebnisse ausgeben, und danach entweder Gewonnen
oder Verloren
ausgeben.
Beispiel:
Erster Würfel: 5
Zweiter Würfel: 6
Gewonnen
Entwickeln Sie eine einfache Meteo-App, die bei der richtigen Kleiderauswahl hilft.
Stellen Sie dem Benutzer dazu die folgenden zwei Fragen:
Scheint die Sonne? (ja / nein)
Den wievielten Monat haben wir momentan? (1-12)
Wenn die Sonne scheint und wir uns nicht in einem Wintermonat (Dezember, Januar, Februar) befinden, soll der Text Keine Jacke nötig.
ausgegeben werden. Andernfalls soll Jacke anziehen!
ausgegeben werden.
Fragen Sie die Benutzerin nacheinander nach drei Noten (Dezimalzahlen sollen erlaubt sein).
Geben Sie dann entweder Bestanden
oder Nicht bestanden
aus. Um zu bestehen, müssen alle diese Bedingungen gelten:
- Der Durchschnitt muss genügend (d.h. mindestens eine 4) sein.
- Kompensation: Es darf maximal eine Note ungenügend sein, oder es muss mindestens eine 6 dabei sein.
- Es darf keine 1 dabei sein.
Damit Ihr Code übersichtlich bleibt, können Sie für die einzelnen Bedingungen jeweils Variable erstellen, die Sie dann wieder mit logischen Operatoren verknüpfen.
Footnotes
-
dt. boole'sch[er Wert], benannt nach dem englischen Mathematiker 👉 George Boole. ↩