Didaktik

Contents

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. Denn Spracherwerb funktioniert nicht so, dass man zuerst Vokablen und Grammatik lernen würde, und es dem Lernenden selbst überlässt, daraus sinnvolle Sätze und Srechstrategien zu entwickeln. Eine Sprache erwirbt man, indem man sie in konkreten Situationen spricht, und sie auch hört und liest. Entsprechend 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.

In Anlehnung an die Idee von Sprach-Niveaus (A1, A2, B1 …) bewegen wir uns in Spiralen durch die Kursinhalte hindurch.

  • Runde 1 (A1.1): Einfachste grundlegende prozedurale Kontrollstrukturen und Datentypen, in sich isoliert und eindeutig erkennbar; Erstkontakt mit List Comprehensions;

  • Runde 2 (A1.2): Dieselben grundlegenden Strukturen, jetzt jedoch in Kombination; auch verschachtelte Schleifen und Datenstrukturen; Python spezifische Konzepte

  • Runde 3: zusätzliche Inhalte wie z.B. try, regex etc.

In jeder Runde lesen wir dasselbe Lehrbuch (hier: Whirlwind), allerdings in unterschiedlicher Tiefe. JB liefert zu beiden Runden vertiefende eigene Erklärungen hinzu und gibt Leseempfehlungen ins Netz.

Runde 1#

  • grundlegende Datentypen: Zahlen ohne und mit Komma

  • Strings, Listen, Dicts

    • grundlegende Rechenarten mit diesen Datentypen

    • grundlegende algorithmische Patterns

  • 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 ;-) .