Wir wissen bereits was Variablen sind und wie wir mit ihnen umgehen können. Wir wollen beispielsweise eine Einkaufsliste simulieren und erstellen dafür zwei Items, welche auf der Liste stehen:
item1 = "Apfel"
item2 = "Milch"
Jetzt haben wir aber zwei Probleme, einmal haben die beiden Variablen keinen Kontext zueinander. Wenn wir beispielsweise noch unseren Kontostand als Geld speichern wollen ist die Beziehung zwischen den beiden Items die gleiche untereinander, wie die zur Variable Geld. Zum anderen besteht die Frage, was ist wenn wir während das Programm läuft ein weiteres Item hinzufügen wollen, unsere Einkaufsliste also erweitern wollen?
Wir könnten zwar versuchen uns mit einem String zu behelfen, vielleicht so:
einkaufListe = "Apfel, Milch"
Und anschließend neue Items in etwa so hinzufügen:
einkaufListe += ",Toilettenpapier"
Das wäre aber unfassbar umständlich, spätestens beim Löschen eines Items, aber keine Angst wir haben eine viel bessere Lösung!
Listen:
Mithilfe von Listen können wir das viel besser darstellen und in etwa so könnte es aussehen:
einkaufsListe = ["Apfel", "Milch"]
Genauso wie eine “normale” Variable definieren wir auch eine Liste, jedoch schließen wir die einzelnen Elemente in eckigen Klammern ein. Ausgeben können wir die Liste intuitiv wie eine normale Variable:
einkaufsListe = ["Apfel", "Milch"]
print(einkaufsListe)
print(einkaufsListe[0])
In der zweiten Zeile geben wir einfach die gesamte Liste mit Hilfe von print aus. In der dritten Zeile geben wir ein einzelnes Element aus der Liste aus. Das 0 Element. Das 0?
Ja Programmierer fangen bei Listen nicht mit dem ersten Element an sondern beim Nullen. Das hat sogar einen tieferen Sinn, aber dafür müsste ich stark ausholen, vielleicht zu einem anderen Zeitpunkt. Wichtig ist jetzt nur sich zu merken, dass wir beim nullten Element anfangen zu zählen.
Somit gibt die 3. Zeile, in der wir das nullte Element ausgeben, unseren ersten Eintrag in der Einkaufsliste aus: Apfel.
Etwas hinzufügen:
Wir können nun aber auch leicht etwas zu unserer Liste hinzufügen: Mithilfe der append-Funktion. Diese Funktion können wir aber “nicht einfach so” aufrufen, so wie wir print, range oder eine der Funktionen die wir bereits definiert haben aufrufen. Die Funktion append gehört direkt zu der Liste und muss auch so von ihr aufgerufen werden. Das sieht dann so aus:
einkaufsListe = ["Apfel", "Milch"]
print(einkaufsListe)
einkaufsListe.append("Toilettenpapier")
print(einkaufsListe)
Wir löschen ein Element in der Liste hierbei ähnlich wie wir eins auslesen und fangen auch hier bei 0 an zu zählen
Bei Listen müssen aber nicht alle Elemente vom gleichen Datentyp sein, so wie bei unseren Beispielen alle Einträge Strings sind. Wir können auch mischen:
liste = ["Milsch", 13, 13.4, [1,2]]
Hier haben wir nun unsere Liste. Das erste Element ist ein string, das zweite Element ist eine ganze Zahl also ein int, das dritte eine Kommazahl, also ein float und das vierte Element ist eine weitere Liste. Alles kein Problem! Auf die Elemente in der Liste greifen wir übrigens so zu:
Range
Ähnlich wie bei Schleifen können wir auch bei Listen eine Range an Elementen ausgeben, was wie folgt aussieht:
liste = ["a", "b", "c", "d", "e"]
print(liste[2:10])
Wir definieren erst eine Liste mit 5 Elementen. Anschließend sagen wir, dass wir alle Elemente von 2. bis zum 10. ausgegeben haben wollen. Aber wir haben gar kein 10. Element? Ist aber egal dann eben alle die gehen. Aber welche Buchstaben geben wir hier aus?
liste = ["a", "b", "c", "d", "e"]
print(liste[2:4])
Vom 2. Element, c, bis einschließlich dem 3., also geben wir hier ‘c’ und ‘d’ aus. Aber nicht den eigentlichen vierten Buchstaben. Wir können aber auch alle Elemente bis x ausgeben:
print(liste[:4])
Tupel:
Neben Listen gibt es aber noch andere Arten wie wir unsere Daten strukturieren können. Eine gängige Methode sind Tupel. Ein Tupel können wir beispielsweise so definieren:
tupel = (3,5)
print(tupel[0])
tupel[1] = 10
in der ersten Zeile definieren wir das Tupel. Das sieht hierbei genauso aus, wie eine Liste nur das wir hier mit runden Klammern und nicht mit eckigen Klammern arbeiten.
In der zweiten Zeile geben wir das Element an der Stelle 0 aus, das läuft genauso wie bei Listen.
In der dritten Zeile versuchen wir einen Wert der Liste zu überschreiben. Betonung liegt auf versuchen, denn wenn wir diesen Code versuchen auszuführen, streikt unsere Python. Aber wir versuchen hier nicht auf eine falsche Art und Weise im Tupel ein Item zu ändern, es geht überhaupt nicht! Das ist auch der große Unterschied zwischen Tupeln und Listen. Tupeln sind sogenannte immutable Objekte, also unveränderliche Objekte. Wir können also nicht nur nicht die Werte im Tupel ändern, wir können auch keine hinzufügen oder welche löschen. Wenn wir ein Tupel mit (3,5) erstellen, dann ist in diesem Tupel 3,5 drin, komme was da wolle!
Warum Tupel:
Aber warum überhaupt Tupel benutzten? Sind doch schlechter?! Nicht ganz !
Einmal sind Tupel schneller, ich kann schneller auf die einzelnen Elemente zugreifen, als bei einer Liste. Um das zu erklären, müsste ich auch hier weiter ausholen. Daher musst du mir das jetzt einfach glauben =). Das alleine ist aber selten wirklich ein Thema, in den meisten Fällen ist Geschwindigkeit kein Problem und bevor wir an unsere Datentypen rangehen (Liste oder Tupel, float oder int) sollten wir uns lieber Gedanken darüber machen, ob unserer Algorithmus “richtig” ist.
Der in meinen Augen größere Vorteil von Tupeln ist, dass es eine höhere Bindung zwischen den Elementen gibt. Was? Ein Beispiel!:
Angenommen wir wollen ein Videospiel programmieren und wollen die Position des Spielers in einem drei dimensionalen Raum speichern. Eine Liste könnte da helfen.
Vec3= [10,4,1]
Jedoch gibt es jetzt einen Schönheitsfehler, wir können innerhalb des Programms ein Element löschen oder ein weiteres hinzufügen. Beides macht aber für uns keinen Sinn, wir können sowohl mit einer Liste, die eine weitere Koordinate hat, als auch mit einer Liste mit einer Koordinate weniger nichts anfangen. Denn wir wollen ja eine Position im 3D Raum darstellen, nicht im 2D Raum und auch nicht im 4D Raum =).
Hier wäre es deutlich klüger ein Tupel zu benutzten und wenn die Position des Spielers sich verändert das Tupel zu überschreiben:
#Erste position
vector3 = (10,4,1)
#Spieler bewegt sich
vector3 = (10,5,2)
Zusammenfassung
Listen sind ein weiteres, absolut, basisches Element für unsere Programme. Neben Einkaufslisten gibt es auch noch viele weiter potenzielle Anwendungsfälle. Inventar in einem Videospiel, Klausuren in einer Klasse, Inhalt eines Raumes und noch viele mehr. Neben Listen gibt es noch andere “listenartige” Datentypen wie z.B. Tupel, aber auch noch andere, die ihre eigenen Einschränkungen und Erweiterungen mit sich bringen. Für das Verständnis dieser hilft es sehr, grundsätzlich zu verstehen wie Listen funktionieren.