Installation & Projekt:
tag
Zur Installation werden Python & PyCharm benötigt. PyCharm in der kostenfreien "Community Edition" runterladen, installieren und öffnen.
Das erste Projekt anlegen und darauf achten, dass "Create a welcome script" ausgewählt ist:
Hallo Windshausen!:
Unser erstes Programm wird "Hallo Windshausen" ausgeben, dabei kann " oder ' verwendet werden:
print("Hallo Windshausen!")
print('Hallo Windshausen!')
Wir schreiben die erste Variable und geben diese wieder aus:
w = "Windshausen"
print(w)
print("Hallo " + w)
Rechnen lässt sich natürlich auch - wir schreiben dann aber die Zahlen nicht in Klammern:
Ergebnis = 1+1
print(Ergebnis)
Längere Texte mit mehreren Variablen und String:
Ort = "Windshausen"
Bundesland = "Bayern"
Land = "Deutschland"
Urlaubsdauer = 2*3
print("Hallo Freunde, ich sende euch eine Postkarte aus " + Ort + ". Ich finde, " + Ort + " ist sehr schön.")
print(Ort+" liegt im " + Bundesland + " und " + Bundesland + " liegt in " + Land + ".")
print("Ich bin hier schon seit " + str(Urlaubsdauer) + " Tagen in " + Ort + " im Urlaub.")
Datentyp
Überblick:
1. Datentyp - Stings:
#String (str)
x ="String (str) = Text"
print(x)
#Integer (int) = Ganzzahl, für Berechnungen geeignet
x =-50 +50 + 23
print(x)
#Float (float) Gleitkommazahl, für Berechnungen geeignet < . und kein Komma !!
x =10.5 + 0.5
print(x)
#Boolean (bool) < gibt nur wahr oder falsch
x = True
print(x)
x = False
print(x)
String - Allgemein
Strings können Buchstaben, Zahlen, Leerzeichen, Sonderzeichen enthalten:
#------------------------ STRINGS
#<< Buchstaben, Zahlen, Leerzeichen, Sonderzeichen
a ="123 Windshausen ;-)"
print(a)
String - INDEX
#Merke: geht immer los mit > Von vorne = 0 || von hinten = -1
#------------------------ STRINGS INDEX
b ="Hallo Windshausen ;-)"
#---0123456indsh.... << Index beginnt immer bei 0
print(b[6]) #6 = W - Alternativ 16 = )
#Negativer Index [-1] wird verwendet, um von hinten zu zählen:
print(b[-1])
#Merke: geht immer los mit > Von vorne = 0 || von hinten = -1
String - SLICING
#------------------------ STRINGS SLICING
#komplettes Wort ausgeben = SLICING bis zum Ende
print(b[6:])
#komplettes Wort "Hallo" ausgeben = Slicing vom Anfang bis ...
print(b[:5])
#Wort "llo" ausgeben = Slicing von ... Anfang bis ...
print(b[2:5])
#ÜBUNG - gebe nur das Wort "Windshausen" aus: > Lösung:
print(b[6:17])
String - Länge herausfinden
#------------------------ STRINGS Länge rausfinden len()
y = "Dieser Satz ist ganz lang. Wie lange ist er????"
print(len(y))
#------------------------ STRINGS Länge rausfinden len() > schöner darstellen:
print("Der String mit der Variable y ist", len(y), "Zeichen lang.")
String - Buchstaben verändern
#------------------------ STRINGS Buchstaben verändern
x = "hallo"
#---x[0] = "H" << so funktioniert es nicht... daher müssen wir anders rangehen.
#LÖSUNG =
x = "H" + x[1:]
print(x)
Strings - Mehrfach ausgeben
#------------------------ STRINGS Mehrfach ausgeben
#ÜBUNG Mehrfach ausgeben - Aufgabe: gebe am effizientesten 10x Hallo aus!
h = "Hallo "
print(h + h + h + h + h + h + h + h + h + h)
#ÜBUNG Mehrfach ausgeben - BESSER !!
h = "Hallo1 "
print(h *10)
#ÜBUNG Mehrfach ausgeben - Noch BESSER !!
print("hallo2 " *10)
Strings - Upper/Lower > Klein und Großschreibung
#STRING Upper/Lower > Klein und Großschreibung
x = "Hallo, Windshausen, wir sind, das KiJuWi"
x.upper()
print(x.upper())
print(x.lower())
#STRING Wörter splitten
print(x.split())
#STRING Wörter splitten bei einem Komma , Zeichen
print(x.split(","))
#STRING - finde das
print(x.find("Windshausen")) #-- Ergebnis = 7 = W von Windshausen.
#ÜBUNG - Gebe nur den Rest hinter windshausen aus
x = "Ich liebe Windshausen !!!"
print(x.find("Windshausen"))
print(x[10:])
#oder noch besser:
x = "Ich liebe Windshausen !!!"
print(x[x.find("Windshausen"):])
2. Datentyp - Zahlen:
Zahlen Überblick - es gibt zwei Zahlen Datentypen in Python:
Es gibt noch Complex (complex) worauf wir jedoch nicht eingehen.
1. Integer (int):
> angegeben als int
> Ganzzahlen (-100; -2; 0; 4; 20)
> positivoder negativ
2. Float (float):
> Mit Nachkommastellen
> Trennzeichen . beachten
> -0.001; 11.2; 50.9 << nicht mit Komma schreiben !!
3. Complex (complex):
>Darauf gehen wir aber nicht ein !!
>Repräsentiert komplexe Zahlen mit einem Realteil und einem Imaginärteil.
> Der Imaginärteil wird mit einem j gekennzeichnet, z. B. 3 + 4j14.
#Taschenrechner - Operatoren +-*/
print(10 + 2)
print(10 - 2)
print(10 * 2)
print(10 / 2)
#Wenn man sich nicht sicher ist welchen Datentyp man hat, kann "type" verwendet werden:
#z.B. str, int, float
print(type("Windshausen"))
print(type(10 - 2))
print(type(10 / 2))
#Prüfen ob eine Division einen Restwert hat > 10/3
print(10 / 3)
# % = Modulo macht die Teilung und zeigt den Rest an = "1"
# Modulo = 0 immer gerade ..... = 1 immer ungerade
print(10 % 3)
# Potenz Hoch = 10² oder 3³ >> mit doppelten **
print(10 ** 2)
print(3 ** 3)
# Wurzel aus 49? = Zahl ** 0,5
print(49 ** 0.5)
#Punktrechnung vor Strichrechnung
print(2 + 1 * 3)
print((2+1) * 3)
#Rechnen geht natürlich auch mit dem Datentyp (float)
print(5.2 + 4.8)
#Floats können auch mit Integern gemischt und berechnet werden.
#MERKE !!!! > Wenn man int mit floats berechnet kommen am Ende immer Floats raus.
print(5.0 * 3)
Nutzereingaben:
Wir schreiben unsere erstes kleines Programm - Namen Abfragen und wieder ausgeben:
Namen abfragen und ausgeben:
#Benutzereingaben werden mit input() realisiert
#diese wird zur weiteren Verwendung der Variablen x zugewiesen
x = input("Wie ist dein Name?")
#nun den Namen ausgeben:
print(x)
#und noch mit mehr Text:
print("Hallo " + x)
Taschengeldrechner:
Nächste kleine Programm - Taschengeld um 10% errechnen:
#1. Taschengeld um 10% erhöhen
t = input("Wie viel Taschengeld bekommst du? ")
x = t * 1.10
print(x)
#^^ FEHLER !! oben ergibt Fehler, mit Absicht!!
#Input ergibt immer Strings welche herauskommen.
#"Text" * 1.10 funktioniert also nicht > daher muss der Text erst noch in (int) umgewandelt werden.
#2. Taschengeld um 10% erhöhen > also die richtige Lösung es muss umgewandelt werden und nach t = int(.....:
t = int(input("Wie viel Taschengeld bekommst du? "))
x = t * 1.10
print(x)
#PS: um dein Taschengeld um 100% zu erhöhen ;-)
t = int(input("Wie viel Taschengeld bekommst du? "))
x = t * 2.00
print(x)
Währungsumrechner Euro € in Baht ฿:
Das nächste Projekt wird Euros vom Benutzer abfragen und in Thailändische Baht ฿ umrechnen:
euro = float(input("Wie viel Euro hast du? "))
baht = euro * 35.06
#INFO - Gemischte Datentypen werden mit , getrennt:
print("Deine ", euro, " Euro sind ", baht, " Baht wert."),
Booleans & IF-Bedingungen:
Booleans
Datentyp Boolean ist einfach es gibt nur = wahr (True) & falsch (False)
Wichtige ist immer, dass die Werte auch so geschrieben werden "True"/"False".
Der Computer rechnet und speichert nur mit 0 & 1:
True = 1
False = 0
#welcher Datentyp steckt hinter "True" ? > richtig = "bool"
print(type(True))
True / False - Wie ist etwas wirklich = wirklich?
print(2 > 1)
print(2 < 1)
#Wie fragen wir ab, dass auch 2 wirklich gleich 2 ist? >> mit zwei "==" Zeichen
#MERKE also > 1x = ist Zuweisung von einer Variablen | 2x == ist eine logische Aussage (Prüfung) wo immer ein Boolean rauskommt.
print(2 == 2)
IF-Bedingung:
Verkehrsmittel:
Beispiel: Verkehrsmittel nach Strecke.
#IF-ELSE Bedingung - Erläuterung:
#if PRÜFUNG:
#Body = Programm für Prüfung True
#elif weitere Prüfung:
#Body
#else:
#Body: Programm, wenn alle bisherigen Prüfungen False
#UNSER KiJuWi Programm > Alles unter 2 km zu Fuss und alles über 2 km mit dem Fahrrad um zum KiJuWi zu kommen.
streckeInKm = 5
if streckeInKm < 3:
print("Lauf zum KiJuWi!")
#Enter ist wichtig mit der Einrückung
else:
print("Fahre mit dem Fahrrad zum KiJuWi.")
#was passiert wenn die Strecke genau 3 KM hat? - Nimm doch eines von beiden.
# Dazu kann zwischen "if" und "else" weiteres mit "elif" (= sonst wenn) hinzugefügt werden.
streckeInKm = 3
if streckeInKm < 3:
print("Lauf doch zu Fuß zum KiJuWi!")
#Enter ist wichtig mit der Einrückung
elif streckeInKm == 3:
print("Es sind genau 3km !!!!")
print("Laufe oder nimm das Fahrrad zum KiJuWi ;-)")
# Enter ist wichtig mit der Einrückung
else:
print("Fahre mit dem Fahrrad zum KiJuWi.")
Kinoticket:
Beispiel - Kinoticket Automat:
#ÜBUNG > Kinotickets mit 3 Kategorien
#1. Kinder bis 18 Jahre = 5€
#2. Erwachsene ab 18 Jahre = 10€
#3. Rentner ab 65 Jahren = 7,50€
alter = int(input("Wie alt bist du?"))
#Wir fangen mit den Rentnern an:
if alter > 65:
print(7.5)
# Wir danach bleibt nur noch alles von 65 bis >= 18 übrig
elif alter >= 18:
print(10)
#und nun nur noch den Rest:
else:
print(5)
< Kinotickets mit Anzahl berechnen:
#Nun noch die Anzahl der Tickets dazu nehmen durch var = anzahl und in jeder Berechnung * nehmen.65
alter = int(input("Wie alt bist du?"))
anzahl = int(input("Wie viele Tickets möchtest du kaufen?"))
#Wir fangen mit den Rentnern an:
if alter > 65:
print(7.5 * anzahl)
# Wir danach bleibt nur noch alles von 65 bis >= 18 übrig
elif alter >= 18:
print(10 * anzahl)
#und nun nur noch den Rest:
else:
print(5 * anzahl)
Komplexere Datentypen
Mehr als nur Strings, Zahlen, Booleans > sind Listen, Tupel, Dictionaries
Listen
Listen
#LISTEN - speichern Daten welche wir verändern können
# angegeben als list
# in eckigen Klammern []
# geordnete und veränderbare Sammlung von Daten
# Einkaufsliste schreiben
#1. Bananen
#2. Weintrauben
#3. Mohrrüben > ersetzen in Zucchini
# Datentypen können gemischt werden.
# Wie schreibt man Listen in Python - leere Liste schreibt man sich in eckige Klammern:
leere_liste = []
print(leere_liste)
Unsere erste Liste:
#Leeres Blatt Papier der Einkaufsliste:
leere_liste = []
einkaufszettel =["Bananen", "Weintrauben", "Mohrrüben", 43]
print(einkaufszettel)
#auch der Integer 43 wird mit den Strings in der Liste ausgegeben.
Indexing in Listen:
einkaufszettel =["Bananen", "Weintrauben", "Mohrrüben"]
#Wenn er dich jemand nach dem 3ten Element fragt immer bei 0 Anfangen 0,1,2 > dann gibt er den dritten Wert aus:
print(einkaufszettel[2])
#String Funktionen (Indexing, Slicing) sind auch auf Listeneinträge anwendbar:
einkaufszettel =["Bananen", "Weintrauben", "Mohrrüben"]
#Index 2 = [Mohrrüben]/ Index 0 = Buchstabe [M]
print(einkaufszettel[2][0])
#oder Index -1 = Zählung von hinten > letzter Wert = Mohrrüben
print(einkaufszettel[-1])
Listen sind veränderbar und es können mit einer Funktion weitere Elemente hinzugefügt werden (append):
#Veränderbar und weitere Elemente anfügbar:
einkaufszettel =["Bananen", "Weintrauben", "Mohrrüben"]
#mit "." kann eine Funktion hinzugefügt werden > .append = .hinzufügen
einkaufszettel.append("Nüsse")
print(einkaufszettel)
Eine kleine Übung:
#Übungsaufgabe: Gebe nur das "o" von Mohrrüben wieder aus.
#Denke dabei an den "Index" welcher in der Programmierung immer bei 0 beginnt.
einkaufszettel =["Bananen", "Weintrauben", "Mohrrüben"]
#Lösung:
print(einkaufszettel[2][1])
Funktionen für Listen:
#Funktionen für Listen<< Übersicht:
#f.append() = //hinzufügen
#f.insert(_;...)
#f.remove(...)
#del f[_]
#wir gehen nun auf alle ein:
einkaufszettel =["Bananen", "Weintrauben", "Mohrrüben"]
#mit "." kann eine Funktion hinzugefügt werden > .append = .hinzufügen
#.append immer ganz hinten
einkaufszettel.append("Nüsse")
#.insert und die Index Angabe 0, dann der Text
einkaufszettel.insert(0,"Schokolade")
einkaufszettel.insert(1,"Eier")
print(einkaufszettel)
#.remove geht von Anfang bis Ende durch und schaut nach dem Wort und löscht das erste, was es findet.
einkaufszettel.remove("Schokolade")
#.pop = Funktion wenn man von hinten die Liste durchgeht - schmeisst .pop das letzte Element immer raus.
einkaufszettel.pop()
einkaufszettel.pop()
print(einkaufszettel)
#.del = Delete = Löschen Funktion mit neuem Einkaufszettel2:
einkaufszettel2 =["Käse", "Wurst", "Pizza"]
del einkaufszettel2[0]
print(einkaufszettel2)
len, min, max:
#len(f) | min(f) | max(f)
#len = Wie viele Elemente gibt es in der Liste?
einkaufszettel =["Bananen", "Weintrauben", "Mohrrüben"]
print(len(einkaufszettel))
#min = gibt das kürzeste Wort aus der Liste aus (Banane)
print(min(einkaufszettel))
#max = gibt das längste Wort aus der Liste aus (Weintrauben)
print(max(einkaufszettel))
Slicing bei einer Liste und Verschachtelte Liste:
#Slicing bei Listen > hier muss 1 bis 3 angegben werden (nicht 2) weil die 2 auch noch mit ausgegeben werden soll.
#gibt dann also "1" = Weintrauben und bis zur "3" also inklusive "2" aus
einkaufszettel =["Bananen", "Weintrauben", "Mohrrüben"]
print(einkaufszettel[1:3])
#Slicing mit der Länge ausgeben:
einkaufszettel =["Bananen", "Weintrauben", "Mohrrüben"]
print(einkaufszettel[1:len(einkaufszettel)])
#List Comprehention > Verschachtelte Liste = Liste in einer Liste:
einkaufszettel2 =["Bananen", "Mohrrüben", ["Schokolade", "Gummitiere"]]
#Aufbau Liste [String]; [String]; [Liste > 2 Strings]
print(einkaufszettel2[2][1])
Tupel
Tupel
#Datentyp Tupel:
#Merke: wenn du etwas verändern möchtest, nimm Listen / wenn nicht dann Tuple
#Sind unveränderbar sobald das Tupel erstellt wurde.
#Noch veränderbar - geht bei Liste (aber nicht bei Tupel) aus z.B. Mohrrübe soll Schokolade werden - dann:
liste = ["Bananen", "Mohrrüben", "Trauben"]
print(liste)
liste[1] = "Schokolade"
print(liste)
print("TUPEL !!!!!!!!!!!!!!!!!!!!!!!!!!!!")
# Tupel werden nicht in Eckige Klammern geschrieben [] sondern in runden Klammern ()
listefix = ("Bananen", "Mohrrüben", "Trauben")
print(listefix)
listefix[1] = "Schokolade"
print(listefix)
Schleifen:
while-Schleife
#Schleifen
#while-Schleife - Leere EInkaufsliste > Wird gefragt was man haben möchte.
#wird so lange ausgeführt, bis die "Bedingung" nicht mehr erfüllt wird
#Endlosschleife - ist richtig, da der Wert immer = 0 bleibt und niemals auf größer 5 geht:
counter = 0
while counter <= 5:
print(counter)
#Keine Endlosschleife - da nun immer += 1 dazugerechnet wird.
#Irgendwann ist er bei 6 und bricht die Schleife ab:
counter = 0
while counter <= 5:
print(counter)
counter += 1
Projekt - Einkaufsliste:
Projekt Einkaufsliste - Start einfach:
#Projekt Einkaufsliste einfach:
einkaufsliste = []
entscheidung = "y"
#logische Prüfung "==" | Zuweisung mit "="
while entscheidung == "y":
#mit .append fügen wir den input Wert der Liste ganz am Ende hinzu:
einkaufsliste.append(input("Was möchtest du hinzufügen?"))
entscheidung = input("Möchtest du weitere Artikel hinzufügen (y/n) ")
print(einkaufsliste)
Projekt Einkaufsliste:
#Projekt Einkaufsliste - es soll: Artikel hinzufügen,...
# Aktion -> hinzufügen, entfernen, anzeigen, beenden
einkaufsliste = []
while True:
aktion = input("Möchtest Du einen Artikel hinzufügen, entfernen oder die Liste anzeigen? (hinzufügen / entfernen / anzeigen / beenden)")
# hinzufügen
if aktion == "hinzufügen":
artikel = input("Welchen Artikel möchtest Du hinzufügen? ")
einkaufsliste.append(artikel)
print("Artikel wurde hinzugefügt")
#Löschen
elif aktion =="entfernen":
artikel = input("Welchen Artikel möchtest Du entfernen? ")
if artikel in einkaufsliste:
einkaufsliste.remove(artikel)
print("Artikel wurde gelöscht")
else:
print("Den Artikel gibt es nicht!")
#Anzeigen
elif aktion == "anzeigen":
print("Deine Einkaufsliste:")
print(einkaufsliste)
# beenden
elif aktion == "beenden":
print("Einkaufsliste beendet")
break
else:
print("Du muss das richtig eingeben")
Übung Ratespiel:
#Übung Ratespiel der Computer denkt sich eine Zahl aus und DU musst sie erraten.
from random import randint
zahl = randint(1, 100)
print("Hey, ich habe mir eine Zahl zwischen 1 und 100 ausgedacht :)!")
while True:
versuch = int(input("Rate meine Zahl: "))
if versuch == zahl:
print("Super, du hast die Zahl erraten!!!")
break
elif versuch < zahl:
print("Die Zahl ist zu klein")
else:
print("Die Zahl ist zu groß!")
for-Schleife
# for-Schleife
#> bedingungsunabhängig
#> genutzt um über Sequenzen (z.B. String, Liste, Tupel) mehrfach drüber zu gehen
#> Arbeiten mit break-Schlüsselwort ebenfalls möglich
liste =["Banane", "Weintraube", "Nüsse"]
#für jedes Element in unserer Liste mach etwas > Banane, Weintraube, Nüsse und dann Ende
for i in liste:
print(i)
#Weiteres Beispiel:
name ="Alex"
for i in name:
print(i)
liste = [1500, 1000, 500, 4000, 3000, 200]
bezahlbare = []
for i in liste:
if i <= 1000:
bezahlbare.append(i)
else:
print(str(i) + "ist zu teuer!")
print(bezahlbare)
Dictionaries
#Dictionaries (Wörterbücher) > (dict)
#> schneller Zugriff auf Schlüssel-Wert-Paare (Banane und Preis dazu)
#> veränderbar
#> in geschweiften Klammern {} geschrieben
#MERKE Schlüsse müssen einmalig sein.
leeres_dict = {}
einkaufs_dict = {
"artikelname": "Banane",
"Preis": 2,
"Ablaufdatum": 2025,
"Farbe": ["gelb", "braun"]
}
print(einkaufs_dict["Farbe"][0])
Dictionaries Schlüssel und Werte ausgeben:
#Dictionaries
# Schlüssel anzeigen mit .keys()-Funktion
# Werte anzeigen mit .values()-Funktion
einkaufs_dict = {
"artikelname": "Banane",
"Preis": 2,
"Ablaufdatum": 2025,
"Farbe": ["gelb", "braun"]
}
print(einkaufs_dict.keys())
print(einkaufs_dict.values())
# Preisveränderung im Nachgang
einkaufs_dict["Preis"] = 3
print(einkaufs_dict)
Dictionaries - Hinzufügen uund Löschen:
#Dictionaries
# weitere Werte hinzufügen/updaten oder löschen
einkaufs_dict = {
"artikelname": "Banane",
"Preis": 2,
"Ablaufdatum": 2025,
"Farbe": ["gelb", "braun"]
}
#Update
einkaufs_dict["Gewicht"] = 10
#Löschen
einkaufs_dict.pop("Ablaufdatum")
print(einkaufs_dict)
Dict in for-Schleife ausgeben:
#Dictionaries
# Gebe Schlüssel und Werte in einer for-Schleife aus
einkaufs_dict = {
"artikelname": "Banane",
"Preis": 2,
"Ablaufdatum": 2025,
"Farbe": ["gelb", "braun"]
}
for i in einkaufs_dict:
print(i)
einkaufs_dict["Farbe"]
print (einkaufs_dict[i])
Dictionarie - Telefonbuch
#Telefonbuch
telefonbuch ={
"Bernd": "0157 111 111 11",
"Anna": "0157 222 222 22",
"Claudi": "0157 333 333 33",
"Kai": "0157 444 444 44",
}
#gib mir nur die Nummer von Anna
print("Annas Telefonnumer ist", telefonbuch["Anna"])
#nun mit Abfrage vom User
a = input("Welche Telefonnummer brauchst du? ")
if a in telefonbuch:
print(a, "Telefonnumer ist", telefonbuch[a])
else:
print(a, "ist nicht in umserem Telefonbuch")
# mit der while-Schleife Leute löschen
del telefonbuch[a]
print(a, " wurde aus unserem Telefonbuch gelöscht.")
Funktionen:
#Funktionen
#Schnellzugriff auf Sachen, welche man häufiger benötigt, egal wo man ist
# Funktion definieren mit def
def begruessung():
print("Hallo, schön das du hier bist :)!")
begruessung()
begruessung()
begruessung()
Funktion - Parameter mit einfügen:
#Funktionen - Parameter mit einfügen
def begruessung(name, alter):
print("Hallo", name, ",willkommen ;-)! Du bist", alter," Jahre alt!")
begruessung("Alex", 14)
Alter:
#Funktionen - einfacher Taschenrechner
def addieren(a, b):
print(a + b)
addieren(20, 5)
#Rückgabe - return
# Weiterrechnen und weiterverwenden mit RETURN
def addieren(a, b):
return a + b
summe = addieren(20, 5)
print(summe)
def hallo(name = "Charackter", alter = 999):
print(name)
print(alter)
hallo()
Ein * und **
#Bei unbekannter Anzahl an Argumenten mit *
def addieren(*zahlen):
print(sum(zahlen))
addieren(20, 5, 30, 45)
addieren(20, 4)
#Wenn Argumente als Schlüssel-Wert-Paar definiert werden sollen **
#** < zwei Sternchen sagen Python immer, dass was kommt was definiert wird und damit was gemacht wird
def addieren2(**daten):
print(daten)
addieren2(name = "Alex", alter = 15, hobby = "programmieren")
Pass und DOCSTRINGS
#pass - kümmert man sich später drum
def addieren(**daten):
pass
# DOCSTRINGS - über mehrere Zeilen"""
"""
Diese Funktion ist xy dafür da
"""
TIC TAC TOE
3h:10 > https://www.youtube.com/watch?v=e6vPt_e9sRw&t=2701s
Kommentare