# -*- coding: utf-8 -*- """ Skript für "Einführung in Python" (Sitzung 2) In dieser Datei sammeln wir den Inhalt zu der zweiten Sitzung von "Einführung in Python". @author: Dr. David Krassnig """ # %% OPERATOREN IN PYTHON %% # # %% Operatoren mit Zahlen print(2+2) # Addition print(2-2) # Subtraktion print(2*3) # Multiplikation print(2**3) # Exponent (2 hoch 3) print(2/3) # Dividieren; immer ein float! # Wenn ihr ein Integer haben möchtet: print(3/3) print(int(3/3)) print(10//3) # Wie häufig passt rechts in links rein print(123%36) # Wie viel bleibt übrig beim dividieren? # %% Operatoren mit Strings print("Hal"+"ga123") # Texte miteinander kombinieren print("Hal","ga123") # print("Halgal"-"al") # Keine valide Option! print("Hal"*3) #Beispiel anwendungszeck print("Hallo, ich bin eine Überschrift!") print("-"*len("Hallo, ich bin eine Überschrift!")) # Alle anderen Zahlenoperatoren: Ungültig!!! # %% Operatoren mit Sammlungen print([1,2,3]+[4,5,6]) # print([1,2,3]-[4,5,6]) print([1,2,3]*2) # print({1,2,3}+{4,5,6}) # Ffunktioniert nicht! print({1,2,3}.union({4,5,6})) # Union-Methode notwendig! print({1,2,3}-{2,3}) # print({1:"David",2:"Stefan"}+{3:"Johann"}) # Dictionaries sind nicht operatorfreudig! # print({1:"David",2:"Stefan"}-{3:"Johann"}) # Siehe oben! # %% Operatoren mit Wahrheitswerten print(True and True) print(True and False) print(True or True) print(True or False) print(False or False) print(not True) print(not False) # %% AUFGABEN ## "Blitz" hat einen Freund, "Stolas", der ständig ein "ie" an "Blitz" anhängt. Wie kann man diesen Kosenamen generieren? print("Blitz"+"ie") ## Ihr möchtet herausfinden wie viel Prozent 9 von 16 ist. Wie geht ihr vor? Bonus: Wie könnt ihr das Ergebnis mit einem Prozentzeichen anzeigen lassen? print(str(9/16*100)+" %") # %% VARIABELN IN PYTHON %% # # %% Variabel-Zuweisung # Variabeln werden mit = zugewiesen name = "David Krassnig" zahl = 123 liste = ["david","johann","maria"] # %% Variabel-Nutzung print(name) print(zahl) print(liste) akkumulator = [] akkumulator.append("david") akkumulator.append("johann") print(akkumulator) # %% Variabel-Modifizierung ## Operatoren # Alle Operatoren eines entsprechenden Typs können auf Variabeln desselben Typs angewandt werden zahl = 10 zahl = 12 # Variabelwerte können mit = überschrieben werden zweite_zahl = zahl*14 print(zweite_zahl) ## Methoden # Alle Methoden eines entsprechenden Typs können auf Variabeln desselben Typs angewandt werden # Methoden modifizieren eine Variabel häufig direkt liste.remove("johann") # Einen Wert aus der Liste entfernen print(liste) liste.append("sabine") # Einen Wert an die Liste hinten anhängen print(liste) ## Funktionen # Funktionen ändern Variabeln häufig NICHT direkt, sondern das Ergebnis muss, wenn gewünscht, erneut der Variable mit = zugewiesen werden! n = "Ersthelfer" # Erster Wert print(n) len(n) # Länge von "Ersthelfer" print(n) n = len(n) # Überschreiben von "Ersthelfer" mit dessen Länge print(n) n = 0 # Erster Zahlenwert n = n+1 # Vorheriger Zahlenwert wird um 1 erhöht print(n) n += 1 # Abkürzung für n = n+1 # %% Datei als Variabel öffnen # Python kann Dateien öffnen und Informationen in Dateien abspeichern # Geöffnete Dateien werden als Variabeln mit Sondertyp abgespeichert und durch Methoden modifiziert datei = open("testdatei.txt","w") # Öffnen einer Datei! "w" spezifiziert, dass in dieser Datei geschrieben werden soll. Alternativen sind "r", wodurch eine Datei nur zum Lesen geöffnet wird, und "a", wodurch Informationen nur angehängt aber nicht überschrieben werden können! text = "Dies ist eine Beispielinformation, die abgespeichert werden soll!" datei.write(text) # Mit der Methode .write(...) wird der angegebene Input der Datei zugewiesen datei.close() # Damit die veränderte Datei abgespeichert wird, muss die Methode .close() genutzt werden, da ansonsten die durch .write(...) zugewiesenen Informationen NICHT auf der Festplatte abgespeichert werden. # %% Variabel-Löschung # Es ist gute Praxis, Variabeln zu löschen, wenn sie nicht mehr benötigt werden, um den Arbeitsspeicher des Python-Skriptes zu minimieren. Dies kann mit der del(...) Funktion erreicht werden. del(n) # %% KONDITIONALE IN PYTHON %% # # Konditionale erlauben es euch, Code nur unter bestimmten Bedingungen zu erfüllen # %% Wenn-Dann # Jeder Konditional besteht mindestens aus "if" # Beispiel mit Zahlenwerten n = 1 if n > 5: # Der eingerückte Code unten wird nur ausgeführt, wenn n größer fünf wahr ist print("Jipii! Es ist größer!") print("Ich habe meine Arbeit getan!") if not n > 5: # Der eingerückte Code unten wird nur ausgeführt, wenn n NICHT größer fünf wahr ist print("Jipii! Es ist größer!") print("Ich habe meine Arbeit getan!") # Da dieser Code nicht eingerückt ist, wird er unabhängig der vorhergehenden if-Konditionale ausgeführt # Beispiel mit Stringwerten name = "Blitzi" if name[-1]=="o": # Beachtet immer, dass "=" Werte zuweist und "==" Werte vergleicht! print("Nenn mich gefälligst Blitz!") # Beispiel mit Listenwerten liste = ["daniel","maria","sabine"] if liste[0]=="david": print("Jay, ich bin erster!") # Beispiel mit Mengenwerten menge = {"daniel","maria","sabine"} if "daniel" in menge: print("Jay, ich bin erster!") # %% Ansonsten # Sollte die Bedingungen nicht erfüllt werden, kann man noch "ansonsten"-Code mit else deklarieren n = 1 if n > 5: print("Jipii! Es ist größer!") else: print("Ich bin doch nicht größer!") print("Ich habe meine Arbeit getan!") # %% Ansonsten-Wenn # Man kann mit elif (steht für "else if") auch zusätzliche alternativen Konditionen geben. n = 8 if n > 5: print("Jipii! Es ist größer!") elif n == 1: print("Ich bin einzigartig!") else: print("Ich bin doch nicht größer!") print("Ich habe meine Arbeit getan!") # %% SCHLEIFEN IN PYTHON %% # In Python werden häufig Schleifen genutzt. Unter Schleifen versteht man einen Abschnitt im Code, der nach bestimmten Kriterien mehr als einmal abgespielt wird. Der Code, der wiederholt werden soll, wird, wie bei Konditionalen, mit einem Einrücken des Codes markiert. # Es wird zwischen zwei Schleifentypen unterschieden: while-Schleifen und for-Schleifen # %% While-Schleifen # While-Schleifen wiederholen den eingerückten Code solange wie die dazugehörige Kondition wahr ist. # Bei While-Schleifen ist wichtig, dass innerhalb des eingerückten Code ein Mechanismus vorhanden ist, der früher oder später dafür sorgt, dass sie Kondition der Schleife nicht mehr wahr ist, da sie ansonsten unendlich lang weitergeführt werden würde. n=1 # Setze AUßERHALB der Schleife einen Anfangswert (würde er innerhalb der Schleife gesetzt werden, würde er mit jeder Wiederholung zurückgesetzt werden) while n < 10: # "Wiederhole den eingerückten Code solange n kleiner als 10 ist" print("Yay!") # Drucke "Yay!" n = n+1 # Erhöhe den Wert von n, damit dieser nach genügend Wiederholungen nicht mehr kleiner als 10 sein wird # %% For-Schleifen # For-Schleifen wiederholen den eingerückten Code für alle Elemente einer Sammlung. # In For-Schleifen definiert man eine bisher nicht genutzte Variable. Diese Variable wird dann mit jeder Wiederholung mit einem anderen Wert aus einer Sammlung gleichgesetzt, bis alle Werte durchgegangen wurden. eureListe = ["proband_2024-01-16_tiefkuehlung.csv", "proband_2024-01-17_erhitzung.csv", "proband_2024-01-18_tot.csv", "proband_2024-01-19_gerichtsverhandlung.csv"] # Die Liste, für deren Elemente eine Schleife genutzt werden soll for euerVariabelName in eureListe: # Wir definieren, dass euerVariabelName den einzelnen Werten gleichgesetzt aus liste gleichgesetzt werden soll. print(euerVariabelName[8:18]) # %% AUFGABEN ## Schreibt eine while-Schleife, die alle (nicht-negativen) Zahlen bis 100 anzeigt. ## Mit len({"kaladin","syl","dalinar"}) erfahren wir, wie viele Namen in der Menge sind. Ihr leidet an len-spezifischer Amnesie und müsst dies nun stattdessen mit einer for-Schleife herausfinden. Wie würdet ihr vorgehen? ## Wie kann man von einem Namen sukzessive alle Endvokale löschen? Nutze die folgende Vorlage. name = "Frogdumiaunohiaueo" # while name[...] in {...}: # name = ... # print(name) ## Ihr seid ein Lehrer, der zu Faul ist, Klausuren zu korrigieren. Also erstellt ihr eine Schlaufe, welche allen Studierenden ein "Bestanden" zuordnet. Gehe von folgendem Dictionary aus. studierende_mit_note = { "eren": "noch nicht bewertet", "armin": "noch nicht bewertet", "mikasa": "noch nicht bewertet" } # %% FUNKTIONEN IN PYTHON %% # In Python können eigene Funktionen definiert werden. Dies erlaubt es, Code, der an verschiedenen Stellen im Skript ausgeführt wird, nur einmal zu definieren und dann mehrere Male aufzurufen. # Funktionen definiert man mit "def funktionsname(...):" und dann entsprechend eingerücktem Code, wo funktionsname der Name eurer Funktion ist und (...) die einzelnen Variabeln sind, die die Funktion als Input nehmen soll (können null sein oder beliebig viele) # Beispiel für Funktion OHNE Input: def einfacheTrennung(): print("-----") print("Einfaches Trennbeispiel:") print() einfacheTrennung() # Beispiel für Funktion MIT Input def titelMitTrennung(zuUnterstreichenderText): textLaenge = len(zuUnterstreichenderText) print("-"*textLaenge) print(zuUnterstreichenderText) print("-"*textLaenge) print() print("Jetzt ändert sich die Trennerlänge mit der länge des Textes:") print() text = "Die ist ein Beispielstitel" titelMitTrennung(text) print() text = "Und dies ist ein noch längerer Titel" titelMitTrennung(text) # Rückgabewerte # Funktionen können auch Werte zurückgeben, ohne dass diese gedruckt werden. Welcher Wert als Output einer Funktion gelten soll kann man mit return definieren. Ohne return hat eine Funktionen KEINEN nicht-leeren Wert, der in Variabeln gespeichert werden kann def malHundert(zahl): neueZahl = zahl*100 return neueZahl zwoelfMalHundert = malHundert(12) print(zwoelfMalHundert) # %% AUFGABEN ## Geht von dem unten angegebenen Beispielsdictionary aus, welche den Inhalt eines Raumes beschreibt, und schreibt eine Funktion, die Dictionaries als Input nimmt und alle Zombies im Raum tötet aber die Menschen verschont. raum_1 = { "rick":{ "name":"Rick Grimes", "status":"Mensch", "lebendig":True }, "glenn":{ "name":"Glenn Rhee", "status":"Mensch", "lebendig":False }, "liv":{ "name":"Liv Moore", "status":"Zombie", "lebendig":True }, "blaine":{ "name":"Blaine DeBeers", "status":"Zombie", "lebendig":True }, } # def zombie_killer(...): # ... # %% BIBLIOTHEKEN IN PYTHON %% # Python erlaubt es, neue Funktionen, Methoden und Klassen in sogenannte Bibliotheken zu bündeln, welche dann für spätere Projekte importiert werden können. Dies geht mit dem Befehl import # Hier zeigen wir ein paar der relevanteren Bibliotheken # %% decimal # Mit decimal kann man Dezimalzahlen mit beliebig vielen Nachkommastellen 100% akkurat darstellen. Sie sind damit eine sinnvolle alternative zu float-Zahlen, wenn hohe Präzision vonnöten ist import decimal # Wir importieren die Bibliothek # Um den Inhalt dieser Bibliothek aufzurufen, müssen wir IMMER spezifizieren, dass wir auf eine Funktion/Methode/etc von decimal zugreifen möchten. Das Muster hierfür ist "Bibliothek.Funktion" # Die wichtigste Funktion vom decimal-Paket nennt sich, verwirrenderweise, Decimal (großgeschrieben). Sie nimmt einen String, der nur Zahlenwerte beinhaltet, und konvertiert ihn in eine Dezimalzahl mit der man rechnen kann dezimalZehntel = decimal.Decimal("0.1") print("Mit Decimal: 0.1*3=",dezimalZehntel*3) floatZehntel = 0.1 print("Mit Floats: 0.1*3=",floatZehntel*3) # Der einzige Nachteil bei decimal vs floats ist, dass decimal-Zahlen mehr Arbeitsspeicher benötigen und der Rechner mehr Zeit für ihre Bearbeitung braucht (erneut das Prinzip: nutzt das aufwendigere nur dann, wenn ihr dessen Mehrwert tatsächlich benötigt!) # %% glob # Mit glob kann man nach bestimmten Mustern die Dateien auf eurem Rechner anzeigen lassen. # Man kann allen importierten Bibliotheken eine Abkürzung mit "as" geben. Hierbei sollte immer beachtet werden, dass der genutzte Wert nicht mehr als einmal verwendet wird. # Ich würde hiervon prinzipiell abraten, da es den Code nur unnötig schwer zu durchblicken macht. Besondere Ausnahmen sind jene Bibliotheken, wie pandas oder numpy, die eine weitverbreitet genutzte Abkürzung haben (in diesen beiden Fällen pd und np) import glob as gl # Die glob-Bibliothek, welche wir als gl geladet haben, besitzt hauptsächlich die glob-Funktion: eureDateien = gl.glob("*") # Zeigt alle Dateien in eurem jetzigen Ordner an print(eureDateien) print() eureDateien = gl.glob("*.py") # Zeigt alle py-Dateien in eurem jetzigen Ordner an print(eureDateien) # %% pandas und numpy # Weitere wichtige Pakete sind pandas und numpy. Diese werden für die Manipulation, Auswertung und Darstellung von großen Datensätzen und Statistiken genutzt. Aus zeitlichen Gründen wird hier jedoch nicht weiter auf diese eingegangen. Hier wird nur empfohlen, dass ihr euch diese für eure eigenen Zwecke gerne angucken könnt. # %% AUFGABE ## Importiere die Bibliothek "antigravity". Was macht sie und welche Lehre lässt sich aus ihr ziehen? # %% Gute fortführende Lernmaterialien # https://futurecoder.io/ (sehr interaktiv) # https://programming-23.mooc.fi/ (aufgenommene Python-Vorlesungen der Uni Helsinki) # https://cs50.harvard.edu/python/2022/ (Harvard Python Kurs Aufnahmen und Materialien) # https://automatetheboringstuff.com/ (Bestes Buch für Anfänger; frei online lesbar)