Die pythonische Küche

Jede Skript- oder Programmiersprache besteht aus Bestandteilen, die man wie die Zutaten der Küche eines bestimmten Landes sehen kann. Es gibt die arabische, die japanische, die mexikanische und die deutsche Küche. Und es gibt PHP, Ruby, C und viele weitere Programmiersprachen. Und es gibt Python.

Um einen kurzen Überblick in die pythonische Küche zu erlangen, wollen wir im folgenden die typischen Zutaten der pythonischen Küche vorstellen und am Ende ein erstes Gericht kochen.

Mysore - Fruit vendor
Abbildung 1: Mysore - Fruit vendor

Ausgaben

print("Hallo Welt!")
Hallo Welt!

Damit sagen wir der Community der Pythonköchinnen und -köche, dass wir jetzt auch dabei sind. Außerdem gibt uns dieser Ausgabebefehl in Zukunft die Möglichkeit, in der Richtung Maschine -> Mensch zu kommunizieren. Mit print() können also Ergebnisse von Berechnungen, Eingabeaufforderungen u.ä. ausgegeben werden.

Kommentare

Kommentare sind nützlich und sinnvoll, wenn sie den Code genauer beschreiben und anderen Menschen Hinweise geben, was ein Programmteil für Aufgaben hat, was in Zukunft noch zu tun ist oder was nicht funktioniert.

# Ein einzeiliger Kommentar
print("Ein Kommentar hat am Anfang eine Raute.")
Ein Kommentar hat am Anfang eine Raute.

Variablen und Datentypen

Variablen speichern Werte, die wir häufiger in unseren Programmen brauchen. Diese verschiedenen Arten von Daten werden Datentypen genannt.

Numbers

Hier haben wir eine Ganzzahl, auch Integer genannt, in der Variablen sinn_des_lebens gespeichert. Ganzzahlen gehören in Python zum Datentyp Numbers.

sinn_des_lebens = 42
print(sinn_des_lebens)
42
print(sinn_des_lebens + 3)
45

Hier haben wir eine Fließkommazahl gespeichert und ausgegeben. Auch sie gehört zu den Numbers.

preis = 1.99
print(preis)
1.99

String (Zeichenkette)

In Variablen lassen sich sehr unterschiedliche Arten von Werten speichern. Eben haben wir eine Zeichenkette, auch String genannt, in der Variablen tier gespeichert.

tier = "Giraffe"
print(tier)
Giraffe

Liste

Jetzt haben wir eine Liste in der Variablen tiere gespeichert und wieder ausgegeben.

tiere = ["Giraffe", "Salamander", "Iltis"]
print(tiere)
['Giraffe', 'Salamander', 'Iltis']

Dictionary (Verzeichnis)

Dieser Datentyp wird Dictionary genannt, weil er wie eine Art Verzeichnis funktioniert: Links stehen die Bezeichner, rechts die dazugehörigen Werte.

elefant = {
    "name": "Dieter",
    "alter": 12,
    "gewicht": 5800
}

print(elefant)
{'name': 'Dieter', 'alter': 12, 'gewicht': 5800}

Boolean (Wahrheitswert)

True und False sind die beiden Werte des boolschen Datentyps. Mit ihm werden eindeutige Zustände ausgedrückt wie "an" und "aus".

schalter_1 = False
schalter_2 = True

print(schalter_1)
False

Zusammenfassung und weiterführende Informationen

Numbers, String, List, Dictionary und Boolean sind Datentypen in Python. Es gibt noch viele weitere, die aber an dieser Stelle erst einmal keine Rolle spielen. Sehr ausführlich werden Variablen und Datentypen auf der Website Datentypen und Variablen erläutert.

Wer lieber einen Film schauen möchte, findet z.B. das Thema Listen gut erklärt im folgenden Video. Auf Youtube gibt es noch mehr Filme dieser Art.

%%HTML
<iframe width="560" height="315" src="https://www.youtube.com/embed/Z-folPNH6ro?list=PLD20BEE125C1FC7B1" frameborder="0" allowfullscreen></iframe>

Bedingte Anweisungen und Verzweigungen

Man spricht von einer Fallunterscheidung oder bedingten Anweisung, wenn ein Codeblock an eine Bedingung geknüpft ist. Der Codeblock wird folglich nur ausgeführt, wenn die Bedingung erfüllt wird.

Eine bedingte Anweisung wird mit if formuliert:

kartoffeln = 3

if kartoffeln >= 4:
  print("Es gibt Kartoffelsalat.")

In Z1 wird der Variablen kartoffeln der Wert 3 zugewiesen. In Z3 wird geprüft, ob es vier oder mehr Kartoffeln gibt. Wenn ja, reicht es für Kartoffelsalat. Es reicht nicht...

Will man auch eine Ausgabe sehen, wenn die Kartoffeln nicht für den Salat reichen, ist eine Verzweigung angebracht:

kartoffeln = 3

if kartoffeln >= 4:
  print("Es gibt Kartoffelsalat.")
else:
  print("Die Kartoffeln reichen nicht. Leider.")
Die Kartoffeln reichen nicht. Leider.

Eine weitere Variante von Verzweigungen ist möglich, wenn mehr Zweige gebraucht werden:

kartoffeln = 3

if kartoffeln >= 4:
  print("Es gibt Kartoffelsalat.")
elif kartoffeln == 3:
  print("Das gibt genau einen Kartoffelpuffer.")
else:
  print("Die Kartoffeln reichen nicht. Leider.")
Das gibt genau einen Kartoffelpuffer.

