Compare commits
4 Commits
c102ea465e
...
fb0fed2247
Author | SHA1 | Date |
---|---|---|
Christopher Arndt | fb0fed2247 | |
Christopher Arndt | d59ec6069b | |
Christopher Arndt | 2fec50720d | |
Christopher Arndt | bbfee09be4 |
|
@ -71,20 +71,14 @@
|
|||
|
||||
## Mittagspause (12:30 - 13:30 Uhr)
|
||||
|
||||
|
||||
## Tag 1 (Montag) Nachmittag (13:30 Uhr - 17:00 Uhr)
|
||||
|
||||
### Objektorientierung in Python (45-60 min)
|
||||
### Zugriff auf Dateisystem (Teil 1) (20 min)
|
||||
|
||||
* Allgemeiner Einblick in die Objektstruktur in Python
|
||||
* Definieren von Klassen
|
||||
* Erzeugen von Objekten
|
||||
* Vererbung
|
||||
* Spezialmethoden von Objekten ("Dunder methods")
|
||||
|
||||
**Übungsaufgaben**
|
||||
|
||||
### Kaffee-/Teepause (20 min)
|
||||
* Öffnen und Lesen von Dateien
|
||||
* Ganzen Dateiinhalt einlesen
|
||||
* Textdateien zeilenweise einlesen
|
||||
* Textzeilen in Datenfelder zerlegen
|
||||
|
||||
### Fehlerbehandlung in Python (45-60 min)
|
||||
|
||||
|
@ -95,9 +89,21 @@
|
|||
|
||||
**Übungsaufgaben**
|
||||
|
||||
### Tipps und Tricks im täglichen Umgng mit Python (10-20 min)
|
||||
### Objektorientierung in Python (45-60 min)
|
||||
|
||||
### Zusammenfassung, Fragen, Lösungen usw. (30 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)
|
||||
|
@ -115,13 +121,14 @@
|
|||
|
||||
## Kaffee-/Teepause (20 min)
|
||||
|
||||
### Zugriff auf das Dateisystem
|
||||
### 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**
|
||||
|
||||
|
|
Binary file not shown.
Binary file not shown.
|
@ -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
|
||||
}
|
|
@ -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.
|
|
@ -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/>
|
|
@ -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
|
|
@ -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
|
|
@ -0,0 +1,10 @@
|
|||
Anna: 2000
|
||||
Mark: 3000$
|
||||
# Gekündigt:
|
||||
# Margrit: 4000
|
||||
Judith: 3500€
|
||||
Thomas 2500
|
||||
Barbara: 3000€
|
||||
Elke: 3300
|
||||
Michael: 2800€
|
||||
Johann: 2000
|
|
@ -0,0 +1,8 @@
|
|||
Anna: 2000
|
||||
Mark: 3000
|
||||
Judith: 3500
|
||||
Thomas: 2500
|
||||
Barbara: 3000
|
||||
Elke: 3300
|
||||
Michael: 2800
|
||||
Johann: 2000
|
|
@ -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>
|
Loading…
Reference in New Issue