Direkt zum Hauptinhalt

Theoretische Grundlagen

Das Ziel jeder Programmiersprache ist es, Verhalten eines Computers in einem Format darzustellen, das von Menschen gelesen und bearbeitet werden kann.
Python nutzt dafür, wie alle anderen ernstzunehmenden Programmiersprachen, Textdateien (mit der Endung .py).

Wie der Großteil aller heutzutage verwendeten Programmiersprachen, stellt auch jede Python-Datei eine durch strukturierten Text beschriebene Baumstruktur dar, den "Abstrakten Syntaxbaum" ("abstract syntax tree"), die vom Interpreter schrittweise durchwandert und ausgeführt wird. Die beiden nennenswerten Arten von Knoten in dieser Baumstruktur sind "Statements" (wörtlich "Aussagen", sinngemäß "Befehle") und "Expressions" (Ausdrücke).

Befehle beschreiben je eine Aktion, die "executed" (ausgeführt) werden kann. Verbildlichende Beispiele hierfür wären "Sende eine E-Mail", "Zeige dem Spieler den Game Over-Bildschirm" und "Warte, bis der Benutzer die Leertaste loslässt".

Ausdrücke beschreiben ein Verfahren, mit dem sie "evaluated" (ausgewertet) werden können. Hierbei muss ein "value" (Wert) entstehen, wobei nebenbei auch beliebige weitere Aktionen (sog. side-effects, Nebeneffekte) geschehen können. Beispielsweise ist "die Zahl 2" ein Ausdruck, welcher ohne Nebeneffekte bei der Auswertung als Wert die Zahl 2 zurückgibt. Ebenso ist "2 + 2" ein Ausdruck, bei dessen Auswertung der Wert 4 entsteht. Ein weiterer Ausdruck, mit signifikanten Nebeneffekten, wäre auch "finde heraus, ob der Bundeskanzler ans Telefon geht".

Wichtig ist, dass jeder Ausdruck in einen Befehl umgewandelt werden kann, nämlich den Befehl 'Werte den Ausdruck einmal aus und verwerfe das Ergebnis'. Für "Die Zahl 2" beispielsweise ist der entsprechende Befehl "tue nichts", für "2 + 2" ist er "berechne 2 + 2 und verwerfe das Ergebnis" (in der Praxis somit auch "tue nichts"), und bei "finde heraus, ob der Bundeskanzler ans Telefon geht" lautet der entsprechende Befehl "rufe den Bundeskanzler einmal an".

Sowohl Befehle als auch Ausdrücke sind entweder einfach ("simple") oder zusammengesetzt ("compound"). Ein zusammengesetzter Ausdruck ist einer, bei dessen Auswertung weitere, einfache oder zusammengesetzte, Ausdrücke ausgewertet werden (beispielsweise müssen für "1 + 2" die Ausdrücke "1" und "2" ausgewertet werden). Ein zusammengesetzter Befehl enthält weitere Befehle, und bestimmt, wann, wie oft und in welcher Reihenfolge sie ausgeführt werden ("solange der Spieler die Leertaste hält: laufe vorwärts"). Sowohl einfache als auch zusammengesetzte Befehle können die Auswertungen vom Ausdrücken enthalten, jedoch lässt Python es nicht zu, dass ein Ausdruck einen Befehl enthält.

Python ist eine der wenigen Programmiersprachen, die als Teil des Lieferumfangs Funktionen mitliefert, um unter anderem den Syntaxbaum von Programmen in der eigenen Sprache auszgeben. Hierfür wird in den Ordner navigiert, in welchem die Datei helloworld.py (aus dem vorherigen Kapitel) liegt, und der Befehl py -m ast helloworld.py ausgeführt. Die Ausgabe des Programms dürfte wie folgt aussehen:

Module(
   body=[
      Expr(
         value=Call(
            func=Name(id='print', ctx=Load()),
            args=[
               Constant(value='Hello, world!')]))])

Dies lässt sich auch in Worte fassen.

  • Das gesamte Programm lässt sich als ein zusammengesetzer Befehl (ein Module) verstehen
    • Dieser Befehl umfasst nur einen weiteren Befehl body=[...], nämlich Expr (also "ein als Befehl interpretierte Ausdruck")
      • Der entsprechende Ausdruck (value=) ist ein Aufruf einer Funktion (Call)
        • Diese Funktion wird aus der Variable mit dem Namen print (func=Name(id='print')) geladen (ctx=Load)
        • Der Funktion wird nur ein Parameter übergeben (args=[...]), nämlich der Text "Hello, world!" als Konstante (Constant)

Ein etwas komplizierteres Beispiel ist das folgende Programm:

# empfindung.py
if input("Wie geht es dir? ") == "gut":
    print("Wie schön!")
else:
    print("Schade :(")

(Anmerkung: Python überspringt den Inhalt der Zeile, sobald es auf das Zeichen # stößt. Die erste Zeile kann auch weggelassen werden, und dient hier nur als ein vorgeschlagener Dateiname.)

Dieses Programm erwartet vom Benutzer eine Eingabe (und wartet bis es diese erhält). Wird das Wort gut (in Kleinbuchstaben, ohne Leerzeichen) eingegeben und die Enter-Taste gedrückt, so gibt das Programm zurück Wie schön!, ansonsten ist die Ausgabe Schade :(.
(Eine 1966 erdachte Weiterführung der Idee dieses Programms trägt den Namen ELIZA)

Die Ausgabe von py -m ast empfindung.py ist

Module(
   body=[
      If(
         test=Compare(
            left=Call(
               func=Name(id='input', ctx=Load()),
               args=[
                  Constant(value='Wie geht es dir? ')]),
            ops=[
               Eq()],
            comparators=[
               Constant(value='gut')]),
         body=[
            Expr(
               value=Call(
                  func=Name(id='print', ctx=Load()),
                  args=[
                     Constant(value='Wie schön!')]))],
         orelse=[
            Expr(
               value=Call(
                  func=Name(id='print', ctx=Load()),
                  args=[
                     Constant(value='Schade :(')]))])])

Erneut besteht das gesamte Programm aus einem Befehl (diesmal If), jedoch ist dieser Befehl dieses Mal zusammengesetzt.