Python Basics (für Korpuslinguist:innen)
In diesem Block lernen Sie grob die für Sie wichtigsten Funktionalitäten in Python kennen. Es geht dabei nicht darum, dass Sie jetzt alles verstehen und konkret anwenden können sondern vielmehr, dass Sie Pythonskripte lesen können und in etwa verstehen können was jeweils geschieht.
Variablen und Datentypen
Es gibt in Python verschiedene Datentypen:
Integer (int)
num = 3
Floats (float)
dec = 6.2
Strings (str)
satz1 = "Das ist ein Satz in doppelten Anführungszeichen."
satz2 = 'Das ist ein Satz in einfachen Anführungszeichen.'
Die Namen der Variablen, num, dec, satz1, satz2 werden durch Sie gegeben und definieren nicht den Datentyp - der Wert der Variablen, also ob es sich um eine Zahl, eine Dezimalzahl oder um eine Zeichenkette in Anführungszeichen handelt, definiert den Datentypen. Es ist sinnvoll, den Variablen sprechende Namen zuzuweisen. Namen wie variable1 führen bei längeren Skripten schnell zu Verwirrung.
Output in das Terminal schreiben
Gerade bei Skripten, die eine längere Verarbeitungszeit haben oder beim Testen von Skripten, bietet es sich an, zwischendurch einen Output oder Zwischenstand im Terminal ausgeben zu lassen.
Das tun Sie wie folgt:
print(satz1)
Komplexere Datentypen
Manchmal genügt es nicht, nur einen Wert in einer Variablen zu speichern. Auch dafür gibt es in Python mehrere Möglichkeiten. Hier werden nur die zwei prominentesten erwähnt.
Listen
wortliste = ["Kopfkissen", "Fussball", "Gabel", "Schraubenzieher"]
Bei dieser Liste handelt es sich um eine Liste mit Strings. Die Liste wird durch eckige Klammern definiert, wobei die Elemente in der Liste durch Kommas getrennt werden. Bei den Listenelementen kann es sich sowohl um Strings als auch um Integer oder Floats handeln.
Dictionaries
buchstabenanzahl = {"Kopfkissen":10, "Fussball":8, "Gabel":5, "Schraubenzieher":15}
Dictionaries werden durch geschweifte Klammern definiert, wobei die Elemente wiederum durch Kommas abgetrennt werden. Die Elemente bestehen aus einem sogenannten Key-Value Paar, wobei die Keys einzigartig sein müssen, die Values aber nicht.
Schleifen
Beim Verarbeiten von Textdaten arbeiten wir oft mit mehreren Artefakten (mehrere Dateien, mehrere Zeilen, mehrere Paragrafen, o.Ä.) auf denen dann jeweils die gleiche Operation ausgeführt werden soll. Dafür eignen sich Schleifen am Besten. Zudem werden Textteile häufig in Listen gespeichert - ein Element entspricht dann beispielsweise einem Satz.
If-Schleife
Um Skripte so effizient wie möglich zu gestalten und nicht jede mögliche Option separat und einzeln abdecken zu müssen, gibt es if-Schleifen, in denen Bedingungen definiert werden können. So kann beispielsweise mit Fragen anders umgegangen werden als mit Ausrufen und Aussagen. Ein solches Bedingungskonstrukt sieht wie folgt aus:
satz = "Hast du heute schon den Briefkasten geleert?"
if "?" in satz:
print("Frage")
elif "." in satz:
print("Aussage")
elif "!" in satz:
print("Ausruf")
else:
print("Komischer Satz")
For-Schleife
Die for-Schleife führt für jedes Element der Sequenz (Liste, Dictionary, Zeilen in einem Dokument, ...) eine bestimmte Aktion aus. Sie iteriert also über jedes Element und führt dann die Aktion aus. Eine solche Schleife sieht dann beispielsweise wie folgt aus:
satzliste = ["Das ist ein Satz.", "Das ist auch ein Satz.", "Hier steht noch ein Satz."]
satzliste_neu = []
for element in satzliste:
satzliste_neu.append(element.replace("Satz", "Schatz"))
print(satzliste_neu)
In diesem Beispiel ersetzen wir einen Teil des Strings, einen sogenannten Substring. Den veränderten String müssen wir dann jeweils in eine neue Liste schreiben, die wir als satzliste_neu definiert haben und schliesslich drucken wir das Resultat.
While-Schleife
Die While Schleife führt ebenfalls eine Aktion auf einer Sequenz aus und zwar so lange bis eine definierte Bedingung nicht mehr erfüllt ist.
i = 0
while i < 5:
print(i)
i += 1
In diesem Beispiel wird zunächst eine Integer-Variable definiert, die dann in der Schleife so lange erhöht wird, bis der Wert 5 erreicht. Dann endet die Schleife.
Funktionen
Funktionen in Python sind wie ein Päckli oder auch eine Sinneinheit und Funktionen erfüllen meist eine bestimmte Aufgabe. Sie dienen dazu, den Code übersichtlich zu gestalten und sind praktisch, weil sie, nachdem Sie einmal geschrieben wurden, immer wieder aufgerufen werden können und so im Code keine unnötigen Wiederholungen vorkommen. Eine Funktion ist grundsätzlich etwa so aufgebaut wie eine Maschine: Zu Beginn wird ein Input in die Funktion gegeben, dieser Input wird dann in der Maschine bearbeitet und schliesslich in veränderter Form als Output aus der Funktion ausgegeben. Häufig werden daher in einem Skript zunächst verschiedene Funktionen definiert, die dann später aufgerufen werden.
Hier ein einfaches Beispiel einer Funktion, bei der durch eine Liste iteriert wird:
# Funktion wird mit "def" definiert.
# In der Klammer hinter dem Namen stehen die Inputparameter.
def separate_punctuation_in_list(list):
new_list = []
for element in list:
new_list.append(element.replace(".", " ."))
return(new_list)
# Die Funktion wird so aufgerufen: Der Namen der Funktion wird eingegeben und in die Parameterliste wird nun die konkret zu verändernde Datenstruktur (hier eine Liste) geschrieben.
# Das print-Statement ist hier nötig, da die neue Liste ansonsten zwar gespeichert, aber nicht im Terminal angezeigt wird.
print(separate_punctuation_in_list(satzliste))
💡 Wichtig: Die "#" in Codeblöcken sind sogenannte Kommentare. Sie werden vom Computer ignoriert und nicht ausgeführt. In der IDE erkennt man sie ausserdem daran, dass Sie farbig markiert sind. Kommentare sind praktisch, um im Code zu erklären, was der jeweilige Codeblock genau tut - um den Code also zu kommentieren und zu dokumentieren.
print vs. return
Print und Return scheinen auf den ersten Blick ähnliche Aufgaben zu erfüllen, da beide etwas "zurückgeben". Das stimmt aber nur ungefähr.
- Ein print-Statement zeigt nämlich nur etwas (im Terminal) an, das Ergebnis kann aber nicht weiterverwendet werden.
- Ein return-Statement gibt einen Wert aus einer Funktion zurück und beendet die Funktion.
Dateien einlesen und in Dateien schreiben
In korpuslinguistischen Analysen müssen wir häufig Dateien in ein Skript einlesen, dann verändern oder verändern lassen und schliesslich wieder ausgeben. Dafür gibt es in Python eine ganz bestimmte Syntax, die wie folgt funktioniert.
def read_write_file(inputfile):
file = open(inputfile, 'r', encoding = 'utf8')
outputfile = inputfile[:-4] + "_out.txt"
outfile = open(outputfile, 'w', encoding = 'utf8')
filecontent = file.read()
outfile.write(filecontent)
In dieser Funktion passiert folgendes: Ein File wird eingelesen, dann wird aufgrund des Namens des Inputfiles das Outputfile benannt, das dann geöffnet wird. Nun wird der Inhalt des Inputfiles eingelesen und dann ins Outputfile geschrieben (hier ohne irgendeine Veränderung vorgenommen zu haben).
Encoding
Jede Datei auf dem Computer hat ein Encoding. Das Encoding legt fest, welchem Standard bzw. welcher Zuordnung die Schriftzeichen innerhalb des Zeichensatzes entsprechen. Dieses Encoding muss durchgängig eingehalten werden, ansonsten kann der Computer die Kodierung nicht entziffern (etwa so als würde man einen Text in einer falschen Sprache lesen) und produziert dementsprechend entweder eine Fehlermeldung oder Kauderwelsch. Das Encoding kann beim Abspeichern von Dokumenten ausgewählt werden. Der Standard dazu ist UTF-8. Achten Sie also darauf, diesen Standard ebenfalls zu verwenden. Werden Dateien in einem Pythonskript eingelesen, dann können Sie das Encoding explizit wie folgt bestimmen:
textfile = open('dateiname.txt', 'r', encoding = 'utf8')
Die typische Struktur eines Pythonskripts
Pythonskripte folgen häufig einer ähnlichen Struktur, die sich so etabliert hat. Diese zu kennen, hilft auch dabei Files zu lesen und zu verstehen, was passiert. So sieht diese Struktur in etwa aus:
# import-Statements gehören ganz nach oben
import random
# Verschiedene Funktionen werden anschliessend ins Skript geschrieben
# Funktionen
# Gibt eine zufällige Zahl zwischen 1 und 6 zurück (wie ein Würfelwurf).
def roll_dice():
return("Deine Glückszahl ist heute " + str(random.randint(1, 6)))
def begruessung(name):
return "Hallo " + name ", schön dich zu sehen."
# Funktionen können natürlich auch länger sein
def iterate_list(inputlist):
new_list = [] # wir definieren eine neue, leere Liste, in die der Output geschrieben wird
for elem in inputlist: #iterieren durch Inputliste mit einem for-Loop
elem += 1
new_list.append(elem) # veränderte Elemente der Inputliste in neue Liste einfügen
return new_list # nach abgeschlossener Iteration wird die neue Liste als Output der Funktion zurückgegeben
# In der main()-Funktion werden schliesslich die unterschiedlichen Schritte durchlaufen und die oben beschriebenen Funktionen werden aufgerufen.
# Die main()-Funktion hat in der Regel keine Parameter
def main():
print(begruessung("Lisa"),
roll_dice())
# if name == main -Statement
# Dieses Statement bedeutet: Führe dieses Skript nur dann aus, wenn das Skript direkt gestartet wurde und nicht, wenn es von einem anderen Skript importiert wurde.
if __name__ == "__main__":
main()
💡 Wichtig: Ein Pythonfile entspricht dem gesamten Sichtfeld des Codes, es sei denn, es werden andere Codeteile importiert. Ansonsten müssen alle Variablen, Files, etc., die genutzt werden, innerhalb des Files definiert werden, ansonsten wird das Skript nicht ausgeführt, bzw. schmeisst eine Fehlermeldung.
Weitere Pythonressourcen
Gute Tutorials zum Programmieren mit Python finden Sie beispielsweise hier:
Hilfestellungen zu fast allen Fragen finden Sie hier:
- Stackoverflow
- verschiedene KI-Tools