Guter Stil – zum Aufbau von Skripten

Es gibt ein paar wichtige Regeln, die sich jeder Programmierer unbedingt hinter die Ohren schreiben sollte.

  1. Schreibe deinen Code so, dass Du oder ein beliebiger anderer Programmierer, diesen nach einem halben Jahr ohne weiteres verstehen kann
  2. Jede doppelte Zeile ist eine schlechte Zeile. Fasse also alles zusammen, was du zusammenfassen kannst.
  3. Kommentiere, was du gemacht hast, vor allem, wann und warum.

Um diesen guten Stil zu verdeutlichen und um gewisses Grundregeln der Programmiersprache Python zu erklären, mach wir nun das zweite Beispiel. Dafür passen wir einfach unser „Hello World“ Skript an und schreiben ein Skript in schlechtem Stil und verändern es danach in einen guten Stil.

Ich weiß, das sind noch alles Trockenübungen, aber der richtige Spaß kommt bald.

Ich habe hier mal ein ganz einfaches Skript geschrieben, welches sehr unübersichtlich und zudem fehlerhaft ist.

Die ersten Zeilen sind geschenkt. In der Zeile 5 erstelle ich eine Variable namens „a“. Diese bekommt den Wert 0+1. Dann gebe ich dieses a aus.

Dann bekommt a den Wert 1+1 und ich gebe dieses wieder aus.

Dann bekommt a den Wert 2+1 und ich gebe dieses wieder aus.

Du siehst schon, das Skript bereitet Kopfschmerzen allein beim Anschauen.

Also lass uns das doch mal in Form bringen.

  • Zuerst musst Du wissen, dass alle Skript von der ersten zur letzten Zeile der Reihe nach ausgeführt werden.
  • Dann musst Du wissen, dass in Python in jeder Zeile immer nur genau 1 Befehl stehen darf. Wir nennen solche Befehle auch „Anweisung“
  • Leerzeilen werden beim Ausführen einfach ignoriert, können aber die Strukturierung deutlich verbessern.
  • In Python werden alle Anweisungen „eingerückt“. Alle Anweisungen auf einer Ebene gehören zu einem Block. Anweisungen innerhalb eines Unterblocks, müssen in der Ebene weiter eingerückt werden. Das sehen wir gleich wenn wir eine Funktion auch Methode genannt erstellen.
  • Leerzeichen zwischen Operatoren werden bei der Ausführung ignoriert aber können die Leserlichkeit deutlich verbessern.
  • Ein Operator ist etwas, der etwas macht. Also +, -, *, /, = sind alles Operatoren. In Python gibt es noch ein paar mehr, aber die sind für uns erst einmal uninteressant.
  • Eine Zuweisung ist ein spezieller Befehl, bei dem eine Variable einen Wert bekommt. Die Variable steht dabei IMMER links vom = Zeichen und der Inhalt, den sie bekommt, steht immer rechts.
  • Achte stets auf die Groß- und Kleinschreibung. Ein a ist in Python etwas vollkommen anderes als ein A!

In Zeile 5 haben wir eine Anweisung, genauer gesagt eine Zuweisung. Hier haben wir eine Variable a und diese bekommt den Wert 0 + 1. Alles was rechts vom = Zeichen steht wird ausgerechnet und das Ergebnis wird in die Variable geschrieben. Die Variable a wird somit zum Platzhalter für den Wert 1.

In der Zeile 7 bekommt a dann den Wert 1+1. Der ursprüngliche Wert, den a repräsentierte, wird also durch eine 2 überschrieben. Also ist a aber der Zeile 7 ein Platzhalter für den Wert 2.

Nach diesem Muster funktionieren alle Zuweisungen.

Der Print Befehl kann nicht nur Zeichenketten drucken, sondern auch Variablen. Wenn ich den Buchstaben a drucken will, dann muss ich a in Anführungszeichen setzen, wenn ich aber die Variable a ausdrucken möchte (bzw. den Wert, den diese Variable repräsentiert) dann muss ich die Anführungszeichen weglassen.

  • print(„a“) <- Druckt das Zeichen „a“
  • print(a) <- Druckt den Inhalt der Variablen a (z.B. den Wert 2)

Damit eine Variable verwendet werden kann, muss ihr erst ein Wert zugewiesen werden.

  • print(a)
  • a = 1

So geht es leider nicht. Zuerst braucht a einen Wert.

  • a = 0
  • print(a)
  • a = 1

Das ist vollkommen in Ordnung.

Im ersten Schritt füge ich Leerzeichen und Leerzeilen ein, um einen besseren Überblick zu erhalten.

Das sieht schon etwas ordentlicher aus. Wenn wir das Skript nun ausführen, sehen wir dass am Ende zwei mal die Zahl 4 ausgegeben wird. Eigentlich sollte das eine 4 und dann eine 5 werden.

Das liegt daran, dass ein den Befehl in der Zeile 17 falsch haben. Die +1 aus der Zeile 18 muss unbedingt mit in die Zeile von dem Befehl und darf nicht einfach so in einer anderen Zeile stehen. Python denkt dann nämlich, dass Zeile 17 ein Befehl ist und Zeile 18 ist was ganz Neues, anderes.