Mit bedingten Anweisungen und Verzweigungen haben wir sozusagen die Kartoffel der pythonischen Küche kennengelernt. Diese Kontrollstruktur ermöglicht es, ein Programm den Umständen bzw. Bedingungen entsprechend unterschiedliche Pfade einzuschlagen.

Operatoren

In den meisten Programmiersprachen gibt es Operatoren, die - wie der Name schon sagt - Operationen mit den Daten eines Programms ermöglichen. In dem letzten Beispiel oben kommen z.B. die Vergleichsoperatoren == und >= vor. Außerdem gibt es noch Rechenoperatoren für die Grundrechenarten, +, -, * und /. Weitere Operatoren sind in entsprechenden Onlinereferenzen zu finden.

Schleifen

Mit Schleifen können Vorgänge in Programmen wiederholt werden. In der Regel hat eine Schleife eine Abbruchbedingung. Wenn diese erfüllt ist, wird die Schleife verlassen und das Programm danach fortgesetzt.

for-Schleife

Die for-Schleife wird eingesetzt, wenn die Anzahl der Male, die sie laufen soll, bekannt ist.

tiere = ['Hund', 'Katze', 'Maus']

for tier in tiere:
    print(tier)
Hund
Katze
Maus

Hier werden die Elemente einer Liste von Anfang bis Ende durchlaufen. tier ist dabei immer der aktuelle Wert in einem Durchlauf. Wenn die Liste komplett durchlaufen wurde, wird die Schleife verlassen und das Programm danach fortgesetzt.

Es gibt noch weitere Schleifen, die aber an dieser Stelle noch nicht so wichtig sind. Interessierte können darüber online nachlesen.

Funktionen

Funktionen schließen Programmteile ein, die häufiger verwendet werden. Man sagt auch, die Programmteile werden gekapselt. Nach außen sind diese teilweise sehr komplexen Programmteile unter einem sinnvollen und aufschlussreichen Namen erreichbar.

Zunächst muss eine Funkion definiert werden:

import time

# Funktionsdefinition
def berechne_tagesabschnitt():

    zeitstempel = time.time()
    # print("{} Sekunden sind seit 1970 vergangen.".format(zeitstempel))

    teile_des_zeitstempels = time.localtime(zeitstempel)
    # print(teile_des_zeitstempels)

    stunde_des_tages = teile_des_zeitstempels[3]
    # print(stunde_des_tages)

    if stunde_des_tages < 12:
        print("Es ist Vormittag.")
    elif stunde_des_tages < 18:
        print("Es ist Nachmittag.")
    elif stunde_des_tages < 24:
        print("Es ist Abend.")
    else:
        print("Es ist Nacht.")

# Funktionsaufruf
berechne_tagesabschnitt()
Es ist Vormittag.

Das Programm ist absichtlich etwas komplexer, um einige Dinge zeigen zu können:

  1. Es wird ein so genanntes Modul importiert: time
  2. Es wird von Variablen Gebrauch gemacht, die verschiedene Zwischenergebnisse speichern.
  3. Es werden Funktionen verwendet, die schon in Python "eingebaut" sind: time(), localtime() und print().
  4. Es wird eine Verzweigung verwendet, die einen Wert untersucht und danach entscheidet, wie das Programm weitergeht.
  5. Es werden verschiedene Ausgaben getätigt.

Man könnte sagen, dass für die Ausgabe "Es ist..." ziemlich viel Aufwand getrieben wird. Dieser Aufwand wird aber in der Funktion berechne_tagesabschnitt() gekapselt. Diese wird zunächst mit dem Schlüsselwort def definiert. Deshalb spricht man hier auch von der Funktionsdefinition.

Um nun von der Funktion Gebrauch machen zu können, muss sie aufgerufen werden. Dies geschieht mit dem Funktionsaufruf in Z25.

Funktionen mit Parametern

Funktionen machen dann erst richtig Spaß, wenn man ihnen Argumente übergeben kann. Dafür muss die erste Zeile einer Funktion, die Funktionssignatur, Parameter enthalten, die Argumente beim Funktionsaufruf auffangen können.

def verdoppeln(zahl):
    print(zahl * 2)

verdoppeln(4)
8

Die Funktion stellt einen Parameter bereit, der einen übergebenen Wert "auffängt" wie ein Eimer. Dieser wird dann innerhalb der Funktion, im Funktionsrumpf weiterverarbeitet.

Beim Funktionsaufruf wird eine beliebige Zahl übergeben, und egal welche es ist, die Funktion verdoppelt sie und gibt das Ergebnis aus.

Funktionen mit Rückgabewert

Die zunächst letzte Variante von Funktionen liefert nach getaner Arbeit einen Wert zurück.

def verdoppeln(zahl):
    return zahl * 2

ergebnis = verdoppeln(4)

Hier wird das Ergebnis der Verdopplung nicht sofort ausgegeben, sondern zunächst mit return an die aufrufende Stelle zurückgegeben. Dort muss der Rückgabewert in einer Variablen gespeichert werden, da er sonst verloren geht. Mit der Variablen ergebnis kann nun in der Folge des Programms weitergearbeitet werden. Eine Ausgabe erfolgt also ggf. später.

Zusammenfassung

Die pythonische Küche verfügt noch über weit mehr Zutaten und Techniken, die in diesem Crashkurs Python nicht alle genannt werden können. Es wurden jedoch einige wesentliche Teile der Programmiersprache vorgestellt, die für den Bau von Webseiten z.B. mit Flask zunächst ausreichend sind.