Compare commits

...

4 Commits

Author SHA1 Message Date
Christopher Arndt fb0fed2247 Add notebook for container datatypes
Signed-off-by: Christopher Arndt <chris@chrisarndt.de>
2024-05-06 00:46:18 +02:00
Christopher Arndt d59ec6069b Add uebungen for day 1
Signed-off-by: Christopher Arndt <chris@chrisarndt.de>
2024-05-06 00:46:18 +02:00
Christopher Arndt 2fec50720d Add notebooks for day 1 part 1
Signed-off-by: Christopher Arndt <chris@chrisarndt.de>
2024-05-06 00:46:18 +02:00
Christopher Arndt bbfee09be4 Add content overview and time planning in markdown and pdf format
Signed-off-by: Christopher Arndt <chris@chrisarndt.de>
2024-05-06 00:46:18 +02:00
15 changed files with 1695 additions and 0 deletions

154
Kursgliederung.md Normal file
View File

@ -0,0 +1,154 @@
# Programmieren mit Python: Kursgliederung
## Tag 1 (Montag) Vormittag (9:00 - 12:30 Uhr)
### Vorstellung & Organisatorisches (15-20 min)
* Vorstellung SoftEd, Trainer, Seminarbegleitung
* Ausblick auf die Seminarinhalte
* Vorstellungsrunde Teilnehmer, Präsens und Online
* Ablauf, Pausen, Mittagessen etc.
### Einführung in die Programmiersprache Python (45-60 min)
* Einführung in die Arbeitsumgebung für den Kurs
* Verwendung des Interpreters (Interactive Modus)
* Aufruf
* Interaktives Testen von Code
* Python als Taschenrechner
* Erweiterte interaktive Umgebungen (IPython, Jupyter)
* Genereller Aufbau eines Programms
* Hallo, Welt!
* Ein kurzes, aber komplettes Kommandozeilenprogramm
* Syntaxelemente von Python (Ausdrücke, Anweisungen, Operatoren, Trennzeichen, Einrückung usw.)
* Grundlegende Datentypen und Operationen
* Integer und mathematische Operatoren
* Fließkommazahlen (Floats)
* Strings
* Kontrollstrukturen und Vergleichsoperatoren
* Branching (Verzweigung): `if` / `elif` / `else` und `match`
* Loops (Schleifen): `for` und `while`
* Funktionen: `def` und `return`
### Warum Python? (15 min)
#### Was macht Python besonders und unterscheidet es von anderen Programmiersprachen?
#### Anwendungsbereiche von Python
* als "Skriptsprache"
* für Desktop- und Webanwendungen
* für Scientific Computing und Data Science
* für Machine Learning
* als Bindeglied zwischen Komponenten und Bibliotheken in anderen Sprachen
* Für Embedded Programming (MicroPython)
## Kaffee/Teepause (20 min)
### Erweiterte Grundlagen in Python
#### Erweiterte Datentypen: Container (45 min)
* Listen
* Tupel
* Dictionary
* Sets
**Übungsaufgaben**
#### String-Operation und String-Formatierung und Ausgabe (45 min)
* Escape-Sequenzen, Single-, Double- und Triple-Quotes und Klammerung
* Stringvergleiche und Testen auf Substrings
* Strings zusammenfügen, auftrennen und slicen
* Uppercase, Lowercase, Capitalization, Stripping, usw.
* String-Formatierung und Formatstrings
**Übungsaufgaben**
## Mittagspause (12:30 - 13:30 Uhr)
## Tag 1 (Montag) Nachmittag (13:30 Uhr - 17:00 Uhr)
### Zugriff auf Dateisystem (Teil 1) (20 min)
* Öffnen und Lesen von Dateien
* Ganzen Dateiinhalt einlesen
* Textdateien zeilenweise einlesen
* Textzeilen in Datenfelder zerlegen
### Fehlerbehandlung in Python (45-60 min)
* Was sind Exceptions?
* Abfangen von Fehlern
* Eigene Fehler erzeugen
* Eigene Exceptions definieren und benutzen
**Übungsaufgaben**
### Objektorientierung in Python (45-60 min)
* Allgemeiner Einblick in die Objektstruktur in Python
* Definieren von Klassen
* Erzeugen von Objekten
* Vererbung
* Spezialmethoden von Objekten ("Dunder methods")
### Kaffee-/Teepause (20 min)
**Übungsaufgaben**
### Tipps und Tricks im täglichen Umgang mit Python (10-20 min)
### Zusammenfassung, Fragen, Lösungen usw.
## Tag 2 (Dienstag) Vormittag (9:00 - 12:30 Uhr)
### Rekapitulierung der Inhalte vom Vortag und Fragen (20-30 min)
### Module in Python (45-60 min)
* Importieren, verwenden von Modulen
* Allgemeiner Umgang mit dem Packet Manager PIP
* Eigene Module definieren
* Module und Pakete (`Packages')
* Der Standardmodulsuchpfad (`sys.path`)
* Relative Importe
## Kaffee-/Teepause (20 min)
### Zugriff auf das Dateisystem (Teil 2)
* Öffnen, Lesen und Schreiben von Dateien
* Text- und Binärdaten
* Text-Encodings
* Lesen und Schreiben von Daten im JSON Format
* Fehlerbehandlung und Context Manager (`with`-Statement)
* Dateiordner auflisten und durchsuchen
**Übungsaufgaben**
### Datenbankzugriff mit Sqlite3
**Übungsaufgaben**
## Mittagspause (12:30 - 13:30 Uhr)
## Tag 2 (Dienstag) Nachmittag (13:30 Uhr - 17:00 Uhr)
### Entwicklung eines HTML-Crawlers (60-90 min)
## Kaffee-/Teepause (20 min)
### Zusammenfassung, Fragen, Lösungen usw. (30 min)
### Best Practices (30 min)
* Code Style
* Verwendung von Dekoratoren (falls Zeit)

BIN
Kursgliederung.pdf Normal file

Binary file not shown.

53
Seminarinhalt.md Normal file
View File

@ -0,0 +1,53 @@
# Programmieren mit Python: Seminarinhalt
## Einführung in die Programmiersprache Python
* Verwendung des Interpreters (Interactive Modus)
* Genereller Aufbau eines Programms
* Grundlegende Datentypen und Operationen
* Kontrollstrukturen
## Erweiterte Grundlagen in Python
* Erweiterte Datentypen: Listen, Tupel, Dictionary, Set
* String Formatierung
## Funktionen in Python
* Definition und Aufruf von Funktionen
* Generatoren
* Rekursion
## Objektorientierung in Python
* Allgemeiner Einblick in die Objektstruktur in Python
* Definieren von Klassen
* Erzeugen von Objekten
* Vererbung
## Fehlerbehandlung in Python
* Abfangen von Fehlern
* Eigene Fehler erzeugen
## Module in Python
* Importieren, Verwenden von Modulen
* Allgemeiner Umgang mit dem Packet Manager PIP
## Zugriff auf das Dateisystem
* Lesen und Schreiben von Daten im JSON Format
## Datenbankzugriff mit Sqlite3
## Entwicklung eines HTML-Crawlers
## Best Practices
* Code Style
* Verwendung von Dekoratoren

BIN
Seminarinhalt.pdf Normal file

Binary file not shown.

8
makepdf.sh Executable file
View File

@ -0,0 +1,8 @@
#!/bin/bash
for md in *.md; do
if [[ "$md" = "README.md" ]]; then
continue
fi
pandoc --from=gfm --to=pdf -o "${md%.*}.pdf" "$md"
done

420
notebooks/basictypes.ipynb Normal file
View File

@ -0,0 +1,420 @@
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Grundlegende Datentypen und Operationen"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Numerische Typen"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"42\n",
"23\n",
"65\n"
]
}
],
"source": [
"# Ganzzahlen (Integers)\n",
"\n",
"a = 42\n",
"b = 23\n",
"print(a)\n",
"print(b)\n",
"print(a + b)"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"3.14159\n",
"2.71828\n",
"8.539721265199999\n"
]
}
],
"source": [
"# Fließkommazahlen (Floats)\n",
"\n",
"pi = 3.14159\n",
"e = 2.71828\n",
"print(pi)\n",
"print(type(pi))\n",
"print(e)\n",
"print(pi * e)"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"3 1.5 4.5\n",
"<class 'float'>\n",
"0.16666666666666666\n"
]
}
],
"source": [
"# Implizite Umwandlung von numerischen Typen\n",
"\n",
"i = 3\n",
"f = 1.5\n",
"summe = a + f\n",
"print(i, f, summe)\n",
"print(type(e))\n",
"z = 1\n",
"n = 6\n",
"print(z / n)"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"2\n",
"999\n",
"144\n",
"8.0\n",
"3.8\n",
"1.0\n",
"23.799999999999997\n",
"0.3333333333333333\n"
]
}
],
"source": [
"# Grundrechenarten\n",
"\n",
"# Integer\n",
"print(1 + 1)\n",
"print(1_000 - 1)\n",
"print(12 * 12) # Vorsicht: Asterisk (\"Sternchen\"), nicht x)\n",
"print(64 / 8)\n",
"\n",
"# Floats\n",
"print(0.5 + 3.3)\n",
"print(1.99 - 0.99)\n",
"print(20.0 * 1.19)\n",
"print(1.0 / 3.0)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"64\n",
"512\n",
"512\n",
"11585.237502960395\n"
]
}
],
"source": [
"# X hoch Y\n",
"\n",
"x = 8\n",
"x2 = x ** 2\n",
"print(x2)\n",
"print(x ** 3)\n",
"print(pow(x, 3))\n",
"\n",
"print(x ** e)\n",
"print(pow(x, e)) # pow akzeptiert integer und floats"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"1\n",
"<class 'int'>\n"
]
}
],
"source": [
"# Modulo\n",
"\n",
"x = 10\n",
"y = 3\n",
"rest = x % 3\n",
"print(rest)\n",
"print(type(rest))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Strings"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Dies ist ein String!\n",
"Man kann einfache oder doppelte Anführungszeichen verwenden.\n",
"Innerhalb der Anführungszeichen kann man den jeweils \"anderen Typ\" verwenden\n",
"Oder 'andersherum'.\n",
"Alternativ kann man eine Backslash als \"Escape\"-Zeichen verwenden\n",
"String-Literale, die direkt hintereinander, durch Leerzeichen getrennt, stehenwerden zusammengefügt.\n",
"Mit Klammerung klapt das auch über mehrere Zeilen hinweg\n"
]
}
],
"source": [
"s = \"Dies ist ein String!\"\n",
"print(s)\n",
"s2 = 'Man kann einfache oder doppelte Anführungszeichen verwenden.'\n",
"print(s2)\n",
"s3a = 'Innerhalb der Anführungszeichen kann man den jeweils \"anderen Typ\" verwenden'\n",
"print(s3a)\n",
"s3b = \"Oder 'andersherum'.\"\n",
"print(s3b)\n",
"s4 = \"Alternativ kann man eine Backslash als \\\"Escape\\\"-Zeichen verwenden\"\n",
"print(s4)\n",
"s5 = \"String-Literale\" \", die direkt hintereinander\" \", durch Leerzeichen getrennt, stehen\" \"werden zusammengefügt.\"\n",
"print(s5)\n",
"s6 = (\"Mit Klammerung klappt das auch \"\n",
" \"über mehrere Zeilen \"\n",
" \"hinweg\")\n",
"print(s6)"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Dies ist ein langer String (\"triple quoted string\").\n",
"Er kann Zeilenumbrüche enthalten.\n",
"\n",
"Und Leerzeilen.\n",
"\n",
"Und auch 'einfache' oder \"doppelte\" Anführungszeichen.\n",
"\n",
"Er endet mit drei weiteren Anführungszeichen des gleichen Typs.\n",
"\n",
"'Dies ist ein langer String (\"triple quoted string\").\\nEr kann Zeilenumbrüche enthalten.\\n\\nUnd Leerzeilen.\\n\\nUnd auch \\'einfache\\' oder \"doppelte\" Anführungszeichen.\\n\\nEr endet mit drei weiteren Anführungszeichen des gleichen Typs.\\n'\n"
]
}
],
"source": [
"# Längere Strings\n",
"\n",
"long_string = \"\"\"Dies ist ein langer String (\"triple quoted string\").\n",
"Er kann Zeilenumbrüche enthalten.\n",
"\n",
"Und Leerzeilen.\n",
"\n",
"Und auch 'einfache' oder \"doppelte\" Anführungszeichen.\n",
"\n",
"Er endet mit drei weiteren Anführungszeichen des gleichen Typs.\n",
"\"\"\"\n",
"print(long_string)\n",
"print(repr(long_string))"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Erste Zeile\n",
"Zweite Zeile\n",
"Eine Zeile\n",
"Noch eine Zeile\n",
"Eins\tZwei\tDrei\n",
"1\t2\t3\n",
"'Dieser String enthält ein\\x00Null-Zeichen'\n",
"Hexadezimal-Codes können wir druckbare (e.g. '@') und nicht druckbare Zeichen (e.g. ) verwendet werden.\n",
"❤\n"
]
}
],
"source": [
"# Escape Sequenzen\n",
"\n",
"# Zeilenumbrüche und Tabs\n",
"print(\"Erste Zeile\\r\\nZweite Zeile\") # Zeilenumbruch nach Windows-Art \n",
"print(\"Eine Zeile\\nNoch eine Zeile\") # Rest der Welt ;-)\n",
"print(\"Eins\\tZwei\\tDrei\")\n",
"print(\"1\\t2\\t3\")\n",
"\n",
"# Null und Hexadezimal- und Unicode-Sequenzen\n",
"print(repr(\"Dieser String enthält ein\\0Null-Zeichen\"))\n",
"print(\"Hexadezimal-Codes können wir druckbare (e.g. '\\x40') und nicht druckbare Zeichen (e.g. \\x7F) verwendet werden.\")\n",
"print('\\u2764') # Unicode"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Dies ist der erste String.Und dies der zweite.\n",
"Ich habe es dir schon dreimal gesagt!Ich habe es dir schon dreimal gesagt!Ich habe es dir schon dreimal gesagt!\n"
]
}
],
"source": [
"# String-Operationen\n",
"\n",
"s1 = \"Dies ist der erste String.\"\n",
"s2 = \"Und dies der zweite.\"\n",
"s3 = s1 + s2\n",
"print(s3)\n",
"s4 = \"Ich habe es dir schon dreimal gesagt! \"\n",
"print(s4 * 3)"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"SCHREI NICHT SO LAUT!\n",
"True\n",
"True\n",
"True\n"
]
}
],
"source": [
"klein = \"schrei nicht so laut!\"\n",
"print(klein.upper())\n",
"print(\"hallo\" == \"HALLO\".lower())\n",
"print(\"hallo\" == \"Hallo\".lower())\n",
"print(\"straße\".upper() == \"STRASSE\")\n"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Hallo\n",
"a\n",
"Hello\n"
]
}
],
"source": [
"hallo = \"Hallo\"\n",
"print(hallo)\n",
"print(hallo[1])\n",
"print(hallo[0] + 'e' + hallo[2:])"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {},
"outputs": [
{
"ename": "TypeError",
"evalue": "'str' object does not support item assignment",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)",
"\u001b[1;32m/home/chris/work/python-kurs-softed/notebooks/basictypes.ipynb Cell 16\u001b[0m line \u001b[0;36m3\n\u001b[1;32m <a href='vscode-notebook-cell:/home/chris/work/python-kurs-softed/notebooks/basictypes.ipynb#X23sZmlsZQ%3D%3D?line=0'>1</a>\u001b[0m \u001b[39m# Aber das geht nicht:\u001b[39;00m\n\u001b[0;32m----> <a href='vscode-notebook-cell:/home/chris/work/python-kurs-softed/notebooks/basictypes.ipynb#X23sZmlsZQ%3D%3D?line=2'>3</a>\u001b[0m hallo[\u001b[39m1\u001b[39;49m] \u001b[39m=\u001b[39m \u001b[39m'\u001b[39m\u001b[39me\u001b[39m\u001b[39m'\u001b[39m\n",
"\u001b[0;31mTypeError\u001b[0m: 'str' object does not support item assignment"
]
}
],
"source": [
"# Aber das geht nicht!:\n",
"\n",
"hallo[1] = 'e'"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "softed",
"language": "python",
"name": "softed"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.11.8"
}
},
"nbformat": 4,
"nbformat_minor": 2
}

View File

@ -0,0 +1,121 @@
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Erweiterte Datentypen: Container"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Listen und Tupel"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[5, 10, 20, 30, 50]\n",
"[0.5, 0.6, 0.8, 1.0, 1.2]\n",
"['Joe', 'Alice', 'Bob', 'Charly']\n",
"[1, 'Joe', 1.4, 'Alice', 100]\n",
"['one'] [] []\n"
]
}
],
"source": [
"# Listenliterale\n",
"\n",
"values = [5, 10, 20, 30, 50]\n",
"print(values)\n",
"fractions = [0.5, 0.6, 0.8, 1.0, 1.2]\n",
"print(fractions)\n",
"names = [\"Joe\", \"Alice\", \"Bob\", \"Charly\"]\n",
"print(names)\n",
"heap = [1, \"Joe\", 1.4, \"Alice\", 100]\n",
"print(heap)\n",
"single = [\"one\"]\n",
"leer = []\n",
"auch_leer = list()\n",
"print(single, leer, auch_leer)"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(5, 10, 20, 30, 50)\n",
"(0.5, 0.6, 0.8, 1.0, 1.2)\n",
"('Joe', 'Alice', 'Bob', 'Charly')\n",
"(1, 'Joe', 1.4, 'Alice', 100)\n",
"('one',) ('one',) ()\n"
]
}
],
"source": [
"# Tuplelliterale\n",
"values = (5, 10, 20, 30, 50)\n",
"print(values)\n",
"fractions = (0.5, 0.6, 0.8, 1.0, 1.2)\n",
"print(fractions)\n",
"names = (\"Joe\", \"Alice\", \"Bob\", \"Charly\")\n",
"print(names)\n",
"heap = (1, \"Joe\", 1.4, \"Alice\", 100)\n",
"print(heap)\n",
"t_single = (\"one\",)\n",
"t_auch_single = \"one\",\n",
"t_leer = ()\n",
"print(t_single, t_auch_single, t_leer)\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Umwandlung\n",
"\n",
"l = [1, 2, 3, 4, 5]\n",
"t= tuple(t)\n",
"print(l, t)\n",
"l = [10, 20, 30, 40, 50]\n",
"print(l, t)\n"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "softed",
"language": "python",
"name": "softed"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.11.8"
}
},
"nbformat": 4,
"nbformat_minor": 2
}

585
notebooks/controlflow.ipynb Normal file
View File

@ -0,0 +1,585 @@
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Kontrollstrukturen und Vergleichsoperatoren"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Verzweigung (Branching)"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Hmm, ob das so stimmt?\n"
]
}
],
"source": [
"# if / else / elif\n",
"\n",
"alter = -1\n",
"\n",
"if alter >= 16:\n",
" print(\"Nicht vergessen: am 9.6.2024 ist Europa-Wahl!\")\n",
"elif alter > 0:\n",
" print(\"Schön, dass du geboren bist!\")\n",
"else:\n",
" print(\"Hmm, ob das so stimmt?\")"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Nach Süden, nach Süden!\n"
]
}
],
"source": [
"richtung = \"s\"\n",
"\n",
"if richtung == \"n\":\n",
" print(\"Auf in den hohen Norden!\")\n",
"elif richtung == \"s\":\n",
" print(\"Nach Süden, nach Süden!\")\n",
"elif richtung == \"w\":\n",
" print(\"Go west!\")\n",
"elif richtung == \"o\":\n",
" print(\"Bin schon da.\")\n"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Auf in den hohen Norden!\n"
]
}
],
"source": [
"# match\n",
"\n",
"# richtung = input(\"Wo soll's denn lang gehen? \")\n",
"richtung = \"n\"\n",
"\n",
"match richtung:\n",
" case \"n\" | \"norden\":\n",
" print(\"Auf in den hohen Norden!\")\n",
" case \"s\" | \"süden\":\n",
" print(\"Nach Süden, nach Süden!\")\n",
" case \"w\" | \"westen\":\n",
" print(\"Go west!\")\n",
" case \"o\" | \"osten\":\n",
" print(\"Bin schon da.\")\n",
" case _:\n",
" print(\"Das Glück liegt manchmal abseits des direkten Wegs!\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Schleifen"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Schleifendurchlauf Nr. 0\n",
"Schleifendurchlauf Nr. 1\n",
"Schleifendurchlauf Nr. 2\n",
"Schleifendurchlauf Nr. 3\n",
"Schleifendurchlauf Nr. 4\n"
]
}
],
"source": [
"# for\n",
"\n",
"for i in range(5):\n",
" print(\"Schleifendurchlauf Nr. \", i)\n"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Summer der Zahlen 1-10: 55\n"
]
}
],
"source": [
"result = 0\n",
"for i in range(1, 11):\n",
" result += i\n",
"print(\"Summe der Zahlen 1-10:\", result)"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"9 passt in die Reihe\n"
]
}
],
"source": [
"for i in (2, 4, 6, 8, 9, 10):\n",
" if i % 2:\n",
" print(i, \"passt nicht in die Reihe\")"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"10 ... 9 ... 8 ... 7 ... 6 ... 5 ... 4 ... 3 ... 2 ... 1 ... Lift off!\n"
]
}
],
"source": [
"# while\n",
"\n",
"i = 10\n",
"while i > 0: # or: while True:\n",
" print(i, \"... \", end=\"\")\n",
" i -= 1\n",
"print(\"Lift off!\")"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"10\n",
"11\n",
"12\n",
"14\n",
"15\n",
"16\n",
"17\n",
"18\n",
"19\n"
]
}
],
"source": [
"# continue\n",
"\n",
"for i in range(10, 20):\n",
" if i == 13:\n",
" continue\n",
" print(i)"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Iteration: 142\n"
]
}
],
"source": [
"# break\n",
"\n",
"i = 0\n",
"result = 0\n",
"maximum = 10_000\n",
"\n",
"while True:\n",
" result += i\n",
"\n",
" if result >= maximum:\n",
" print(\"Iteration: \", i+1)\n",
" break\n",
"\n",
" i += 1\n"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"q ist Buchstabe Nr. 17 des dt. Alphabets.\n"
]
}
],
"source": [
"alphabet = \"abcdefghifklmnopqrstuvwxyz\"\n",
"buchstabe = \"q\"\n",
"i = 0\n",
"for char in alphabet:\n",
" i += 1\n",
" if char == buchstabe:\n",
" print(buchstabe, \"ist Buchstabe Nr.\", i, \"des dt. Alphabets.\")\n",
" break\n"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"q ist Buchstabe Nr. 17 des dt. Alphabets.\n"
]
}
],
"source": [
"# einfacher:\n",
"\n",
"for i, char in enumerate(alphabet):\n",
" if char == buchstabe:\n",
" print(buchstabe, \"ist Buchstabe Nr.\", i + 1, \"des dt. Alphabets.\")\n",
" break"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Funktionen"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"256 256 100\n"
]
}
],
"source": [
"# Aufruf eingebauter Funktionen\n",
"\n",
"x = pow(2, 8)\n",
"y = max(x, 100)\n",
"z = min(max(0, x), 100)\n",
"print(x, y, z)"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"\n"
]
}
],
"source": [
"# optionale Parameter\n",
"\n",
"print()\n",
"print(\"\")"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"5\n"
]
}
],
"source": [
"# eigene Funktionen\n",
"\n",
"def add(a, b):\n",
" return a + b\n",
"\n",
"print(add(2, 3))"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"15\n",
"24\n"
]
}
],
"source": [
"# Keyword arguments\n",
"\n",
"print(add(a=5, b=10))\n",
"print(add(4, b=20))"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [
{
"ename": "SyntaxError",
"evalue": "positional argument follows keyword argument (1525390589.py, line 2)",
"output_type": "error",
"traceback": [
"\u001b[0;36m Cell \u001b[0;32mIn[21], line 2\u001b[0;36m\u001b[0m\n\u001b[0;31m print(add(a=6, 10))\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m positional argument follows keyword argument\n"
]
}
],
"source": [
"# Das geht nicht:\n",
"print(add(a=6, 10))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Vergleichsausdrücke"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"False\n",
"True\n",
"False\n",
"True\n",
"True\n",
"False\n",
"True\n",
"True\n"
]
}
],
"source": [
"a = 10\n",
"b = 50\n",
"c = 2\n",
"d = 5 * a\n",
"\n",
"print(a == b)\n",
"print(a != d)\n",
"print(a > b)\n",
"print(a > c)\n",
"print(a >= c)\n",
"print(c > a)\n",
"print(c < b)\n",
"print(c >= 2)"
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"True\n",
"True\n",
"True\n",
"False\n"
]
}
],
"source": [
"# Negation\n",
"\n",
"print(not c > a)\n",
"print(not a == b) # klarer: a != b\n",
"print(not b != d) # klarer: b == d\n",
"print(not a > c)"
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"True\n",
"True\n",
"True\n"
]
}
],
"source": [
"# logische Kombination\n",
"\n",
"print(b > a and a > c)\n",
"print(a > b or a > c)\n",
"print(not a < c and b >= d)"
]
},
{
"cell_type": "code",
"execution_count": 41,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"True\n",
"True\n",
"True\n",
"False\n"
]
}
],
"source": [
"# Bool'scher (True/False) Wert von Integers, Floats und Strings \n",
"print(a > c)\n",
"print(bool(a > c)) ## redundant, da Vergleichsausdrücke immer einen bool'schen Wert haben\n",
"# Aber:\n",
"print(bool(a))\n",
"print(not a) # auch ein bool'scher Ausdruck\n"
]
},
{
"cell_type": "code",
"execution_count": 45,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"False\n",
"True\n",
"True\n",
"False\n",
"True\n",
"True\n",
"True\n",
"True\n",
"False\n",
"True\n"
]
}
],
"source": [
"print(bool(0))\n",
"print(bool(1))\n",
"print(bool(-1))\n",
"print(bool(0.0))\n",
"print(bool(0.1))\n",
"print(bool(-0.1))\n",
"print(bool(\"True\"))\n",
"print(bool(\"False\")) # !!!\n",
"print(bool(\"\"))\n",
"print(bool(\"\\0\"))\n"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "softed",
"language": "python",
"name": "softed"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.11.8"
}
},
"nbformat": 4,
"nbformat_minor": 2
}

147
uebungen/dateien.md Normal file
View File

@ -0,0 +1,147 @@
# Übungen zu Dateine (Teil 1)
## Ausgangslage
Im Ordner `uebungen` sind folgende Textdateien mit Mitarbeiter- und
Planstellendaten vorhanden:
* `employee_skills.txt`
* `job_skills.txt`
* `salaries.txt`
* `salaries-errors.txt`
Jede dieser Dateien enthält einen Datensatz pro Zeile. Jede Zeile ist
nach folgendem Schema aufgebaut:
* Name
* Doppelpunkt
* Whitespace (ein oder mehrere Leerzeichen)
* Daten
Das Format des Datenfelds unterscheidet sich je nach Datei.
Aufgabe 1:
Öffnen Sie die Datei `employee_skills.txt` zum Lesen und lesen Sie die gesamte
Datei in einen String ein.
Wieviele Bytes ist der Dateihalt lang?
Aufgabe 3:
Öffnen Sie die Datei `employee_skills.txt` zum Lesen und lesen Sie die Datei
zeilenweise ein.
Wieviele Zeilen mit Daten enhält die Datei? Zeilen, die *nur* Whitespace
(Leerzeichen, CR, LF, Tabs, etc.) enthalten, werden nicht gezählt.
Aufgabe 3:
Öffnen Sie die Datei `employee_skills.txt` zum Lesen und lesen Sie die Datei
zeilenweise ein. Parsen Sie den Namen des Mitarbeiters aus jeder Datenzeile und
fügen Sie ihn zu einer Liste hinzu.
Geben Sie die Liste der Namen der Mitarbeiter alphabetisch sortiert, ein Name
pro Zeile, aus.
Tipp: verwenden Sie die String-Methode `split()` zum Parsen jeder Zeile.
Aufgabe 4:
Öffnen Sie die Datei `salaries.txt` zum Lesen und lesen Sie die Datei
zeilenweise ein. Parsen Sie den Namen des Mitarbeiters sowie das Gehalt aus
jeder Datenzeile und speichern die Daten in einem Dictionary mit dem Namen
des Mitarbeiters als Key und dem Gehalt als Wert. Der Gehaltswert sollte
jeweils in einen Integerwert umgewandelt werden.
Geben Sie das höchste, sowie das niedrigste Gehalt aus.
Tipp 1: verwenden Sie die String-Methode `split()` zum Parsen jeder Zeile und
die Funktion `int()` zum Umwandeln des Gehaltwerts.
Tipp 2: verwenden Sie die `min()` und `max()` Funktionen und wenden sie jeweils
auf alle Werte des Dictionaries auf einmal an.
Aufgabe 5:
Öffnen Sie die Datei `employee_skills.txt` zum Lesen und lesen Sie die Datei
zeilenweise ein. Parsen Sie den Namen des Mitarbeiters sowie die Liste der
Skills aus jeder Datenzeile und speichern die Daten in einem Dictionary mit dem
Namen des Mitarbeiters als Key und der Liste der Skills als Wert. Die Liste der
Skills für jeden Mitarbeiter sollte jeweils in eine Liste von Strings (ein
Element pro Skill) umgewandelt werden.
Tipp 1: verwenden Sie die String-Methode `split()` zum Parsen jeder Zeile und
nochmals zum Parsen der Liste der Skills. Dabei müssen jeweils unterschiedliche
Trennzeichen verwendet werden.
Aufgabe 6:
Kombinieren Sie die Programme aus Aufgabe 4 und 5 und kombinieren Sie die
beiden Dictionaries, die Sie aus den Daten erstellt haben.
Speichern Sie dabei das Gehalt und die Skills jedes Mitarbeiters jeweils
zusammen in einem Dictionary mit folgendem Format:
```py
employee_data = {
"salary": ..., # integer
"skills": [...], # list of strings
}
```
Speichern Sie alle Daten in einem Dictionary mit dem Namen des Mitarbeiters
als Key und dem `employee_data` Dictionary als Wert. Dadurch ergibt sich
folgende geschachtelte Datenstruktur:
```py
employees = {
"name 1": {
"salary": ...,
"skills": [...],
},
"name 2": {
"salary": ...,
"skills": [...],
},
...
}
```
Aufgabe 7:
Diese Aufgabe ist ähnlich wie Aufgabe 4, die einzulesende Datei enthält jedoch
mehrere Fehler, die Sie abfangen und behandeln müssen.
Öffnen Sie die Datei `salaries-errors.txt` zum Lesen und lesen Sie die Datei
zeilenweise ein. Parsen Sie den Namen des Mitarbeiters sowie das Gehalt aus
jeder Datenzeile und speichern die Daten in einem Dictionary mit dem Namen
des Mitarbeiters als Key und dem Gehalt als Wert. Der Gehaltswert sollte
jeweils in einen Integerwert umgewandelt werden.
Die Datei enthält folgende Fehler:
* Manche Zeilen sind auskommentiert (d.h. sie starten mit einem Hash (`#`).
dise Zeilen sollen ignoriert werden, d.h. sie werden nicht in den Daten
gespeichert.
* Bei manchen Zeilen fehlt der trennende Doppelpunkt zwischen dem Namen und
dem Gehalt. Fangen Sie diesen Fehler beim Parsen der Zeile ab und
ignorieren Sie entweder die Zeile oder versuchen Sie sie erneut mit einer
anderen Methode zu parsen.
* Bei manchen Mitarbeitern ist das Gehalt mit einem Währungssymbol angegeben.
Fangen Sie den Fehler beim Umwandeln des Gehaltwerts in einen Integer ab und
ignorieren Sie entweder die Zeile oder entfernen Sie das Währungssymbol vor
dem Parsen.
Geben Sie das höchste, sowie das niedrigste Gehalt aus.

93
uebungen/dictonaries.md Normal file
View File

@ -0,0 +1,93 @@
# Übungen zu Dictionaries
## Ausgangslage
Sie haben zwei Tabellen mit Personallisten jeweils mit Namen und Monatsgehältern
als ein Python-Dictionary. Die Keys sind die Namen der Angestellten (strings),
die Werte das jeweilige Monatsgehalt (integer):
```py
salaries_1 = {'Anna': 2000, 'Mark': 3000, 'Judith': 3500, 'Thomas': 2500}
salaries_2 = {'Barbara': 3000, 'Elke': 3300, 'Michael': 2800, 'Johann': 2000}
```
## Aufgabe 1:
Schreiben Sie ein Programm, das die beiden Dictionaries in einem neuen
Dictionary (`salaries_all`) zusammenführt und die Namen aller Mitarbeiter
als Liste ausgibt.
Tipp: Machen Sie zunächst eine Kopie des ersten Dictionaries (`dict.copy()`)
und fügen Sie dann die Einträge des zweiten Dictionaries der Kopie hinzu
(`dict.update()`).
## Aufgabe 2:
Schreiben Sie ein Programm, das den Namen und das Gehalt des Mitarbeiters mit
dem höchsten Gehalt aus den gesamten Daten ermittelt und diese ausgibt (mit
`print`).
## Aufgabe 3:
Schreiben Sie ein Programm, das die Gesamtsumme aller monatlichen Gehälter
ermittelt und diese ausgibt.
## Aufgabe 4:
Schreiben Sie ein Programm, das das Gehalt aller Mitarbeiter um 10% erhöht und
diese Daten in einem *neuen* Dictionary mit der selben Struktur speichert. Das
ursprüngliche Dictionary soll nicht verändert werden.
## Aufgabe 5:
Lassen Sie das Program dieses neue Dictionary in folgendem Format ausgeben:
```
Name Gehalt
--------------
Anna ???
Mark ???
...
```
Tipp: verwenden Sie die Escape-Sequenz für Tabulatoren `\t`.
## Aufgabe 6:
Lassen Sie das Programm die alten Gehälter in der gleichen Form ausgeben,
um zu zeigen, dass das ursprüngliche Dictionary nicht verändert wurde.
## Bonusaufgaben:
1. Sortieren Sie die Liste nach Höhe des Gehalts (absteigend).
Tipp: verwenden Sie die Funktion `sorted()` zum Sortieren.
2. Nummerieren Sie die Listeneinträge in der Ausgabe, startend mit 1.
3. Ermitteln Sie das durchschnittliche Gehalt nach der Erhöhung.
4. Berechnen Sie, wieviel Prozent des durchschnitlichen Gehalts jeder Mitarbeiter
verdient und geben diese Prozentzahl in einer zusätzlichen Spalte aus.
Tipp: Sie können die Prozentzahlen in einem neuen, zusätzlichen Dictionary
speichern oder, anstatt nur dem Gehalt, für jeden Mitarbeiter das Gehalt und
die Prozent des Durchschnittsverdienstes als Tuple mit zwei Elementen als
Wert im Dictionary ablegen.
## Ressourcen
Hilfe zu Dictionaries:
* <https://docs.python.org/3/library/stdtypes.html#mapping-types-dict>
* <https://www.data-science-architect.de/dictionaries-python/>

View File

@ -0,0 +1,8 @@
Anna: buchhaltung,management,marketing
Mark: management,marketing
Judith: management,buchhaltung,human resources
Thomas: software development,it support
Barbara: software development,management
Elke: management,buchhaltung,it support
Michael: software development,buchhaltung
Johann: it support,software development

5
uebungen/job_skills.txt Normal file
View File

@ -0,0 +1,5 @@
office manager: management,buchhaltung
ceo: management,human resources
developer: software development
cto: software development,system design,human resources
support desk: it support

View File

@ -0,0 +1,10 @@
Anna: 2000
Mark: 3000$
# Gekündigt:
# Margrit: 4000
Judith: 3500€
Thomas 2500
Barbara: 3000€
Elke: 3300
Michael: 2800€
Johann: 2000

8
uebungen/salaries.txt Normal file
View File

@ -0,0 +1,8 @@
Anna: 2000
Mark: 3000
Judith: 3500
Thomas: 2500
Barbara: 3000
Elke: 3300
Michael: 2800
Johann: 2000

83
uebungen/sets.md Normal file
View File

@ -0,0 +1,83 @@
# Übungen zu Sets
## Ausgangslage
Sie haben eine Liste mit Mitarbeitern und ihren Skills sowie eine Liste
von Planstellen im Betrieb mit erforderlichen Skills:
```py
employee_skills = {
'Anna': ("buchhaltung", "management", "marketing"),
'Mark': ("management", "marketing"),
'Judith': ("management", "buchhaltung", "human resources"),
'Thomas': ("software development", "it support"),
'Barbara': ("software development", "management"),
'Elke': ("management", "buchhaltung", "it support"),
'Michael': ("software development", "buchhaltung"),
'Johann': ("it support", "software development"),
}
job_skills = {
"office manager": ("management", "buchhaltung"),
"ceo": ("management", "human resources"),
"developer": ("software development",),
"cto": ("software development", "system design", "human resources"),
"support desk": ("it support",),
}
```
## Aufgabe 1:
Schreiben Sie ein Programm, das ermittelt, welche Menge an Skills bei den
Mitarbeitern insgesamt vorhanden sind. Jeder Skill wird nur einmal
berücksichtigt.
Verwenden Sie zum Speichern ein Set und geben Sie den Inhalt diese Sets aus.
Wieviele unterschiedliche Skills sind vorhanden?
## Aufgabe 2:
Schreiben Sie ein Programm, das ermittelt, welche Menge an Skills benötigt
werden, um die Anforderungen für alle Planstellen zu erfüllen.
Verwenden Sie zum Speichern ein Set und geben Sie den Inhalt diese Sets aus.
Wieviele unterschiedliche Skills werden insgesamt benötigt?
## Aufgabe 3:
Schreiben Sie ein Programm, das die beiden Sets aus Aufgabe 1 und 2 vergleicht
und feststellt, welche Skills im Mitabeiterstamm fehlen.
## Aufgabe 3:
Schreiben Sie ein Programm, das die beiden Sets aus Aufgabe 1 und 2 vergleicht
und feststellt, welche vorhandene Skills der Mitarbeiter von keiner Planstelle
abgedeckt werden.
## Aufgabe 4:
Schreiben Sie ein Programm, das für jede Planstelle herausfindet, welche
Mitarbeiter die notwendigen Skills für die Stelle besitzen.
Speichern Sie das Ergebnis in einem Dictionary der Form:
```py
candidates = {
"job 1": ("name 1", "name 2", ...),
"job 2: ("name 1", "name 3", ...),
...
}
```
## Ressourcen
Hilfe zu Dictionaries:
* <https://docs.python.org/3/library/stdtypes.html#set-types-set-frozenset>