Jetzt sollte die Ausgabe wie erwartet stimmen.

Nun haben wir aber noch das Problem, dass wir ja eigentlich immer das gleiche hinschreiben. Das kann ich jetzt auch noch 1000-mal mehr machen, kein Problem. Aber was ist, wenn ich statt 1+1, 2+1, 3+1, … nun 1-1, 1-2, 1-3, … schreiben möchte.

Für die paar Zeilen sicherlich kein großes Problem, für mehrere tausend Zeilen schon. Also sollten wir uns überlegen, wie wir das Wiederholen stoppen können.

Und dafür verwenden wir Funktionen.

Eine Funktion in Python hat immer folgende Form

def Funktionsname():

h

Das Wort „def“ besagt: jetzt definieren wir uns eine Funktion. Danach kommt der Funktionsname. Diese sollte immer schlüssig erklären, worum es in der Funktion geht. Am besten ist es auch wenn man eine Konvention beim Benennen von Funktionen einhält. Funktionen dürfen nicht mit einem Sonderzeichen oder einer Zahl beginnen. Einzige Ausnahme ist der Unterstrich.

Die meisten Programmierer schreiben Funktionen klein und wenn ein Funktionsname aus mehreren Begriffen besteht, wird der jeweilige Anfangsbuchstabe groß geschrieben. Alternativ wird ein Unterstrich verwendet.

Einige Programmierer schreiben Funktionen in ihrer Landessprache, andere verwenden lieber englisch. Wichtig ist nur, dass Python prinzipiell nur ASCII Zeichen, also quasi den amerikanischen Zeichensatz verwenden kann. Ein Funktionsname darf also kein ö oder dergleichen enthalten.

Nach dem Funktionsnamen folgt immer die Parameterliste in runden Klammern. Funktionsparameter sind Variablen und Werte, die eine Funktion übergeben bekommt. Das sind also die Daten, mit denen die Funktion arbeiten darf. Danach kommt immer ein Doppelpunkt.

Alle Befehle, die in der Funktion ausgeführt werden sollen, müssen eingerückt werden. Der erste Befehl, der nicht mehr eingerückt ist, wird auch nicht mehr ausgeführt, wenn die Funktion ausgeführt wird.

Alles, was in einer Funktion steht, wird nur dann ausgeführt, wenn die Funktion „aufgerufen“ wird.

Traditionell gehört es zum guten Stil, dass eine Funktion erst definiert werden muss, bevor sie aufgerufen werden kann. Daher stehen die Funktionen i.d.R. weiter oben und das Skript startet weiter unten. Das sehen wir aber gleich.

Bauen wir uns also eine Funktion namens addieren (denn wir wollen ja addieren).

def addieren():

Beim Addieren werden ja immer 2 Zahlen addiert und am Ende erhält man ein Ergebnis. Wir haben es also insgesamt mit 3 Zahlen zu tun. Für jede dieser Zahlen brauchen wir eine Variable. Ich nehme die Variablen a und b für die Zahlen, die addiert werden sollen und die Variable c für das Ergebnis. Also muss die Funktion folgenden Inhalt haben.

def addieren():

c = a + b

Das sieht eigentlich schon ganz gut aber, aber woher soll die Funktion nun wissen, was a und b sind? Die brauchen ja einen Wert. Und irgendwie wollen wir ja die Werte in die Funktion hinein geben. Also schreiben wir a und b einfach in die Parameterliste.

def addieren(a , b):

c = a + b

Vielleicht fragst Du dich gerade, und was ist jetzt a und was ist b. Nur weil es oben in der Parameterliste steht, hat es doch noch keinen Wert? Das kommt gleich, wenn wir das aufrufen.

Um eine Funktion aufzurufen, muss man nur den Namen der Funktion hinschreiben.

addieren()

Eine Funktion wird IMMER mit Parameterliste aufgerufen. Die Parameterliste des Aufrufes muss IMMER zur Definition passen.

Und hier haben wir nun wieder ein Problem. Die Funktion addieren ist so definiert, dass wir 2 Werte übergeben sollen. Beim Aufruf, übergeben wir aber gar keinen. Das ist also ein Fehler.

Da wir ja Zahlen zum Addieren übergeben wollen, machen wir das doch einfach mal.

# -*- coding: utf-8 -*-

import kkp

def addieren(a , b):

c = a + b

addieren(0 , 1)

Was passiert hier nun? Wir starten oben und machen dem import. Dann überspringen wir die Definition der Funktion addieren. Danach kommen wir wieder im Hauptblock an und rufen die Funktion addieren mit den Werten 0 und 1 auf. Dabei wird dann die Funktion ausgeführt. In die erste Variable (a) kommt der erste Wert (0). Und in b landet dann die 1.

Wenn dann in der Funktion also a+b gerechnet wird, haben diese ja nun Werte 0 und 1. Also bekommt c auch einen Wert. In dem Fall eine 1.

Nun wollen wir das Ergebnis ja gerne zurück haben aus der Funktion. Wir wollen das ja noch drucken. Also müssen wir in der Funktion einen return Befehl machen (Befehle, werden auch Anweisung oder auch Statement genannt).

