Didaktik#

Diese Seite: skizzen zur Didaktik des Kurses, zur Diskussion mit Kolleg:innen, insbesondere den Übungsgruppenleitern, und auch zur Selbstvergewisserung von JB.

Mit dem Whirlwind von Jake Vanderplas haben wir eine sachsystematische Darstellung einiger zentraler Sprachelemente und Ideen, die einen ersten Kern von Python ausmachen.

Es wäre kaum sinnvoll, einzelne Python-Sprachelemente sachsystematisch und sequentiell in voller Tiefe zu erlernen. Deshalb bewegen wir uns in Spiralen durch sachsystematische Darstellungen hindurch.

  • Runde 1: Einfache grundlegende prozedurale Kontrollstrukturen und Datentypen; Erstkontakt mit List Comprehensions;

  • Runde 2: Aufbauwissen; auch verschachtelte Schleifen und Datenstrukturen; Python spezifische Konzepte

In Runde 1 und 2 lesen wir dasselbe Lehrbuch, allerdings in unterschiedlicher Tiefe. JB liefert zu beiden Runden vertiefende eigene Erklärungen hinzu und gibt Leseempfehlungen ins Netz.

Spracherwerb funktioniert allerdings nicht, wenn man zuerst Vokablen lernen würde, dann Grammatik, dann Srechstrategien. Eine Sprache erwirbt man besser, wenn man sie in konkreten Situationen spricht – und sie auch hört und liest. Ähnlich legen wir unseren Python-Kurs an:

Wer die Quizzes beherrscht verfügt über einen Spektrum von Code-Snippets und Idioms, mit denen sich dann leicht komplexere algorithmische Probleme durch Rekombination lösen lassen.

  • Wir lesen auch Texte: Wir versuchen kleine, in sich geschlossene Problemlösungen in Form von Jupyter Notebooks strukturell zu verstehen: Beispiel-Notebooks

Denn auch das entpricht der Praxis: Fast nie löst man ein Problem kontextfrei, from scratch. Fast immer hat man es mit Code zu tun, den man als Steinbruch verwenden kann oder verändern will. Auch das gehört zu den Kompetenzen von Python 101.

Runde 1#

  • grundlegende Datentypen: Zahlen ohne und mit Komma

  • Strings

  • Listen

  • Dicts

  • grundlegende Rechenarten mit diesen Datentypen

  • grundlegende Ausgabe mit print()

  • grundlegende Kontrollstrukturen: if ... elif ... else; for ... in ...

  • Datei lesen, schreiben

Mit diesen grundlegenden Strukturen kann schon grundlegend “programmiert” werden. Programmieren bedeutet hier, diese grundlegenden Elemente sinnvoll zu kombinieren. Das ist der Knoten, der gelöst werden muss: Wie kann man mit diesen Elementen einfachste Probleme lösen?

Beispiel: Gegeben ist eine Liste von Zahlen. Herzustellen ist eine eine Liste der zugehörigen Wurzeln, sowie die Summe der Zahlen, usw. Im Wesentlichen geht es um Code-Snippet wie dieses:

# so geben wir den Input 'rein:
zahlen = [ 1, 3, 4, 9 ]

# da stehen dann die Ergebnisse 'drinn:
wurzeln = []
summe = 0

# das ist unser Algorithmus:
for z in zahlen:
   wurzel = z ** 0.5
   summe += z
   print("z:", z, "wurzel:", wurzel)
   wurzeln.append(q)

# Ergebnisse ausgeben:
print(wurzeln)
print(f"Summe: {summe}")

Mit diesem Grundgerüst kann man auch in Runde 1 schon einiges machen. Wir können damit en passant, unsystematisch, aber eben kontextualisiert schon einige Funktionen einführen: Länge einer Liste, Länge eines Strings (und damit erstmals die Idee der Überladung erwähnen), automatische Typen-Konversion zwischen int und float, explizites Type-Casting mit int() und float() usw.

Auch wichtig: Spielen mit dem Code, d.h. Code niedrigschwellig verändern, z.B.

  • Wie sieht obige Lösung aus, wenn wir die Wurzel zur Zahl in einem Dict speichern wollen?

  • Wurzel einer negativen Zahlen: None zurückliefern? Eine komplexe Zahl?

Auch einfache Transferaufgaben sind dann schon denkbar: Arbeite obiges Code-Snippet um, um in einer Liste von Wörtern das längste Wort zu finden.

Runde 2#

In Runde zwei beginnen wir wieder von vorne, jetzt allerdings in der vollen Tiefe, die wir für die Veranstaltung anstreben. In Runde 2 steigt auch die Komplexität der Aufgaben. Insbesondere gibt es verschachtelte Schleifen, auch verschachtelte List-Comprehensions.

