Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
| modul:m323:learningunits:lu01:funktional [2025/11/17 13:37] – alte Version wiederhergestellt (2025/11/13 10:29) kmaurizi | modul:m323:learningunits:lu01:funktional [2026/08/18 10:13] (aktuell) – Neuer Abschnitt Funktion vs. Prozedur, Lazy-Evaluation-Hinweis, Uebungen; Tags auf neue Kompetenzmatrix admin | ||
|---|---|---|---|
| Zeile 1: | Zeile 1: | ||
| ====== LU01c - Funktionale Programmierung ====== | ====== LU01c - Funktionale Programmierung ====== | ||
| + | |||
| ===== Definition der Funktionalen Programmierung ===== | ===== Definition der Funktionalen Programmierung ===== | ||
| + | |||
| Funktionale Programmierung ist ein Paradigma, das Funktionen als primäre Bausteine verwendet, Unveränderlichkeit von Daten fördert und einen deklarativen Stil betont. Es zielt darauf ab, Code klarer und vorhersagbarer zu gestalten. | Funktionale Programmierung ist ein Paradigma, das Funktionen als primäre Bausteine verwendet, Unveränderlichkeit von Daten fördert und einen deklarativen Stil betont. Es zielt darauf ab, Code klarer und vorhersagbarer zu gestalten. | ||
| Zeile 10: | Zeile 12: | ||
| **3. Deklarative Natur:** Der Code beschreibt, was zu tun ist, nicht wie. | **3. Deklarative Natur:** Der Code beschreibt, was zu tun ist, nicht wie. | ||
| + | |||
| + | ===== Funktion oder Prozedur? ===== | ||
| + | |||
| + | Bevor wir über funktionale Programmierung sprechen, muss geklärt sein, was hier überhaupt mit „Funktion" | ||
| + | |||
| + | ==== Der Unterschied im Überblick ==== | ||
| + | |||
| + | ^ ^ Funktion ^ Prozedur ^ | ||
| + | ^ Zweck | Berechnet einen Wert und gibt ihn zurück | Führt eine Aktion aus | | ||
| + | ^ Rückgabewert | immer vorhanden | keiner (in Python: '' | ||
| + | ^ Wirkung nach aussen | idealerweise keine | genau darin liegt ihr Zweck: Ausgabe, Datei, Netzwerk, globaler Zustand | | ||
| + | ^ Aufruf steht als | Ausdruck: '' | ||
| + | ^ Ersetzbarkeit | Der Aufruf kann durch sein Ergebnis ersetzt werden (referenzielle Transparenz) | nicht ersetzbar – die Wirkung ginge verloren | | ||
| + | ^ Analogie | Ein Taschenrechner: | ||
| + | |||
| + | ==== Beispiel: derselbe Zweck, zwei Formen ==== | ||
| + | |||
| + | <code python> | ||
| + | # Prozedur: gibt nichts zurück, wirkt nach aussen (Konsolenausgabe) | ||
| + | def zeige_summe(zahlen): | ||
| + | print(sum(zahlen)) | ||
| + | |||
| + | # Funktion: liefert einen Wert, verändert nichts ausserhalb | ||
| + | def berechne_summe(zahlen): | ||
| + | return sum(zahlen) | ||
| + | |||
| + | zahlen = [1, 2, 3, 4, 5] | ||
| + | |||
| + | r1 = zeige_summe(zahlen) | ||
| + | r2 = berechne_summe(zahlen) | ||
| + | |||
| + | print(r1) | ||
| + | print(r2) | ||
| + | </ | ||
| + | |||
| + | <WRAP center round tip 80%> | ||
| + | **Unterrichtstipp** | ||
| + | |||
| + | Lassen Sie die Klasse //vor// dem Ausführen raten, was '' | ||
| + | </ | ||
| + | |||
| + | ==== Warum das für die funktionale Programmierung zentral ist ==== | ||
| + | |||
| + | Nur Funktionen im obigen Sinn lassen sich gefahrlos kombinieren, | ||
| + | |||
| + | <code python> | ||
| + | # Prozedur mit globalem Zustand | ||
| + | total = 0 | ||
| + | |||
| + | def addiere_zum_total(x): | ||
| + | global total | ||
| + | total += x | ||
| + | |||
| + | addiere_zum_total(5) | ||
| + | addiere_zum_total(5) | ||
| + | print(total) | ||
| + | |||
| + | |||
| + | # Funktion ohne globalen Zustand | ||
| + | def addiere(a, b): | ||
| + | return a + b | ||
| + | |||
| + | print(addiere(5, | ||
| + | print(addiere(5, | ||
| + | </ | ||
| + | |||
| + | Der entscheidende Punkt: '' | ||
| + | |||
| + | ==== Verwandte Begriffe zur Abgrenzung ==== | ||
| + | |||
| + | * **Methode**: | ||
| + | * **Mathematische Funktion**: Bildet jede Eingabe eindeutig auf genau eine Ausgabe ab und tut sonst nichts. Genau dieses Ideal greift die funktionale Programmierung mit dem Begriff der **pure function** auf (siehe LU02). | ||
| + | |||
| + | <WRAP center round tip 80%> | ||
| + | **Das Lehrbuch-Beispiel: | ||
| + | |||
| + | Python bietet dieselbe Aufgabe in beiden Formen an – ideal zum Durchspielen: | ||
| + | |||
| + | <code python> | ||
| + | liste = [3, 1, 2] | ||
| + | print(liste.sort()) | ||
| + | print(liste) | ||
| + | |||
| + | liste2 = [3, 1, 2] | ||
| + | print(sorted(liste2)) | ||
| + | print(liste2) | ||
| + | </ | ||
| + | |||
| + | '' | ||
| + | </ | ||
| + | |||
| + | <WRAP center round important 80%> | ||
| + | **Achtung: In Python heisst beides '' | ||
| + | |||
| + | Python kennt syntaktisch nur '' | ||
| + | |||
| + | Andere Sprachen trennen das explizit: Pascal unterscheidet '' | ||
| + | </ | ||
| ===== Einführung in die Deklarative Programmierung ===== | ===== Einführung in die Deklarative Programmierung ===== | ||
| + | |||
| Deklarative Programmierung ist ein übergeordnetes Konzept, das funktional, logisch und einigen anderen Paradigmen gemeinsam ist. Es betont die Beschreibung der gewünschten Ergebnisse, ohne spezifische Anweisungen zu geben, wie diese Ergebnisse erreicht werden sollen. | Deklarative Programmierung ist ein übergeordnetes Konzept, das funktional, logisch und einigen anderen Paradigmen gemeinsam ist. Es betont die Beschreibung der gewünschten Ergebnisse, ohne spezifische Anweisungen zu geben, wie diese Ergebnisse erreicht werden sollen. | ||
| ==== Beispiel ==== | ==== Beispiel ==== | ||
| + | |||
| Quadrieren einer Liste in Python auf funktionale Weise: | Quadrieren einer Liste in Python auf funktionale Weise: | ||
| + | |||
| <code python> | <code python> | ||
| def quadrat(x): | def quadrat(x): | ||
| Zeile 24: | Zeile 127: | ||
| print(list(quadrate)) # Ausgabe: [1, 4, 9, 16, 25] | print(list(quadrate)) # Ausgabe: [1, 4, 9, 16, 25] | ||
| </ | </ | ||
| + | |||
| + | <WRAP center round info 80%> | ||
| + | **Warum das '' | ||
| + | |||
| + | '' | ||
| + | |||
| + | Der Vorteil: Auch über Millionen von Elementen kann man so rechnen, ohne alle gleichzeitig im Speicher zu halten. | ||
| + | </ | ||
| ===== Fokus auf Funktionen, Unveränderlichkeit und Deklarativität ===== | ===== Fokus auf Funktionen, Unveränderlichkeit und Deklarativität ===== | ||
| + | |||
| ==== Funktionen ==== | ==== Funktionen ==== | ||
| + | |||
| Funktionen sind das Herzstück der funktionalen Programmierung: | Funktionen sind das Herzstück der funktionalen Programmierung: | ||
| + | |||
| <code python> | <code python> | ||
| def anwenden(f, wert): | def anwenden(f, wert): | ||
| Zeile 36: | Zeile 150: | ||
| print(ergebnis) # Ausgabe: 25 | print(ergebnis) # Ausgabe: 25 | ||
| </ | </ | ||
| + | |||
| + | Hier passiert etwas Bemerkenswertes: | ||
| + | |||
| ==== Unveränderlichkeit ==== | ==== Unveränderlichkeit ==== | ||
| + | |||
| Die Unveränderlichkeit fördert sauberen, nachvollziehbaren Code: | Die Unveränderlichkeit fördert sauberen, nachvollziehbaren Code: | ||
| + | |||
| <code python> | <code python> | ||
| original_liste = [1, 2, 3] | original_liste = [1, 2, 3] | ||
| neue_liste = original_liste + [4] # Original bleibt unverändert | neue_liste = original_liste + [4] # Original bleibt unverändert | ||
| </ | </ | ||
| + | |||
| ==== Deklarativität ==== | ==== Deklarativität ==== | ||
| + | |||
| Ein deklarativer Ansatz beschreibt, was getan werden soll: | Ein deklarativer Ansatz beschreibt, was getan werden soll: | ||
| + | |||
| <code python> | <code python> | ||
| # Deklarativ | # Deklarativ | ||
| summe = sum(zahlen) | summe = sum(zahlen) | ||
| </ | </ | ||
| + | |||
| ===== Zusammenführung der Deklarativen und Funktionalen Programmierung ===== | ===== Zusammenführung der Deklarativen und Funktionalen Programmierung ===== | ||
| - | Deklarative Programmierung ist ein breiteres Konzept, das die funktionale Programmierung | + | |
| + | Deklarative Programmierung ist ein breiteres Konzept, das die funktionale Programmierung | ||
| + | |||
| + | ===== Mini-Übung ===== | ||
| + | |||
| + | <WRAP center round todo 80%> | ||
| + | **Funktion oder Prozedur?** Ordnen Sie zu und begründen Sie: | ||
| + | |||
| + | - '' | ||
| + | - '' | ||
| + | - '' | ||
| + | - '' | ||
| + | - '' | ||
| + | - '' | ||
| + | |||
| + | **Umbauen: | ||
| + | |||
| + | <code python> | ||
| + | def zeige_durchschnitt(zahlen): | ||
| + | print(sum(zahlen) / len(zahlen)) | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | <WRAP center round info 80%> | ||
| + | **Lösungshinweise** | ||
| + | |||
| + | Funktionen: '' | ||
| + | Prozeduren: '' | ||
| + | |||
| + | Umbau: '' | ||
| + | </ | ||
| <WRAP center round tip 60%> | <WRAP center round tip 60%> | ||
| **Schlussfolgerung** | **Schlussfolgerung** | ||
| - | Die funktionale Programmierung, | + | Die funktionale Programmierung, |
| </ | </ | ||
| ---- | ---- | ||
| - | {{tag> | + | {{tag> |
| - | [[https:// | + | [[https:// |