===== Grundlagen und Wiederholung Programmierung ===== ==== L1-4: Wiederholung Grundkonzepte Python ==== === Ziele === - Du kannst elementare Programme schreiben und ausführen. - Du kannst elementare Kontroll- und Schleifenstrukturen benennen und einsetzen. - Du weisst was Funktionen sind und kannst eigene Funktionen definieren und ausführen. Ziel dieser Lektion(en) wird sein, dass wir das [[https://de.wikipedia.org/wiki/Sieb_des_Eratosthenes|Sieb des Eratosthenes]] implementieren. Vereinfacht gesagt, handelt es sich beim Sieb des Eratosthenes um eine (langsame) Methode, alle Primzahlen kleiner einer Zahl $n$ zu bestimmen. === Aufträge === - Wiederhole resp. lies die folgenden Konzepte nach - [[http://www.tigerjython.ch/index.php?inhalt_links=navigation.inc.php&inhalt_mitte=grafik/forInRange.inc.php|''for''-Schleifen]]. Schreibe ein Programm, welches die folgenden Ausgaben hat - alle geraden Zahlen bis 200 - alle ungeraden Zahlen bis 200 - alle Vielfachen von 7 bis 300 - alle Quadratzahlen bis 10000. Um Zahlen zu exponentieren, verwendet man ''* *''. Um also $3^2$ zu berechnen, gibt man '' 3 2'' ein. - [[http://www.tigerjython.ch/index.php?inhalt_links=navigation.inc.php&inhalt_mitte=turtle/selektion.inc.php|Kontroll-Strukturen]]. Schreibe ein Programm, welches die Ausgaben, des [[https://de.wikipedia.org/wiki/Fizz_buzz|Fizz Buzz]]-Spiel ausgibt. Um die Teilbarkeit einer Zahl zu überprüfen, kannst du den //Modulo//-Operator verwenden: ''7%3'' z.B. ergibt den Rest der bei der Division von 7 durch 3 entsteht. - [[http://www.tigerjython.ch/index.php?inhalt_links=navigation.inc.php&inhalt_mitte=grafik/listen.inc.php|Listen]]. - Schreibe ein Prorgamm, welches aus der Liste ''[1,3,2,1,7,-1,7,2.1]'' - den dritten Wert ausgibt - den Durchschnitt des zweiten und dritten Wert ausgibt - den Durchschnitt aller Werte ausgibt - den höchsten Wert (ohne 7 fix zu nennen) mit 12 überschreibt. - die Werte an der ersten und dritten Stelle tauscht. - Ergänze das Programm unten so, dass dir die höchste Zahl (das Maximum) der Zufallsliste ausgegeben wird. Verwende dabei den Befehl ''max'' //nicht// sondern ausschliesslich die Vergleichsoperatoren ''<'' und ''>'' sowie ''if'' o.ä. from random import randint #Funkion zum Erzeugen von zufälligen Listen def zufallszahlen(n): zufallsliste = [randint(0, 1000) for i in range(n)] return zufallsliste liste = zufallszahlen(100) print(liste) print(len(liste)) print(range(len(liste))) for i in range(len(liste)): #ergänze den Code. - [[http://www.tigerjython.ch/index.php?inhalt_links=navigation.inc.php&inhalt_mitte=turtle/funktionen.inc.php|Funktionen]]. - Verwende deinen Code von oben, um eine Funktion zu schreiben, welche als Argument eine beliebige Liste hat und als Rückgabewert, den grössten Wert dieser Liste hat. Erweitere die Funktion mit einem zweiten Argument, so dass man spezifieren kann, ob man den grössten oder den kleinsten Wert zurückerhalten möchte. Verwende dazu die beiden Code-Skelette unten: def maximumliste(liste): #Hier kommt dein Code return(maximalerwert) - Schreibe eine Funktion, welche für ein Argument $i$ alle Werte bis (ohne) zu diesem Wert ausdruckt. Verwende dafür eine ''for''-Schlaufe. Nenne deine Funktion ''innereFunktion''. Der Output deiner Funktion sollte z.B. sein innereFunktion(4) 0 1 2 3 - Geschachtelte Schleifen. Schreibe eine Funktion, welche untenstehenden Output hat. Verwende dabei die Funktion ''innereFunktion'' von oben. Die horizontalen Abtrennungen kann man mit ''print("======")'' erreichen. 0 ====== 0 1 ====== 0 1 2 ====== 0 1 2 3 ====== 0 1 2 3 4 ====== - Löse die obere Aufgabe ohne den Aufruf deiner Funktion ''innereFunktion''. - Lies dir den Artikel oben zum Sieb des Eratosthenes nochmals durch, falls noch unklar ist, wie es funktioniert. Besprich Fragen mit der Lehrperson. - Starte mit einer Liste der Länge $n$, welche für jede Zahl von $1$ bis $n$ besagt, ob sie eine Primzahl ist oder nicht. Zuerst sind alle Elemente dieser Liste (alle Zahlen) ''True'': Du kannst z.B. '' isprime = [True for i in range(n+1)]'' verwenden[(Achtung: An der ersten Stelle ''isprime[0]'' steht die 0, an der zweiten ''isprime[1]'' die 1, etc. Daher bis $n+1$)]. An der $i$-ten Stelle der Liste, steht also die natürliche Zahl $i$. Die ersten beiden $i=0$ und $i=1$ <<übergehen>> wir in der Schlaufe einfach. - Nachher kannst du die entsprechenden Positionen in dieser Liste zu ''False'' ändern, wenn es keine Primzahl ist. Der ''range''-Befehl, lässt beliebige Inkremente[(Inkremente sind Vergrösserungen oder Schrittweite. Normalerweise ist das Inkrement bei ''range'' $1$, es kann aber auch manuell spezifiziert werden)] zu: ''print(range(min,max,delta))'' listet alle Zahlen zwischen ''min'' und ''max'' mit Abstand ''delta'' auf. Kopiere diesen Code, ersetze die Variablen durch Werte, und stelle sicher, dass du den Befehl verstehst. - Kombiniere die beiden Punkte oben zu eine Programm, welches alle Primzahlen bis zur Zahl $n$ ausgibt. - **Weiterführend**: Schreibe ein Programm, um die 100ste Primzahl ($n$-te) Primzahl zu bestimmen. - **Weiterführend**: Stelle die Laufzeits deines Proramms ($y$-Achse) in Abhängigkeit der Zahl $n$ ($x$-Achse) dar. Die Laufzeit kann z.B. mit folgender Idee gemessen werden: import time start_time = time.time() # some code stop_time = time.time() print(stop_time-start_time) Die Darstellung als Streudiagramm (Scatterplot) kann z.B. [[http://programmierkonzepte.ch/index.php?inhalt_links=navigation.inc.php&inhalt_mitte=simulationen/korrelation.inc.php|hier]] abgeschaut werden. - Erster Teil - Schlaufen: from math import floor ## I for i in range(100): print(2*i) # oder for i in range(2,200,2): print(i) ## II for i in range(100): print(2*i+1) #oder for i in range(1,200,2): print(i) ## III for i in range(7,300,7): print(i) # oder manuell floor runden ab. for i in range(int(floor((300-7)/7))+1): print(7+i*7) ## IV; exponentieren erfolt mit ** for i in range(100+1): print(i**2) - FizzBuzz: for i in range(1, 100): if i % 3 == 0 and i % 5 == 0: print ("FizzBuzz") elif i % 3 == 0: print "Fizz" elif i % 5 == 0: print "Buzz" else: print i - Listenspielerein li = [1,3,2,1,7,-1,7,2.1] # A print(li[2]) # B av = li[1]+li[2] print(av) # C lenli = len(li) sumvar = 0 for i in range(lenli): sumvar = sumvar+li[i] print(sumvar/lenli) # D: Funktioniert das immer? Macht das, was gewollt ist? for i in range(lenli): if(li[i]==max(li)): li[i]=12 print(li) # E li = [1,3,2,1,7,-1,7,2.1] a = li[2] li[2] = li[0] li[0] = a print(li) - Max #I from random import randint # Funkion zum Erzeugen von zufälligen Listen def zufallszahlen(n): zufallsliste = [randint(0, 10000) for i in range(n)] return zufallsliste liste = zufallszahlen(100) print(liste) print(len(liste)) print(range(len(liste))) maxno = 0 for i in range(len(liste)): if liste[i] >= maxno: maxno = liste[i] print(maxno) def findMax(liste): maxno = 0 for i in range(len(liste)): if liste[i] >= maxno: maxno = liste[i] return maxno print(findMax(zufallszahlen(30000))) #II def innereFunktion(j): for i in range(j): print(i) innereFunktion(4) #III for j in range(10): innereFunktion(j) ### for j in range(10): for i in range(j): print(i) print("=======") - Sieb from math import ceil n=50 #Idee: Liste mit True/False ob die Zahlen 0,1,2,3,... Primzahlen sind isPrime = [True for i in range(n+1)] #Alle Zahlen ab 2 durchgehen, welche noch nicht durchgestrichen worden sind. for i in range(2,n+1): #ist noch nicht rausgesrichen if isPrime[i] == True: #alle Vielflachen rausstreichen for j in range(2*i,n+1,i): isPrime[j] = False #alle nicht rausgesrichenen ausgeben for p in range(2,n + 1): if isPrime[p]: print(p) def Sieb(n): isPrime = [True for i in range(n+1)] for i in range(2,n+1): if isPrime[i] == True: for j in range(2*i,n+1,i): isPrime[j] = False primes = [] #alle nicht rausgesrichenen zur Liste hinzufügen for p in range(2,n + 1): if isPrime[p]: primes.append(p) return(primes) print(Sieb(30)) #Eigentlich müsste nur bis Wurzel von n überprüft werden: def SiebSchneller(n): isPrime = [True for i in range(n+1)] for i in range(2,int(ceil(sqrt(n)))): if isPrime[i] == True: for j in range(2*i,n+1,i): isPrime[j] = False primes = [] #alle nicht rausgesrichenen zur Liste hinzufügen for p in range(2,n + 1): if isPrime[p]: primes.append(p) return(primes) print(SiebSchneller(30)) ===== Simulationen ===== ==== L1-6: Erarbeitung Skript ==== Bearbeite das Skript {{https://bldsg.sharepoint.com/:b:/r/sites/cl03-ksbg-el/classes/1dNP_2017/Theorie/Informatik/04_Simulation/Simulation.pdf?csf=1&web=1||Simulationen}}. Wenn du damit fertig bist, wähle ein Arbeitsblatt deiner Wahl: {{https://bldsg.sharepoint.com/:b:/r/sites/cl03-ksbg-el/classes/1dNP_2017/Theorie/Informatik/04_Simulation?csf=1&web=1||Arbeitsblätter}} from random import randint zufallszahl = randint(1,100) print(zufallszahl) from random import randint for i in range(20): zufallszahl = randint(1,100) print(zufallszahl) # oder zufallszahlen = [] for i in range(20): zufallszahl = randint(1,100) zufallszahlen.append(zufallszahl) print(zufallszahlen) ===== Big Data: Datenanalyse und Datenschutz ===== ====L7-L8: Meine Daten ==== Wähle eine App / Firma / Tool deiner Wahl. Versuche herauszufinden, wie du deine Daten herunterladen kannst. Häufig sind Stichworte wie "data request" bei Google hilfreich. - Wähle deine App und finde einen Weg, deine Daten herunterzuladen ("data request" als Stichwort bei der Suche ist hilfreich) - Wenn du die Daten erhalten hast: Wie sehen diese aus? In welchem Format kommen die Daten daher? Kannst du sie lesen? - Welche Fragen könntest du mit diesen Daten bzgl. deines Nutzungsverhalten beantworten? === Alternative Aufträge === - Evil Twin bauen. Konkrete Frage: Wie könnten damit Daten missbraucht werden? - Knoppix, Ubuntu Live, Tails, o.ä. verwenden. == Endprodukt Tails == * Wie funktionieren "Live-Operating-Systeme" (Live-OS) * Was ist speziell bei Tails im Gegensatz zu anderen Live-OS? * Wer nutzt dies? Wie nutzt es wem? * Ist die Anonymisierung die z.B. Tails nutzt in jedem Fall verlässlich ("compromised exit nodes")? ==== L9-L10: Datenanalyse ==== === Ziel === Am Beispiel von Youtube-Daten (Watch-History) können die eigenen Verhaltensmuster mit Excel analysiert werden. === Aufträge === - [[https://web.microsoftstream.com/video/ba753801-9ab8-41e4-9c9e-d14fe3ddf4db|Einführungsvideo]] schauen - Daten bei Youtube [[https://takeout.google.com/|herunterladen]] und mit diesem Programm [[lehrkraefte:ks:informatik-glf4-20_4blw:extractor|Python-Programm]] ({{lehrkraefte:ks:informatik-glf4-20:youtube-date-extractor.py|deutsche}}/ {{lehrkraefte:ks:informatik-glf4-20:youtube-date-extractor-europe.py|europäische}}) Formatierung in ein CSV konvertieren. Falls keine eigene Daten heruntergeladen werden können, bitte diese {{lehrkraefte:ks:informatik-glf4-20:jan14-history.html|Datei}} verwenden. - CSV in Excel öffnen - [[https://web.microsoftstream.com/video/114ca60b-fa45-4b99-bb9e-a62b032fd5c6|Einführungsvideo Excel]] schauen - Folgende Excel-Funktionen nachlesen resp. ausprobieren: - [[https://support.microsoft.com/de-de/office/wochentag-funktion-60e44483-2ed1-439f-8bd0-e404c190949a|Wochentag]] - [[https://support.microsoft.com/de-de/office/stunde-funktion-a3afa879-86cb-4339-b1b5-2dd2d7310ac7|Stunde]] - [[https://support.microsoft.com/de-de/office/mittelwert-funktion-047bac88-d466-426c-a32b-8f33eb960cf6|Mittelwert]] - Spalten erstellen mit den den notwendigen Informationen, z.B. Stunde am Tag, Wochentag, etc. (siehe oben) und diese dann als Excel-Datei speichern. - Folgende Fragen mit Filter oder Pivot beantworten: * Zu welcher Tageszeit schaue ich am meisten Videos? * An welchem Wochentag schaue ich am meisten Videos? * Wie viele Videos schaue ich durchschnittlich pro Tag? * ... ==== L11-L12: Datenanalyse Instagram ==== Analog zur Analyse von Youtube-Daten können auch Instagram-Daten analysiert werden. Zu diesem Zweck müssen die Daten bei Instagram heruntergeladen werden: [[https://www.instagram.com/download/request/|Download-Tool]] (HTML wählen). - Lädt diese Daten herunter, entpackt sie und untersucht die heruntergeladenen Daten. Die HTML-Dateien sind miteinander verlinkt und können so navigiert werden. - Kopiert den Code unten in TigerJython und passt den Pfad zum entpackten Ordner oben an. Das Programm funktioniert ähnlich wie die Analyse der Youtube-Watchlist. Es untersucht alle Dateien, und speichert die Zeit wie auch die Art der Handlung auf Instagram. Die Datei ``resultat.csv`` kann dann gleich analysiert werden wie die Youtube-Watchlist. === Zu wenig Speicher beim Download === Win+E, auf Laufwerk C: navigieren und dort Ordner ''temp'' o.ä. erstellen. Dann können die Dateien dort gespeichert werden. **Achtung**: Unbedingt wieder löschen (Shift-Delete; oder Papierkorb leeren) vor Log-out. Dieser Ordner ist sonst für alle ersichtlich. import re # Regular Expressions import datetime # Datum/Zeit import os # Files suchen # Erklärungen zu diesem Code sind Analog dem Youtube-Extraktor. rootdir = "C:/pfad/zum/entpackten/instagram/ordner/" # Resultat, das am Schluss geschrieben werden soll csv = "" # Comma separated values # Wie viele Kontrollausgaben? debug = 10 # Alle HTML-Dateien im Verzeicznis anzeigen for root, dirs, files in os.walk(rootdir): for file in files: if file.endswith(".html"): filepath = os.path.join(root, file) # Datei oeffnen f = open(filepath, "r") html = f.read() # Alles einlesen f.close() # Datei schliessen # Datum der Form 30.12.2021, 22:13 einlesen # Alle nötigen Angaben werden in Klammern "ge-captured" daten = re.findall("(\d{1,2}).(\d{1,2}).(\d{1,4}), (\d{1,2}):(\d{1,2})", html) if(debug>0): print(file,": ",len(daten)) debug-=1 # Alle Einträge durchgehen, d enthält jeweils den nächsten Eintrag for d in daten: # Einträge in Zahlen umwandeln # Monat plus die anderen Einträge (ohne AM/PM) in Zahlen umgewandelt # Die Zeichenkette "42" ist nicht das gleiche wie die Zahl 42. e = [int(x) for x in d] if debug>0: # Ausgabe zur Kontrolle, sollte folgendes Format Produzieren print(e) # [1, 6, 2021, 21, 23, 12] debug -= 1 # Um 1 vermindern # Datum daraus generieren (macht die Datumsmanipulation einfacher). # Jahr, Monat, Tag, Stunde, Minute, Sekunde datum = datetime.datetime(e[2], e[1], e[0], e[3], e[4],0) if debug>0: # Ausgabe zur Kontrolle, produziert folgendes Format print(datum) # 2021-01-06 21:23:12 debug -= 1 # Um 1 vermindern # Wochentag (Mo=0, Di=1, ..., So=6) # Sämtliche Methoden für datetime-Objekte sind hier beschrieben: https://docs.python.org/3/library/datetime.html#datetime-objects wday = datum.weekday() # Formatierte Ausgabe des Datums, siehe https://www.w3schools.com/python/python_datetime.asp # \n heisst neue Zeile. csv += datum.strftime("%Y-%m-%d %H:%M:%S;"+os.path.splitext(file)[0]+"\n") #Das Format soll so angepasst werden, damit die Tabellenkalkulation dann damit umgehen kann. # Ausgabe in Datei schreiben f = open("resultat.csv", "w") f.write(csv) f.close() ==== 2. Note: Bewertete Analyse: Abgabe 24. Mai 2021 ==== Dokumentation der eigenen Analyse in einem PDF-Dokument, welches - Eine Einleitung enthält, welche * Beschreibt (Screenshot; Shortcut: ''PrtScr'' oder ''Alt+PrtScr'') woher die Daten kommen und wie diese aussehen * Beschreibt, welche Daten erhoben werden. - Eine Frage formuliert, welche auf Grund von Excel-Analysen der eigenen Daten beantwortet kann. - Mindestens eine Analyse der eigenen Daten welche die Frage aus dem vorigen Punkt beantwortet. Z.B. Wann mache ich xxx am häufigsten? - Einen Abschnitt, welcher Zusammenfasst, was du in diesem Teil der Informatik gelernt hast, bzgl. * Excel * Python * BigData und sozialen Netzen im Allgemeinen. Bewertungskriterien: * Nachvollziehbarkeit der Ausführungen und Analysen * Dokumentation der Analysen (Erklärungen, Screenshots, etc.) * Ausführlichkeit der Analysen * Darstellung des Berichts === Tipps Word === * ''PrtScr'' erstellt ein Bildschirmfoto des ganzen Bildschirms in der Zwischenbalge (''CTRL''+''V'' zum Einfügen) * ''Alt''+''PrtScrn'' erstellt ein Bildschirmfoto des aktiven Fensters in der Zwischenbalge (''CTRL''+''V'' zum Einfügen) * ''Win''+''PrtScrn'' erstellt ein Bildschirmfoto und speichert es im Bilder-Ordner von Windows * ''Win''+''Shift''+''S'' öffnet einen Dialog um ein Bildschirmfoto aufzunehmen und einen Bereich auszuwählen und speichert es dann in der Zwischenbalge (''CTRL''+''V'' zum Einfügen) ===== Generelles Python ===== === Module ==== Module können in diesen zwei Arten verwendet werden: from random import * random() oder import random random.random() Beide Varianten rufen am Schluss die Funktion ''random()'' auf. === Wenn TigerJython abstürzt, hängt, sich nicht schliessen lässt... === Auf den Schulcomputern ist der Task-Manager für Sie leider gesperrt. Hier ist der Work-Around: Öffnen Sie die Powershell Konsole (Win+Q; PowerShell) und geben dann das folgende ein: stop-process -name javaw Um TigerJython zu beenden, führen Sie obige Datei mit PowerShell aus: **Rechtsklick -> Ausführen mit PowerShell** Sie können aber auch einfach obige Zeile in PowerShell eingeben und ausführen (Enter). ===== Ressourcen ===== * [[http://www.tigerjython.ch/download/tigerjython.pdf|Lehrbuch Tigerjython]] * [[https://tobiaskohn.ch/files/PythonCheatSheet.pdf|CheatSheet Tigerjython]] * [[https://www.w3schools.com/python/module_random.asp|Übersicht Random Modul]]