Direkt zum Hauptinhalt

Informelle Grundlagen

Das Ziel jeder Programmiersprache ist es, Verhalten eines Computers in einem Format darzustellen, das

Ausgabe von Menschen gelesen und bearbeitet werden kann.
Python nutzt dafür, wie alle anderen ernstzunehmenden Programmiersprachen, Textdateien (mit der Endung .py).

Text

Wie derwir Großteilim allervorigen heutzutageKapitel verwendetengesehen Programmiersprachen,haben, 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, bisgibt 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, spiele einen Ton"). 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:Programmcode

Module(print("Text body=[Hier Expr(
         value=Call(
            func=Name(id='print', ctx=Load()),
            args=[
               Constant(value='Hello, world!')]))]Einfügen")

den eingefügten Text (im Normalfall) über die Standardausgabe (CMD, Linux-Terminal etc.) aus. Dies lässtfunktioniert, sichindem auchdie inFunktion Worteprint fassen.mit einem Text als einzigen Parameter aufgerufen wird. print tut folgendes:

  • DasJeder gesamteParameter Programmwird, lässtsofern sicher alskeiner ist, in einen Text umgewandelt
  • Jeder Parameter wird der Reihe nach über die Standardausgabe ausgegeben
  • Zwichen den Parametern wird je ein zusammengesetzerLeerzeichen Befehl (ein Module) verstehen
      ausgegeben
    • DieserAm Befehl umfasst nur einen weiteren Befehl body=[...], nämlich Expr (also "ein als Befehl interpretierter Ausdruck")
      • Der entsprechende Ausdruck (value=) ist ein Aufruf einer Funktion (Call)
        • Diese FunktionSchluss wird auseine derNeuzeile 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)
    ausgegeben

EinAnders etwasals komplizierteresin BeispielSprachen istwie C und Java muss die Anweisung nicht mit einem Semikolon (;) abgeschlossen werden, es reicht hierfür das folgendeZeilenende Programm:aus. Somit kann man mehrere Zeilen Text der Reihe nach ausgeben, indem man mehrere print-Aufrufe in aufeinanderfolgende Zeilen schreibt:

#print("Dieser empfindung.pyText ifkommt input("Wiein gehtZeile es dir? "1") == "gut":
print("WieDieser schön!")Text else:kommt print("Schadein :("Zeile 2")

(Anmerkung: Python überspringtignoriert denLeerzeilen Inhaltbei der Zeile,Ausführung. Ebenso wird, sobald es auf das #-Zeichen stößt, der Rest der Zeile (bis zum Zeilenende) ignoriert. Somit verhalten sich folgende (durch # --- stößt.getrennte) DieProgramme erstevollkommen 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 istgleich:

Module(print("abc")
body=[print("def")
If(# test=Compare(---


left=Call(print("abc")
func=Name(id='input',print("def")


ctx=Load(# ---
# diese Zeile gibt "abc" aus
print("abc")
# diese Zeile gibt "def" aus
print("def"),
args=[# Constant(value='Wie---
geht# esdiese dir?Zeile 'gibt "abc" aus
print("abc")]
# diese Zeile gibt "def" aus
print("def"),
ops=[# Eq(---
print("abc")], comparators=[# Constant(value='gut'diese Zeile gibt "abc" aus
print("def")]), body=[# Expr(diese value=Call(Zeile func=Name(id='print',gibt ctx=Load()),"def" args=[
                     Constant(value='Wie schön!')]))],
         orelse=[
            Expr(
               value=Call(
                  func=Name(id='print', ctx=Load()),
                  args=[
                     Constant(value='Schade :(')]))])])aus

Erneut besteht das gesamte Programm aus einem Module mit einem einzigen Befehl (diesmal If), jedoch ist dieser Befehl dieses Mal zusammengesetzt. Er enthält zwei "Blöcke" (body und orelse, beide mit je einem Befehl) sowie den Ausdruck test, welcher zuerst ausgewertet wird, und dessen Wert danach entscheidet, welcher der