452 lines
11 KiB
Plaintext
452 lines
11 KiB
Plaintext
{
|
|
"cells": [
|
|
{
|
|
"metadata": {
|
|
"collapsed": true
|
|
},
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"# Funktionale Programmierung in Python\n",
|
|
"\n",
|
|
"## Ziel dieser Einheit\n",
|
|
"\n",
|
|
"In dieser Einheit lernst du:\n",
|
|
"\n",
|
|
"- was funktionale Programmierung bedeutet\n",
|
|
"- wie Lambda-Ausdrücke in Python funktionieren\n",
|
|
"- wie filter() verwendet wird\n",
|
|
"- wie map() verwendet wird\n",
|
|
"- wie mehrere funktionale Operationen kombiniert werden\n",
|
|
"- wie List Comprehensions als pythonische Alternative funktionieren"
|
|
],
|
|
"id": "aba2c4fa1f75f62d"
|
|
},
|
|
{
|
|
"metadata": {},
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"## 1. Grundidee der funktionalen Programmierung\n",
|
|
"\n",
|
|
"Funktionale Programmierung bedeutet:\n",
|
|
"\n",
|
|
"- Wir verändern Daten nicht direkt\n",
|
|
"- Wir benutzen Funktionen, um neue Daten zu erzeugen\n",
|
|
"- Häufig genutzte Funktionen sind:\n",
|
|
" - filter() → filtern\n",
|
|
" - map() → umwandeln\n",
|
|
" - sum() → berechnen\n",
|
|
"\n",
|
|
"In diesem Beispiel arbeiten wir mit einer Liste von Zahlen."
|
|
],
|
|
"id": "5fe9a211e4e1f290"
|
|
},
|
|
{
|
|
"metadata": {},
|
|
"cell_type": "code",
|
|
"source": "zahlen = [1, 2, 3, 4, 5, 6]",
|
|
"id": "eb8147e500b5876e",
|
|
"outputs": [],
|
|
"execution_count": null
|
|
},
|
|
{
|
|
"metadata": {},
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"\n",
|
|
"Die ursprüngliche Liste bleibt dabei unverändert.\n",
|
|
"Stattdessen erzeugen wir neue Listen mit den gewünschten Ergebnissen."
|
|
],
|
|
"id": "ce47b4e7ceac7b2b"
|
|
},
|
|
{
|
|
"metadata": {},
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"## 2. Lambda-Ausdrücke\n",
|
|
"\n",
|
|
"Ein Lambda-Ausdruck ist eine kurze, anonyme Funktion.\n",
|
|
"\n",
|
|
"Anonym bedeutet:\n",
|
|
"\n",
|
|
"- die Funktion hat keinen eigenen Namen\n",
|
|
"- sie wird direkt dort definiert, wo sie gebraucht wird\n",
|
|
"\n",
|
|
"Beispiel:"
|
|
],
|
|
"id": "308f2ba46c30f8bd"
|
|
},
|
|
{
|
|
"metadata": {},
|
|
"cell_type": "code",
|
|
"source": "lambda x: x % 2 == 0",
|
|
"id": "36ecb9f8790e3ef3",
|
|
"outputs": [],
|
|
"execution_count": null
|
|
},
|
|
{
|
|
"metadata": {},
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"\n",
|
|
"Bedeutung:\n",
|
|
"\n",
|
|
"- x ist die Variable für die Funktion\n",
|
|
"- x % 2 == 0 prüft, ob eine Zahl gerade ist\n",
|
|
"- das Ergebnis ist True oder False\n",
|
|
"\n",
|
|
"Vergleich mit Java:\n",
|
|
"\n",
|
|
" (x) -> x % 2 == 0\n",
|
|
"\n",
|
|
"In Java würde ein ähnlicher Lambda-Ausdruck also mit Pfeil geschrieben werden."
|
|
],
|
|
"id": "ab7b62549d06d131"
|
|
},
|
|
{
|
|
"metadata": {},
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"## 3. Filtern mit filter()\n",
|
|
"\n",
|
|
"Zuerst sollen nur die geraden Zahlen aus der Liste ausgewählt werden."
|
|
],
|
|
"id": "4f313a6ccf2b179e"
|
|
},
|
|
{
|
|
"metadata": {
|
|
"ExecuteTime": {
|
|
"end_time": "2026-07-22T08:15:25.729179Z",
|
|
"start_time": "2026-07-22T08:15:25.652826100Z"
|
|
}
|
|
},
|
|
"cell_type": "code",
|
|
"source": [
|
|
"gerade_zahlen = list(filter(lambda x: x % 2 == 0, zahlen))\n",
|
|
"\n",
|
|
"print(\"Gerade Zahlen:\", gerade_zahlen)"
|
|
],
|
|
"id": "405e64898d7dd020",
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"Gerade Zahlen: [2, 4, 6]\n"
|
|
]
|
|
}
|
|
],
|
|
"execution_count": 10
|
|
},
|
|
{
|
|
"metadata": {},
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"\n",
|
|
"\n",
|
|
"Erklärung:\n",
|
|
"\n",
|
|
"- filter() bekommt eine Funktion und eine Liste\n",
|
|
"- die Funktion prüft jedes Element\n",
|
|
"- nur Elemente, bei denen die Funktion True zurückgibt, bleiben erhalten\n",
|
|
"- list() wandelt das Ergebnis wieder in eine Liste um\n",
|
|
"\n",
|
|
"In diesem Beispiel prüft:\n",
|
|
"\n",
|
|
" lambda x: x % 2 == 0\n",
|
|
"\n",
|
|
"ob eine Zahl gerade ist.\n",
|
|
"\n",
|
|
"Aus der Liste:\n",
|
|
"\n",
|
|
" [1, 2, 3, 4, 5, 6]\n",
|
|
"\n",
|
|
"wird dadurch:\n",
|
|
"\n",
|
|
" [2, 4, 6]"
|
|
],
|
|
"id": "a7786217eb1ebd0f"
|
|
},
|
|
{
|
|
"metadata": {},
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"### Aufgabe zur Übung\n",
|
|
"Eine Liste mit den Zahlen von 1 bis 100 so filtern, dass alle Zahlen ausgegeben werden, die durch 12 oder 17 teilbar sind"
|
|
],
|
|
"id": "10bddadd2af9878"
|
|
},
|
|
{
|
|
"metadata": {},
|
|
"cell_type": "code",
|
|
"source": [
|
|
"zahlen_liste = []\n",
|
|
"for i in range (1, 101):\n",
|
|
" zahlen_liste.append(i)\n",
|
|
"\n",
|
|
"durch_12_oder_17_teilbar = list(filter(lambda x: x % 12 == 0 or x % 17 == 0, zahlen_liste))\n",
|
|
"print(durch_12_oder_17_teilbar)"
|
|
],
|
|
"id": "a06029e472a8f213",
|
|
"outputs": [],
|
|
"execution_count": null
|
|
},
|
|
{
|
|
"metadata": {},
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"## 4. Umwandeln mit map()\n",
|
|
"\n",
|
|
"Als nächstes sollen alle Zahlen quadriert werden."
|
|
],
|
|
"id": "84ceeb61fc5b523a"
|
|
},
|
|
{
|
|
"metadata": {},
|
|
"cell_type": "code",
|
|
"source": [
|
|
"quadriere = lambda x: x * x\n",
|
|
"\n",
|
|
"quadrate = list(\n",
|
|
" map(quadriere, zahlen)\n",
|
|
")\n",
|
|
"\n",
|
|
"print(\"Quadrate:\", quadrate)"
|
|
],
|
|
"id": "5789adc3dd4af6f8",
|
|
"outputs": [],
|
|
"execution_count": null
|
|
},
|
|
{
|
|
"metadata": {},
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"\n",
|
|
"\n",
|
|
"Erklärung:\n",
|
|
"\n",
|
|
"- map() wendet eine Funktion auf jedes Element an\n",
|
|
"- hier wird jede Zahl mit sich selbst multipliziert\n",
|
|
"- dadurch entsteht eine neue Liste mit den Quadraten\n",
|
|
"\n",
|
|
"Die Funktion:\n",
|
|
"\n",
|
|
" lambda x: x * x\n",
|
|
"\n",
|
|
"berechnet für jede Zahl ihr Quadrat.\n",
|
|
"\n",
|
|
"Aus:\n",
|
|
"\n",
|
|
" [1, 2, 3, 4, 5, 6]\n",
|
|
"\n",
|
|
"wird:\n",
|
|
"\n",
|
|
" [1, 4, 9, 16, 25, 36]"
|
|
],
|
|
"id": "7210ac5691299df5"
|
|
},
|
|
{
|
|
"metadata": {},
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"### Aufgabe zur Übung\n",
|
|
"Eine Map erstellen, die jede Zahl in einer Liste mit drei multipliziert:"
|
|
],
|
|
"id": "2885e847dce66b9b"
|
|
},
|
|
{
|
|
"metadata": {},
|
|
"cell_type": "code",
|
|
"source": [
|
|
"multipliziere_mit_drei = lambda x: 3 * x\n",
|
|
"\n",
|
|
"zahlen_mal_drei = list(map(multipliziere_mit_drei, zahlen))\n",
|
|
"print(zahlen_mal_drei)"
|
|
],
|
|
"id": "a327676c343bd9b1",
|
|
"outputs": [],
|
|
"execution_count": null
|
|
},
|
|
{
|
|
"metadata": {},
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"## 5. Kombinieren von filter() und map()\n",
|
|
"\n",
|
|
"Funktionale Operationen können kombiniert werden.\n",
|
|
"\n",
|
|
"In diesem Beispiel sollen zuerst nur die geraden Zahlen gefiltert und danach quadriert werden."
|
|
],
|
|
"id": "ac187b86ff0d3bc5"
|
|
},
|
|
{
|
|
"metadata": {},
|
|
"cell_type": "code",
|
|
"source": [
|
|
"ergebnis = list(\n",
|
|
" map(\n",
|
|
" lambda x: x * x,\n",
|
|
" filter(lambda x: x % 2 == 0, zahlen)\n",
|
|
" )\n",
|
|
")\n",
|
|
"\n",
|
|
"print(\"Quadrate der geraden Zahlen:\", ergebnis)"
|
|
],
|
|
"id": "5c41c5c137fa4b65",
|
|
"outputs": [],
|
|
"execution_count": null
|
|
},
|
|
{
|
|
"metadata": {},
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"\n",
|
|
"\n",
|
|
"Ablauf:\n",
|
|
"\n",
|
|
"1. filter() wählt nur gerade Zahlen aus\n",
|
|
"2. map() quadriert diese Zahlen\n",
|
|
"3. list() erzeugt daraus eine Liste\n",
|
|
"\n",
|
|
"Zwischenschritt:\n",
|
|
"\n",
|
|
" filter(lambda x: x % 2 == 0, zahlen)\n",
|
|
"\n",
|
|
"ergibt:\n",
|
|
"\n",
|
|
" [2, 4, 6]\n",
|
|
"\n",
|
|
"Danach wird mit map() quadriert:\n",
|
|
"\n",
|
|
" [4, 16, 36]\n",
|
|
"\n",
|
|
"## 6. Python-typische Schreibweise: List Comprehension\n",
|
|
"\n",
|
|
"Die gleiche Aufgabe kann in Python auch mit einer List Comprehension geschrieben werden."
|
|
],
|
|
"id": "1c43c327479ca804"
|
|
},
|
|
{
|
|
"metadata": {},
|
|
"cell_type": "code",
|
|
"source": [
|
|
"ergebnis_comp = [x * x for x in zahlen if x % 2 == 0]\n",
|
|
"\n",
|
|
"print(\"Mit List Comprehension:\", ergebnis_comp)"
|
|
],
|
|
"id": "a80de265be2ebfa5",
|
|
"outputs": [],
|
|
"execution_count": null
|
|
},
|
|
{
|
|
"metadata": {},
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"\n",
|
|
"\n",
|
|
"Erklärung:\n",
|
|
"\n",
|
|
"- Das ist die pythonischere Variante\n",
|
|
"- sie ist oft besser lesbar als map() und filter()\n",
|
|
"- sie kombiniert Filtern und Umwandeln in einer Zeile\n",
|
|
"\n",
|
|
"Die Struktur lautet:\n",
|
|
"\n",
|
|
" neuer_wert for element in liste if bedingung\n",
|
|
"\n",
|
|
"In unserem Beispiel:\n",
|
|
"\n",
|
|
" x * x for x in zahlen if x % 2 == 0\n",
|
|
"\n",
|
|
"Bedeutung:\n",
|
|
"\n",
|
|
"- gehe durch alle Zahlen in zahlen\n",
|
|
"- verwende nur Zahlen, die gerade sind\n",
|
|
"- berechne für jede dieser Zahlen x * x\n",
|
|
"\n",
|
|
"Das Ergebnis ist wieder:\n",
|
|
"\n",
|
|
" [4, 16, 36]\n",
|
|
"\n",
|
|
"\n",
|
|
"## 7. Wichtige Konzepte im Überblick\n",
|
|
"\n",
|
|
"### Funktionale Programmierung\n",
|
|
"\n",
|
|
"Funktionale Programmierung beschreibt Berechnungen mit Funktionen.\n",
|
|
"\n",
|
|
"Die ursprünglichen Daten werden dabei möglichst nicht verändert.\n",
|
|
"Stattdessen werden neue Daten erzeugt.\n",
|
|
"\n",
|
|
"\n",
|
|
"### Lambda-Ausdruck\n",
|
|
"\n",
|
|
"Ein Lambda-Ausdruck ist eine kurze Funktion ohne Namen.\n",
|
|
"\n",
|
|
"Er eignet sich besonders für kleine Funktionen, die nur einmal gebraucht werden.\n",
|
|
"\n",
|
|
"\n",
|
|
"### filter()\n",
|
|
"\n",
|
|
"filter() wählt Elemente aus einer Sammlung aus.\n",
|
|
"\n",
|
|
"Die übergebene Funktion muss True oder False zurückgeben.\n",
|
|
"\n",
|
|
"\n",
|
|
"### map()\n",
|
|
"\n",
|
|
"map() wandelt jedes Element einer Sammlung um.\n",
|
|
"\n",
|
|
"Die übergebene Funktion bestimmt, wie jedes Element verändert wird.\n",
|
|
"\n",
|
|
"\n",
|
|
"### List Comprehension\n",
|
|
"\n",
|
|
"List Comprehensions sind eine typische Python-Schreibweise.\n",
|
|
"\n",
|
|
"Sie sind oft lesbarer als verschachtelte map()- und filter()-Aufrufe.\n",
|
|
"\n",
|
|
"\n",
|
|
"## Zusammenfassung\n",
|
|
"\n",
|
|
"- Funktionale Programmierung arbeitet mit Funktionen statt direkter Veränderung von Daten\n",
|
|
"- Lambda-Ausdrücke sind kurze anonyme Funktionen\n",
|
|
"- filter() filtert Elemente anhand einer Bedingung\n",
|
|
"- map() wandelt Elemente um\n",
|
|
"- map() und filter() können kombiniert werden\n",
|
|
"- List Comprehensions sind in Python oft die bevorzugte Schreibweise\n",
|
|
"\n",
|
|
"\n",
|
|
"## Verständnisfragen\n",
|
|
"\n",
|
|
"- Was ist ein Lambda-Ausdruck?\n",
|
|
"- Wofür wird filter() verwendet?\n",
|
|
"- Wofür wird map() verwendet?\n",
|
|
"- Warum wird list() um filter() oder map() geschrieben?\n",
|
|
"- Was ist der Vorteil einer List Comprehension?"
|
|
],
|
|
"id": "239738006efd56b5"
|
|
}
|
|
],
|
|
"metadata": {
|
|
"kernelspec": {
|
|
"display_name": "Python 3",
|
|
"language": "python",
|
|
"name": "python3"
|
|
},
|
|
"language_info": {
|
|
"codemirror_mode": {
|
|
"name": "ipython",
|
|
"version": 2
|
|
},
|
|
"file_extension": ".py",
|
|
"mimetype": "text/x-python",
|
|
"name": "python",
|
|
"nbconvert_exporter": "python",
|
|
"pygments_lexer": "ipython2",
|
|
"version": "2.7.6"
|
|
}
|
|
},
|
|
"nbformat": 4,
|
|
"nbformat_minor": 5
|
|
}
|