While-Schleifen & Dictionaries#

while-Schleifen#

Gib mithilfe einer while-Schleife alle ungeraden Werte der gegebenen Liste aus.

# Dein Code
Hide code cell source
"""
Grundsätzlich ist es möglich jede for-Schleife auch als while-Schleife zu definieren
und umgekehrt. Aus berechenbarkeitstheoretischer Sicht spricht man davon, dass beide
Schleifenarten gleichmächtig sind.

Der entscheidende Unterschied liegt in der Lesbarkeit und Verständlichkeit.
Grundsätzlich lässt sich sagen, wenn ich für alle Elemente in einer Liste
eine bestimmte Aktion ausführen will, ist die Verwendung einer for-Schleife meist sinnvoll.

Seltener sollen bestimmte Aktionen nur solange ausgeführt werden bis ein bestimmter Zustand
eintritt oder nicht mehr zutrifft, dann ist eine while-Schleife angebracht.
"""
viele_zahlen = [x for x in range(0, 10000) if x%9==0]

for elem in viele_zahlen:
    if elem % 2 ==1:
        print(elem)

i = 0
while i < len(viele_zahlen):
    if viele_zahlen[i] % 2 ==1:
        print(viele_zahlen[i])
    i += 1

Schreibe eine Funktion, die alle ganzen Zahlen zwischen 1 und einem Wert x die durch 3 und durch 7 teilbar sind in einer Liste zurückgibt. Verwende hier eine Zählervariable, die in einer while-Schleife hochgezählt wird. Nutze continue, um Werte zu überspringen, die nicht zur Ergebnisliste hinzugefügt werden sollen. Nutze break, wenn das angegebene Maximum erreicht wurde, um die while-Schleife zu beenden.

# Dein Code
Hide code cell source
def durch3und7(letzteZahl:int) -> list:
    i = 1
    durch3_7 = []
    while i < letzteZahl:
        if i%3==0 and i%7==0:
            durch3_7.append(i)
        i += 1

    return durch3_7


print(durch3und7(1000))

Bewege den weissen Turm so lange nach rechts bis er entweder am Spielfeldrand oder vor einer anderen Figur steht.

schachbrett = [['schwarzes Pferd', 'schwarzer Bauer', None, None, None, None, 'weisser Bauer', None],
               [None, None, None, None, None, None, 'schwarzer Bauer', None],
               [None, None, None, None, None, None, 'schwarzer König', None],
               ['schwarzer Bauer', None, None, 'weisser Turm', None, None, None, None],
               [None, None, 'weisser König' , None, 'schwarzer Läufer', 'schwarzer Bauer', None, None],
               [None, None, None, None, None, None, None, None],
               [None, None, 'weisse Dame', None, None, None, None, None],
               ['schwarzer Bauer', None, None, None, None, 'schwarze Dame', None, None]]
# Dein Code
Hide code cell source
reiheWT = schachbrett[3]
positionWT = reiheWT.index('weisser Turm')
nächstesFeld = positionWT+1
while nächstesFeld < len(reiheWT):
    if not reiheWT[nächstesFeld]:
        tmp = reiheWT[nächstesFeld]
        reiheWT[nächstesFeld] = reiheWT[positionWT]
        reiheWT[positionWT] = tmp
        positionWT = nächstesFeld
        nächstesFeld = positionWT +1

print(positionWT)
print(reiheWT)

Dictionaries#

Erstelle ein Dictionary blumen in dem für jede Blume die Farben ihrer Blüten gespeichert werden. Speichere direkt drei Einträge zu Rose, Enzian und Margeriten.

# Dein Code
Hide code cell source
"""
Zum Definieren von Dictionaries bieten sich die folgenden beide Möglichkeiten.
Wenn der Inhalt eines dicts bereits zum Definitionszeitpunkt bekannt ist,
ist die zweite Option meist einfacher.

Wenn das dict erst im Laufe des Programms (z.B. in einer for-Schleife) gefüllt werden soll,
muss die erste Option verwendet werden.
"""
blumen = {}
blumen['rose'] = ['rosa', 'rot', 'schwarze']
blumen['enzian'] = 'blau'
blumen['margeriten'] = 'weiss'

blumen2 = {'Rose': 'rot',
           'Enzian': 'blau',
           'margeriten': 'weiss'}
print(blumen)

Füge deine Lieblingsblume zu blumen hinzu.

# Dein Code
Hide code cell source
blumen['tulpe'] = 'gelb'
print(blumen)

Entferne den Eintrag zu Enzian.

# Dein Code
Hide code cell source
"""
Mit dem del-Statement können wir konkrete Werte "fallenlassen".
Dabei kann es sich um einzelne Variablen handeln, aber auch um Einträge in lists, dicts, usw.

Alle Iterables haben aber auch eigene Funktionen um bestimmte Werte zu löschen.
"""
del blumen['enzian']
#blumen.pop('enzian')

del blumen['rose'][2]
#blumen['rose'].remove('schwarz')


print(blumen)

"""
Hier wird eine Variable x definiert und ausgegeben.
Anschließend wird x mit del gelöscht.
Die Fehlermeldung bei der zweiten Ausgabe zeigt, dass x fallengelassen wurde.
"""
x = 1945
print(x)
del x
print(x)

Gib für alle gespeicherten Blumen die Blütenfarbe aus.

# Dein Code
Hide code cell source
print(blumen.values())
for farbe in blumen.values():
    print(farbe)

for blume in blumen.keys():
    if 'r' in blume:
        print(blumen[blume])
"""
Das lambda-Statement erstellt eine (anonyme) Hilfsfunktion.
Sie besteht aus einem Funktionskopf mit Eingabeparametern
und einem Funktionskörper mit EINER Expression.

Einige Built-in-Functions in Python erwarten als Eingabeparameter eine Funktion.
Um sich die Definition einer neuen Funktion zu sparen, bietet sich dann oft
das Verwenden von Lambda an.

Die folgenden Verwendungen von sorted sind äquivalent zueinander.
Beachte auch den untypischen Funktionsaufruf im ersten Beispiel ohne Klammern.
Bei Lambda-Funktionen können außerdem keine Annotationen verwendet werden.
Damit sind z.B. die Festlegung auf einen Rückgabe- und einen Eingabe-Datentyp nicht möglich.

Normalerweise werden Lambda-Funktionen vor allem in built-in-Functions wie
filter, map, oder sorted verwendet.
Der offizielle Python style guide (PEP 8) rät von der Verwendung von lambda-Funktionen ab.

Ausführlich wird das Thema lambda-Funktion zum Beispiel [hier](https://realpython.com/python-lambda/) besprochen.
"""

def lower_string(s:str)->str:
    return s.lower()

blumen_sort = sorted(blumen, key=lower_string)
blumen_sortiert = sorted(blumen, key=lambda b:b.lower())
print(blumen_sort)
print(blumen_sortiert)