Und wir wollen ja das Ergebnis der Addition zurückgeben. Also das, was in c steht.

import kkp

def addieren(a , b):

c = a + b

return c

addieren(0 , 1)

Jetzt gibt die Funktion den Wert schon mal zurück. Aber wir merken uns den noch nicht. Also müssen wir eine Zuweisung mit dem Funktionsaufruf machen.

import kkp

def addieren(a , b):

c = a + b

return c

ergebnis = addieren(0 , 1)

In der Variablen ergebnis wird also nun das Ergebnis gespeichert, welches von der Funktion addieren ausgerechnet wurde.

Und das können wir nun drucken mit einem print Befehl.

# -*- coding: utf-8 -*-

import kkp

def addieren(a , b):

c = a + b

return c

ergebnis = addieren(0 , 1)

print(ergebnis)

 

Als nächstes können wir ja unsere Funktion etwas anpassen. Sie soll nicht mehr einfach nur addieren, sondern das addierte anschließend auch noch quadrieren.

# -*- coding: utf-8 -*-

import kkp

def addieren(a , b):

c = a + b

d = c * c

return d

ergebnis = addieren(0 , 1)
print(ergebnis)

Diese Funktion können wir nun ganz bequem wiederholt benutzen.

# -*- coding: utf-8 -*-

import kkp

def addieren(a , b):

c = a + b

d = c * c

return d

ergebnis = addieren(0 , 1)
print(ergebnis)
ergebnis = addieren(1 , 1)
print(ergebnis)
ergebnis = addieren(2 , 1)
print(ergebnis)
ergebnis = addieren(3 , 1)
print(ergebnis)
ergebnis = addieren(4 , 1)
print(ergebnis)
ergebnis = addieren(5 , 1)
print(ergebnis)

Das klappt zwar sehr gut, aber jetzt müssen wir die Ausgabe jedes Mal wiederholen, und wir haben ja gelernt, nach Möglichkeit doppelte Zeilen zu vermeiden. Also schreiben wir uns auch hier eine Funktion, die das Ergebnis für uns a) erstellt und b) auch ausgibt.

# -*- coding: utf-8 -*-

import kkp

def addieren(a , b):

c = a + b

d = c * c

return d

def addierenUndAusgeben(a , b):

ergebnis = addieren(a , b)

print(„Das Ergebnis lautet “ + str(ergebnis))

addierenUndAusgeben(0 , 1)
addierenUndAusgeben(1 , 1)
addierenUndAusgeben(2 , 1)
addierenUndAusgeben(3 , 1)
addierenUndAusgeben(4 , 1)
addierenUndAusgeben(5 , 1)

So weit so gut, aber nun addiert unsere Funktion addieren nicht mehr. Am besten wäre es natürlich gewesen, wir hätten dafür eine eigene Funktion zum quadrieren geschrieben. Aber wir tun einfach mal so, also ob die Umstände uns zwingen würden, das so lösen zu müssen (Zeitmangel, der fiese Dämon eines jeden Programmierers).

Dann wäre es sicherlich gut, wenn wir zumindest kommentieren würden, was wir da in der Funktion veranstaltet haben. Damit wir uns in einem halben Jahr, wenn wir dieses Skript erneut anfassen müssen, nicht verwirren lassen.

Ein Kommentar wird einfach durch ein # Zeichen eingeleitet und gilt immer für genau 1 Zeile. (Es gibt auch mehrzeilige Kommentare).

# -*- coding: utf-8 -*-

import kkp

# Diese Funktion addiert die Werte a und b.

# a und b müssen dafür unbedingt Zahlen sein.

# Die Funktion quadriert anschließend auch das Ergebnis!

# TODO: Das quadrieren ist nur aus Zeitmangel passiert und muss

# noch in Ordnung gebracht werden.

# Datum: 27.07.2023

def addieren(a , b):

c = a + b

c = c * c #Hier wird quadriert. TODO hier raus!

return c

def addierenUndAusgeben(a , b):

ergebnis = addieren(a , b)

print(„Das Ergebnis lautet “ + str(ergebnis))

 

addierenUndAusgeben(0 , 1)

addierenUndAusgeben(1 , 1)

addierenUndAusgeben(2 , 1)

addierenUndAusgeben(3 , 1)

addierenUndAusgeben(4 , 1)

Da hat sich im Aufbau zwischen unserer ersten Fassung und auf der bereinigten Version doch einiges getan.

Es lohnt sich aber die Mühe, die eigenen Skripte immer möglichst sauber und aufgeräumt zu halten. Und mit der Erfahrung kann man dann bereits im ersten Anlauf einige „Schlampigkeiten“ vermeiden und dann braucht man auch nicht mehr so viel Zeit zum aufräumen.

Zum Thema Pyhton allgemein gibt es noch viele tausend Dinge, aber die können hier nicht abgehandelt werden. In dem Fall kann ich nur empfehlen, ein praktisches Lehrbuch zu kaufen oder (noch besser) im Internet nach Lehrvideos zu schauen.