Weitere Elemente in Runde 2:

  • Exemplarisches Lesen von Notebooks aus anderen Veranstaltungen, wie z.B. Textmining oder Data Science. Denn in der Praxis codiert man fast nie from scratch; statt dessen hat man es immer schon mit existierenden Problemlösungen zu tun, die man dann weiterentwickelt.

  • systematischere Verwendung der Original-Python Dokumentation https://docs.python.org/3/library/index.html, aber auch von Stack Exchange

CAVEAT: Wir verwenden keinen Code, der von large language models (wie z.B. ChatGPT) erzeugt wurde. Denn codiert hat man damit tatsächlich in 3 Minuten – nur die Fehlersuche dauert 3 Wochen ;-) .

Notebook “Rekursion”#

Überlegungen zu http://jbusse.de/jvdp-jb/e_r1c.html, Titel: Tiefe Verschachtelung? Rekursive Funktion!

Inhaltlich:

  • Eine grundlegende, einfache Einführung in die Idee der Rekursion. Aufgehängt nicht an einem artifiziellen Beispiel aus der Mathematik (“Fakultät”), sondern an einer ganz typischen Datenstruktur in Python, nämlich verschachtelte Listen.

  • Gleichzeitig ein Beispiel dafür, dass nicht die Parameter einer Funktion, sondern die Objekte, auf die ein Parameter zeigt, einen Typ haben – den wir hier ganz explizit abfragen. (Wir diskutieren das später unter dem Stichwort Überladung eines Operators.)

Vorgehen:

  • Die Funktion Wert() wird ganz am Anfang informell spezifiziert – und schon hier wird informell und sprachlich die Rekursion benutzt: Der Wert einer Liste ist die Summe der Werte der einzelnen Listenelemente.

  • Wir berechnen den Wert verschiedener zunehmend komplexerer (Listen aus) Listen von Zahlen. Dazu kopieren (!) wir Code und erzeugen ganz hässliche Schleifen von Schleifen. Auf diese Weise visualisieren wir so etwas wie eine „aufgeklappte“ Rekursion.

  • Jetzt definieren wir die Funktion Wert(), indem wir die vorangehenden Code-Snippets nacheinander einbauen.

  • In der Zeile BESSER MACHEN merken wir, dass wir eigentlich die Funktion Wert() benötigen – und, Überraschung!, auch schon benutzen können.

Aufwandsabschätzung Erstellung des Notebooks: 2 * 2 Stunden. Es waren verschiedene Überarbeitungen erforderlich, da die Idee mit den mehrfach eingerückten Code-Kopien erst nach der ersten (und durch diese auch erst angeregt) Notebook-Version entstand.

Anspruch an das Notebook: Studierende sollen im Anschluss an eine Erklärung und Demo im Hörsaal auch im Nachgang zuhause oder zur Klausurvorbereitung das Vorgehen selbst nochmal nachvollziehen können.

Mehrwert durch das Ökosystem Jupyter:

  • Duch die Notebook-Idee können wir eine Problemlösung interaktiv in vielen kleinen Mensch-Computer-Interaktionen entwickeln.

  • Wir können sichtbar machen, wie sich die Funktion Wert() über die Zeit entwickelt. Faktisch liegen verschiedene Versionen der selben Funktion im selben Dokument gleichzeitig vor.

  • Kein Medienbruch zwischen Website, Lehrmaterial und Code: Das vorliegende Notebook ist das Programm, das man herunterladen und ausführen kann.

Typisches Merkmal der hier ausgeloteten Sprachlerndidkatik: Wir geben Texte vor,

  • die schon funktionieren (die der Rechner schon vesteht)

  • bei der die Lernenden zunächst einmal Leseverstehen üben

  • und durch Code-Veränderung auch „Sprechen“ selbst experimentell ausloten können.

Es ist die für das Ökosystem Jupyter typische enge Integration von Code und Erklärtext, die es den Studierenden erlaubt, auf dem eigenen Rechner die Entwicklung des Codes durch viele kleine Interaktionen zwischen Mensch und Maschine zu explorieren: spielerisch, hochfrequent, niedrigschwellig.

Kompetenzorientierung: z.B. Textdatei analysieren#

Eine konventionelle Modulbeschreibung könnte ein Lernziel enthalten der Art:

  • Bsp.: Textdatei einlesen

Bei einer Kompetenzorientierung Stufe 1 würde dieses Lernziels lauten:

  • Bsp.: kann eine Textdatei einlesen

Eine Kompenzorientierung in eigentlichem Sinne (wie sie z.B. im EQR oder im Bolognaprozess vorgesehen ist) lässt sich durch die Leitfrage Was kann man, wenn man dies und jenes kann? beantworten:

  • Bsp.: Was kann man, wenn man eine Textdatei einlesen kann?

Tatsächlich würden wir Textdatei analysieren als solch eine eigentliche Kompetenz bezeichnen. Die folgenden Lehrmaterialien tragen dazu bei, diese “eigentliche” Kompetenz zu erwerben: