Dieses Notebook soll Ihnen als Spickzettel dienen und alle bisher gelernten Werkzeuge an einer Stelle zusammenfassen. Sie können diess Notebook auch sehr gerne als Basis für Ihren eigenen Spicker nutzen oder dieses Notebook mit Notizen anreichern.
Bitte stellen stellen Sie in dieser Sitzung unbedingt Fragen zu Konzepten und Werkzeugen, mit denen Sie noch Schwierigkeiten haben!
input()
Alle Daten in Python haben einen Datentyp. Der erste Datentyp, den wir kennengelernt haben, ist "String".
In Variablen können wir Daten aller Typen speichern.
string_1 = "Eine Zeichenkette aus (fast) beliebigen Zeichen"
print(string_1)
string_2 = "\" # Geht das?
print(string_2)
Nein, denn \
ist ein sog. Escape-Character, mit dem wir auch Zeichen, die in Python besondere Bedeutung haben, als
Werte benutzen. Deshalb wird das zweite Anführungszeichen nicht als Ende des Strings interpretiert. Ein abschließendes Anführungszeichen fehlt diesem String, daher die Fehlermeldung.
string_3 = "C:\\Users\\Admin"
string_4 = "C:/Users/Admin" # Die Schreibweise mit "/" spart Tipparbeit
print(string_3)
print(string_4)
print("-----")
string_5 = "\\\\@//"
print(string_5) # Was wird hier ausgegeben?
print("-----")
string_6 = """ "\\" """
print(string_6) # Und hier?
Sequenzen von 3 Anführungszeichen (jeweils " oder ') können zum Markieren von Strings benutzt werden.
string_7 = 'Auch ein String'
print(string_7)
print("-----")
string_8 = """Hier auch"""
print(string_8)
print("-----")
string_9 = ''' Auch ein String '''
print(string_9)
string_10 = """""hallo"""""
print(string_10) # Was wird hier ausgegeben? Und warum?
Methoden sind datentypspezifische Funktionen. Deshalb treten Fehler auf, wenn z.B. eine Stringmethode auf eine Liste angewendet wird.
string_1 = "Eine Zeichenkette aus (fast) beliebigen Zeichen"
string_1.lower()
print(string_1)
print("-----")
string_11 = string_1.lower() # Kopie in neuer Variable aufbewahren
print(string_11)
Weitere String-Methoden: upper()
, replace()
, count()
...
Für weitere Methoden siehe Vorlesungsskript (Notebook vom 15.10.2019)
Integers sind positive oder negative ganze Zahlen.
zahl_1 = 1
print(zahl_1)
zahl_2 = 2
print(zahl_2)
zahl_3 = 3
print(zahl_3)
print((zahl_1 + zahl_2) * zahl_3)
Gleitkommazahlen sind eine Annäherung an die reellen Zahlen. Warum nur eine Annäherung? Mehr Informationen finden Sie hier: https://www.youtube.com/watch?v=PZRI1IfStY0
zahl_4 = 0.1
print(type(zahl_4))
zahl_5 = 3*zahl_4
print(zahl_5)
print(zahl_5 == 0.3) # Oh weh!
print("-----")
print(zahl_5 < 0.3)
print(zahl_5 > 0.3)
Mit Vergleichsoperatoren können Sie testen, ob die folgenden Relationen zwischen zwei Werten bestehen:
==
: Gleichheit!=
: Ungleichheit<
, >
: Kleiner als, Größer als<=
, >=
: Kleiner oder gleich, Größer oder gleichNeben Zahlen können auch andere Werte so miteinander verglichen werden, z.B. Strings, Listen. Vergleichen Sie immer nur Objekte des gleichen Typs miteinander!
print(3.2 <= 5.8)
print(4 >= 4)
print("ABC" != "CBA")
print("ABC" > "ACB") # Was bedeutet "größer als" bei Strings?
print("ABC" < "ACB")
[ ... ]
begrenzen Listen.liste_0 = []
liste_1 = ["item_1", "item_2", "item_3", "item_4"]
print(liste_0)
print(liste_1)
print("-----")
print(liste_1[2])
print(liste_1[-1])
-1
[:]
slicet die gesamte Listeliste_1 = ["item_1", "item_2", "item_3", "item_4"]
liste_2 = liste_1[0:2] # Wieviele Einträge hat die Liste?
print(liste_2)
print("-----")
liste_3 = liste_1[0:-2] # Wie liste_1 abzgl. der letzten beiden Elemente
print(liste_3)
Im nächsten Codeblock werden zwei Variablen gleichgesetzt, Sie zeigen damit auf die selbe Liste.
liste_1 = ["item_1", "item_2", "item_3", "item_4"]
liste_4 = liste_1
print(liste_4)
Listen sind ein veränderlicher Datentyp (Mutability). Im Anschluss werden Listenelemente einer bereits vorhandenen Liste geändert...
liste_1 = ["item_1", "item_2", "item_3", "item_4"]
liste_4 = liste_1
###################################################
liste_4[1] = "Einfach mal was anderes machen."
liste_4[3] = "Und hier auch. Jetzt auch mit Ümläutön."
print(liste_4)
# print(liste_1) # Was wird hier ausgegeben?
liste_1
ist damit also verändert worden, die ursprünglichen Werte sind weg!Listen sind "mutable", veränderlich. (Mutability: https://docs.python.org/3/reference/datamodel.html)
Falls Sie tatsächlich eine Liste kopieren möchten, können Sie das z.B. mit Slicing tun.
liste_1
erhalten und liste_4
enthält alle Elemente, die auch in liste_1
enthalten warenliste_4
, wird liste_1
nicht mit verändert.liste_1 = ["item_1", "item_2", "item_3", "item_4"]
liste_4 = liste_1
#################################################
liste_4 = liste_1[:]
liste_4[3] = "Mit ohne Umlaute"
print("Liste 4:")
print(liste_4)
print("Liste 1:")
print(liste_1)
empty_dict = {}
filled_dict = {"a": 0, "e": 0, "i": 0, "o": 0, "u": 0}
print(empty_dict)
print(filled_dict)
Mit der "Index"-Schreibweise können in Dictionarys
empty_dict = {}
filled_dict = {"a": 0, "e": 0, "i": 0, "o": 0, "u": 0}
###########################################################
empty_dict["a"] = 1
print(empty_dict)
filled_dict["a"] = 1
print(filled_dict)
+=
-Operator stehen auch noch diese weiteren Operatoren zur Verfügung: -=
, *=
, /=
. empty_dict = {"a": 1}
filled_dict = {"a": 1, "e": 0, "i": 0, "o": 0, "u": 0}
filled_dict["i"] = filled_dict["i"] + 1
print(filled_dict)
filled_dict["i"] += 2
print(filled_dict)
print("-----")
# empty_dict["e"] += 1 # Was läuft hier schief?
# print(empty_dict)
# print(empty_dict)
# empty_dict["a"] =+ 1 # Und was läuft hier schief?
# print(empty_dict) # Achten Sie auf den Operator...
Die folgenden Dictionary-Methoden liefern eine Sequenz aller Schlüssel bzw. aller Werte eines Dictionarys.
Vorsicht: Die Reihenfolgen der Listenelemente innerhalb der beiden Listen müssen nicht miteinander korrespondieren!
Ob die Reihenfolge eingehalten wird, ist von der Python-Version abhängig. Ab Python 3.7 bleibt die Reihenfolge erhalten.
filled_dict = {'a': 1, 'e': 0, 'i': 3, 'o': 0, 'u': 0}
##########################################################
schluessel = filled_dict.keys() # alle Schlüssel des Dictionarys
print(schluessel)
werte = filled_dict.values() # alle Werte des Dictionarys
print(werte)
elif
-Bedingungen und genau ein else
-Statement sind möglich -
aber jeweils nicht obligatorischliste_4 = ["item_1", "item_2", "item_3", "item_4"]
###################################################
print(liste_4)
print("-----")
if len(liste_4[1]) > 8:
print(liste_4[1])
else
-Statement kann sinnvoll sein, um sicher zu gehen, dass der gesamte if
-Block ausführt wurde.if
-Block und springt direkt in den else
-Block.liste_4 = ["item_1", "item_2", "item_3", "item_4"]
###################################################
if len(liste_4[0]) > 8:
print(liste_4[0])
else:
print("Hier gibt es nichts zu sehen.")
For
-Schleifen¶range()
stellt eine iterierbare Sequenz von Ganzzahlen bereit:range(n)
aufgerufen, so wird die Sequenz 0, 1, ... , n-1 bereitgestellt.range(n,m)
kann man Beginn n (inklusiv) und Ende m (exklusiv) der Sequenz bestimmen: n , n+1, ..., m-1for i in range(-3, 6):
print(i)
Was passiert in dem Code-Block oben?
liste_4 = ["item_1", "item_2", "item_3", "item_4"]
###################################################
for i in range(3):
print(liste_4[i])
Was passiert in dem Code-Block oben?
for i in range(0, 2):
print(liste_4[i])
Was passiert in dem Code-Block oben?
liste_4 = ["item_1", "item_2", "item_3", "item_4"]
###################################################
for x in liste_4:
print(x)
liste_4 = ["item_1", "item_2", "item_3", "item_4"]
###################################################
for i in range(len(liste_4)):
print(liste_4[i])
Stellen Sie sich vor, wir sind interessiert an allen Zahlen im Zahlenraum bis 50, die die Ziffern 3 und/oder 5 enthalten, und möchten uns diese ausgeben lassen.
for i in range(1, 51):
string_i = str(i)
if "5" in string_i and "3" in string_i:
print("Die Zahl " + string_i + " enthält die Ziffern 3 und 5.")
elif "5" in string_i:
print("Die Zahl " + string_i + " enthält die Ziffer 5.")
elif "3" in string_i:
print("Die Zahl " + string_i + " enthält die Ziffer 3.")
else:
print("Die Zahl " + string_i + " ist hier uninteressant. Die nächste bitte!")
Häufig möchte man Inhalte von komplexen Datentypen, wie Listen oder Dictionarys, ansehnlich ausgeben:
liste_4 = ["item_1", "item_2", "item_3", "item_4"]
###################################################
# Im Programm:
for item in liste_4:
print(item)
print("-----")
# als Funktion:
def print_list(die_liste): # Funktionsdefinitions: def als Startsymbol, Funktionsname
# und in Klammern die Funktionsparameter (optional).
for item in die_liste: # Der Funktionskörper mit den Befehlen ist eingerückt.
print(item) # Mehrere Einrückungen sind möglich bzw. nötig.
return # Rückgabewert definieren (optional)
print_list(liste_4)
die_liste
verfügbar.print()
immer sofort ausgeführt wird.liste_4 = ["item_1", "item_2", "item_3", "item_4"]
###################################################
# mit noch schönerem Output und mehreren Parametern:
def print_list_nicer(die_liste, der_ausgabetext):
counter = 1 # Zählervariable
for item in die_liste:
print(der_ausgabetext + " " + str(counter) + ". " + item)
counter += 1
print_list_nicer(liste_4, "Uiuiui das")
return
-Statement ohne zusätzliche Angabe ist eine Kurzform von return None
. Das bedeutet, dass die Funktion ein "leeres" Ergebnis zurückliefert (Datentyp None
).return
-Statement schreiben oder return
einfach vollständig weglassen. Für die bessere Lesbarkeit empfehlen wir Ihnen, immer return
zu schreiben, auch wenn Sie keinen Rückgabewert verwenden möchten!liste_4 = ["item_1", "item_2", "item_3", "item_4"]
###################################################
def alles_zurueckgeben(eingabe_liste):
result = ""
for x in eingabe_liste:
result = result + x + "\n"
return result
rueckgabe = alles_zurueckgeben(liste_4)
print(rueckgabe)
alles_zurueckgeben(...)
enthält kein print()
. Stattdessen wird ein String namens result
nach und nach um zusätzliche Informationen erweitert. Zum Schluss wird der fertige String als Rückgabewert weitergereicht.alles_zurueckgeben(...)
aufgerufen wird, sehen wir zunächst nichts. Wir können aber den Ergebnis-String speichern, weil er als Ergebnis von der Funktion zurückgegeben wird - oder wir betten den Funktionsaufruf in ein print()
-Statement ein.Wie soll die Funktion heißen? Der Name soll möglichst aussagekräftig sein und die Aufgabe beschreiben, die von der Funktion erledigt wird. Beispiel:
def reverse_string
Welche Daten soll die Funktion als Ausgangspunkt nehmen? Diese Werte können als Parameter übergeben werden. Beispiel:
def reverse_string(original_string):
Welcher Wert soll am Ende der Funktion zurückgegeben werden? Sie können entweder den eingegebenen Wert überschreiben oder eine neue Variable anlegen (letzteres ist lesbarer). Beispiel:
def reverse_string(original_string):
reversed_string = "" # hier kümmern wir uns gleich drum
return reversed_string
Und schließlich: Wie soll die Aufgabe der Funktion Schritt für Schritt gelöst werden? Code im Funktionskörper ergänzen.
def reverse_string(original_string):
reversed_string = original_string[::-1] # Geheimtipp zum Umdrehen von Strings in Python!
return reversed_string
return
geschrieben. Tun Sie das nur, wenn Sie sich gut in Ihrem eigenen Code auskennen!def reverse_string(original_string):
return original_string[::-1] # wir brauchen keine neue Variable mehr!
print(reverse_string("Pythonkurs"))
print(reverse_string("Python, aber rückwärts"))
<modulname>.<modul-funktion>
Der Interpreter liest das Modul random ein und merkt sich alle Funktionen, die darin definiert werden.
randint(...)
aus dem Modul random
aufrufen.import random
liste_5 = []
for i in range(10):
zufallszahl = random.randint(1,100)
liste_5.append(zufallszahl)
print(liste_5)
.txt
. Wir werden aber später noch andere Endungen benutzen.open()
ist der Dateiname"w"
für write an, dass wir in eine Datei schreiben wollenencoding="utf8"
festlegen. UTF-8 ist eine Zeichencodierung die mit Umlauten und vielen, vielen Zeichen mehr gut umgehen kann.as
gefolgt von einem neuem Variablennamen legen wir fest, wie wir die Datei, in die wir schreiben wollen, in unserem Programm bezeichnen. print()
-Befehl können wir ausgaben in Dateien umleiten. Dazu müssen wir in den Klammern von print()
außer dem Inhalt, der ausgegeben werden soll, auch den zusätzlichen Parameter file=<Name der Datei mit Dateieindung>
angeben!dateiname = "texttesttext.txt"
with open(dateiname, "w", encoding="utf8") as outfile:
print("Hat's was geschrieben?", file=outfile)
# print(outfile.read()) # Man kann nix Lesen im Schreibmodus
print("Geschafft! Die Datei '" + dateiname + "' wurde erstellt.")
encoding="utf8"
als dritten Parameteras
ein Dateibezeichner für den Verlauf des Programms festgelegt werden.Nun können wir im Körper des open()
-Statements mit for
durch die Zeilen der Datei iterieren.
Wenn wir im "r"-Modus versuchen, Inhalte in die Datei zu schreiben, schlägt das fehl.
pfad_u_dateiname = "c:/Users/Ben/Desktop/superstition.txt"
with open(pfad_u_dateiname, "r", encoding="utf8") as infile:
for line in infile:
print(line)
Statt durch die Zeilen zu iterieren, können wir uns auch die ganze Datei auf einmal anzeigen lassen.
Das Ergebnis der Operation infile.read()
ist ein String. Hier wird dieser String
gedruckt, aber wir könnten ihn auch in einer Variable speichern und dann unsere
gewohnten Stringmethoden darauf anwenden.
Bei sehr großen Dateien ist es empfehlenswert, die Inhalte zeilenweise zu verarbeiten.
dateiname = "texttesttext.txt"
with open(dateiname, "r", encoding="utf8") as infile:
dateiinhalt = infile.read()
print(dateiinhalt)
# print("Täst, Töst", file=infile) # Man kann nix schreiben im Lesemodus!
Wenn wir Dateien im Schreibmodus öffnen, werden diese Dateien neuerstellt bzw. der Inhalt bestehenden Dateien vollständig überschrieben, sodass evtl. vorher vorhandener Inhalt verloren geht.
Um Inhalt zu bereits bestehenden Dateien hinzuzufügen, können wir Dateien im Append Mode (Anfügemodus) öffnen.
Dazu geben wir als zweiten Parameter des open()
-Befehl "a"
an.
Neues Material wird dann am Ende der Datei hinzugefügt.
pfad_u_dateiname = "c:/Users/Ben/Desktop/superstition.txt"
weitere_zeile = "Oh no! Nah, nah, nah!"
with open(pfad_u_dateiname, "a", encoding="utf8") as append_file:
print(weitere_zeile, file=append_file)
# print(append_file.read()) # Man kann nix lesen im Anfügemodus!
Jetzt, wo wir Funktionen geschrieben haben, können wir den User entscheiden lassen, auf welche Eingabewerte eine Funktion angewendet werden soll. Dazu verwenden wir das Kommando input()
. Zuerst ein Beispiel für die grundlegende Verwendung von input()
:
original_word = input("Bitte ein Wort eingeben! ")
print("Sie haben das Wort \"" + original_word + "\" eingegeben.")
Der String in den Klammern beim Aufruf von input
dient dazu, den User zu informieren, dass eine Eingabe erwartet wird.
Jetzt definieren wir unsere String-Umkehrungsfunktion von oben noch einmal und lassen uns dann drei eingegebene Worte nacheinander umdrehen:
# Funktionsdefinition:
def reverse_string(original_string):
reversed_string = original_string[::-1]
return reversed_string
# Jetzt fragen wir nach drei Wörtern.
for i in range(3):
input_word = input("Welches Wort soll umgedreht werden? ")
# Das Ergebnis ist ein String, der von der Funktion mit
# return zurückgegeben wird. Wir können ihn hier ausgeben.
print("Ergebnis: " + reverse_string(input_word))
Falls wir noch Zeit haben, können wir hier sogar noch Bedingungen einbauen!
# Funktionsdefinition:
def reverse_string(original_string):
reversed_string = original_string[::-1]
return reversed_string
# Jetzt fragen wir nach drei Wörtern.
for i in range(3):
input_word = input("Welches Wort soll umgedreht werden? ")
# Nur Wörter mit mehr als 1 Zeichen sollen umgedreht werden.
if len(input_word) > 1:
# Das Ergebnis ist ein String, der von der Funktion mit
# return zurückgegeben wird. Wir können ihn hier ausgeben.
print("Ergebnis: " + reverse_string(input_word))
else: # Bei kürzeren Wörtern...
# ... sind wir faul und geben das Originalwort zurück.
print("Ergebnis: " + input_word)