Uni-Logo

Praktikum Handlungsplanung - Python-Vorkurs

Datum Thema Materialien
Mo, 11. Oktober 2010 Einführung in Python: 0. Organisatorisches und Installation (PDF) (4-auf-1; PDF)
Einführung in Python: 1. Was ist Python? (PDF) (4-auf-1; PDF)
Einführung in Python: 2. Ausgaben und Zahlen (PDF) (4-auf-1; PDF)
Einführung in Python: 3. Variablen, Funktionen und Bedingungen (PDF) (4-auf-1; PDF)
Di, 12. Oktober 2010 Einführung in Python: 4. Sequenzen: Strings, Tupel, Listen (PDF) (4-auf-1; PDF)
Einführung in Python: 5. Mehr zu Strings & ein paar Worte zu Objekten (PDF) (4-auf-1; PDF)
Mi, 13. Oktober 2010 Einführung in Python: 6. Eine kleine Builtin-Safari (PDF) (4-auf-1; PDF)
Einführung in Python: 7. Dictionaries, Mengen & Dateien (PDF) (4-auf-1; PDF)
Do, 14. Oktober 2010 Einführung in Python: 8. Funktionen, Ausnahmen und Module (PDF) (4-auf-1; PDF)
Einführung in Python: 9. Klassen (PDF) (4-auf-1; PDF)
Fr, 15. Oktober 2010 Einführung in Python: 10. Iteratoren und Generatoren (PDF) (4-auf-1; PDF)
Einführung in Python: 12. Unit-Testing (PDF) (4-auf-1; PDF)
Einführung in Python: 13. Docstrings und weitere Kleinigkeiten (PDF) (4-auf-1; PDF)

Die Teilnahme an der Python-Einführung (11. bis 15. Oktober) ist nicht verpflichtend und hat auf die Benotung der Veranstaltung keinen Einfluss.

Übungen zu Python-Lektion 2

Aufgabe 1

Um ein erstes Gefühl für Python und den interaktiven Interpreter zu bekommen, teste einige Beispiele im Interpreter.

Aufgabe 2

Da wir jetzt schon einige Rechenoperationen gelernt haben, wollen wir den Interpreter gleich als Taschenrechner benutzen.

Berechne die Summe der letzten 3 Ziffern von 2^100.

Tipp: Wie würdest Du die Quersumme berechnen?

Aufgabe 3

Mein aktueller Kontostand beträgt 5 Cent (= 0.05 Euro). Ich lasse mich für 1000 Jahre einfrieren und hebe dann alles von meinem Konto ab.

Wie reich bin ich nach den 1000 Jahren Winterschlaf, wenn mein Guthaben mit 3% p.a. verzinst wird?

Aufgabe 4

Vielleicht habt Ihr schon selbst einige Fehlermeldungen des Interpreters bekommen, aber versucht ihn mal richtig herauszufordern und erzeugt eigene Fehlersituationen (z.B. Divison durch 0, extreme Exponenten usw.).

Lösungen

Übungen zu Python-Lektion 3

Aufgabe 1

Schreibe eine Funktion zur Berechnung von Binomialkoeffizienten.

Aufgabe 2

Schreibe eine Funktion, die prüft ob eine Zahl eine Primzahl ist.

Aufgabe 3

Schreibe eine Funktion, die alle Primzahlen <= n liefert.

Aufgabe 4

Ein Bankdirektor stellte auf dem Ziffernschloss zum Tresorraum die Codezahl 1986 ein. Aus Sicherheitsgründen sollte der Code täglich geändert werden. Dazu dachte sich der Direktor folgende Methode aus:

Er bildete die Summe der aktuellen vier Ziffern (am ersten Tag also 24) und fügte die Einerstelle dieser Summe (bei 24 also 4) der Codezahl rechts an, dafür wurde die erste linksstehende Ziffer (am ersten Tag die 1) gestrichen.

Nun wollte der Bankdirektor wissen, ob bei diesem Vorgehen die Zahl 1986 noch einmal als Code auftreten werde. Als ihm dies ein Computerexperte bestätigte, interessierte er sich brennend dafür, wieviele Tage vergehen werden, bis die Codezahl wieder 1986 lautet.

Kannst Du ihm weiterhelfen? Wieviele Tage vergehen, geht man vom Code 2006 aus?

Lösungen

Übungen zu Python-Lektion 4

Aufgabe 1

Gib in einem Ausdruck eine Liste mit allen durch 7 teilbaren Zahlen kleiner als 70 aus.

Aufgabe 2

Implementiere eine Funktion scalar, die das Skalarprodukt von zwei Vektoren berechnet.

Aufgabe 3

In dem Modul math sind einige mathematische Funktionen definiert. Gehe zu den Seiten des module index auf python.org und informiere Dich über die mathematischen Funktionen.

Zum Schreiben und Importieren von Modulen kommen wir später noch, aber wie wir schon gesehen haben, können wir Funktionen aus Modulen mit 'from <module> import <funktionsname>' importieren.

Mit diesen Informationen solltest Du in der Lage sein eine Funktion 'norm' zu schreiben, die die euklidische Norm eines Vektors, also dessen Länge berechnet.

Aufgabe 4

Schreibe eine Funktion, die eine nxn-Matrix transponiert. Die Matrix kann dabei als Liste von Vektoren (auch Listen) dargestellt werden. Eine Matrix wird transponiert, indem man die Zeilen in Spalten und Spalten in Zeilen vertauscht. Beispielsweise wird aus der Matrix ( 1 1 1 ) ( 2 2 2 ) ( 3 3 3 ) nach der Transponierung die Matrix ( 1 2 3 ) ( 1 2 3 ) ( 1 2 3 ).

Falls Du die Länge der Zeilen bzw. Spalten nicht als extra Parameter mit übergeben willst, kannst Du die Länge einer Sequenz mit der builtin-Funktion 'len(seq)' bestimmen. Repräsentiere Deine Matrix dabei als Tupel von Tupeln oder Listen von Listen.

Lösungen

Übungen zu Python-Lektion 5

Aufgabe 1

Schreibe eine Funktion, die eine Matrix schön formatiert ausgibt, also beispielsweise:

( 10  1  1 ) 
(  5 10  7 )
(  5 10 10 )

Aufgabe 2

Ersetze in den bisher geschriebenen Programmen Zuweisungen soweit möglich durch Präfix-Operatoren.

Aufgabe 3

Schreibe ein Programm, das eine formatierte Ein-mal-Eins Tabelle ausgibt, also eine Multiplikationstabelle für Zahlen zwischen 1 und 10.

Aufgabe 4

Da Funktionen auch nur Objekte sind, können sie auch als Parameter übergeben und im weiteren Verlauf benutzt werden. Schreibe Dein Programm aus Aufgabe 3 so um, dass auch andere Funktionswerte tabellarisch ausgegeben werden können.

Lösungen

Übungen zu Python-Lektion 6

Aufgabe 1

Schreibe eine Funktion, die für einen String testet, ob dieser ein Palindrom (z.B. Madam I'm Adam) ist. Leerzeichen und Sonderzeichen sollen beim Test nicht berücksichtigt werden.

Aufgabe 2

Schreibe eine Funktion, die für einen String eine ROT13-Verschlüsselung des Strings zurückliefert, bzw. einen ROT13-verschlüsselten String wieder entschlüsselt. Wir nehmen hier vereinfachend an, dass wir nur mit den Zeichen des Alphabets (keine Umlaute) arbeiten und Leerzeichen als Leerzeichen erhalten bleiben.

Tip: Die Großbuchstaben des Alphabets sind im ASCII-Zeichensatz von 65 (A) bis 90 (Z), die Kleinbuchstaben von 97 (a) bis 122 (z) codiert.

Aufgabe 3

Implementiere den Quicksort-Algorithmus.

Dieser sortiert eine Liste von Elementen mit dem Divide-and-Conquer-Verfahren. Dabei wird zunächst ein Pivot-Element gewählt (z.B. das erste Element der Liste) und danach werden zwei Listen, jeweils mit den Elementen größer bzw. kleiner als das Pivot-Element, erzeugt. Dann wird rekursiv die Liste mit den kleineren Elementen sortiert, mit dem Pivotelement verkettet und diese neue Liste wird mit der rekursiv sortierten Liste der größeren Elemente verkettet.

Lösungen

Übungen zu Python-Lektion 7

Aufgabe 1

Schreibe ein Programm, das aus einer Datei den Inhalt ohne Leerzeilen in eine andere Datei schreibt. Bitte vorsichtig mit den Dateinamen sein, sonst überschreibt Ihr vielleicht Eure eigenen Dateien.

Aufgabe 2

Benutze Deine Lösung aus Lektion 6, Aufgabe 2, um eine ganze Datei mittels ROT13 zu ver- bzw. zu entschlüsseln. Der ver-/entschlüsselte Text soll einfach auf die Standardausgabe ausgegeben werden.

Aufgabe 3

Schreibe ein Programm, das einen hexdump einer Datei ausgibt. Die Ausgabe soll pro Zeile ungefähr so aussehen:

10 Zeichen HEX-Codes  2-3 Leerzeichen 10 Zeichen in ASCII

Aufgabe 4

Schreibe eine funktion 'cat', die wie das Unix-Programm Dateien konkatenieren kann. Übergib dem Programm dazu am besten zwei Parameter: eine Liste von Dateien, die konkateniert werden sollen, und einen Dateinamen, wo die verketten Dateien abgespeichert werden sollen.

Lösungen

Übungen zu Python-Lektion 8

Aufgabe 1

Schreibe eine Funktion easydict, die beliebig viele Argumente aus 2-elementigen Tupeln und beliebig viele keyword-Argumente akzeptiert und alle übergebenen Parameter zu einem Dictionary zusammenfasst. Also z.B. easydict( ("a", 2), ((1,2), "spam"), red=[255, 0, 0], blue=[0, 0, 255])) sollte folgendes Dictionary erzeugen: {'a': 2, (1, 2): 'spam', 'red': [255, 0, 0], blue: [0, 0, 255]}

Fange dabei mögliche Ausnahmen ab und gib eine spezifische Fehlermeldung aus.

Aufgabe 2

Erweitere Deine Lösungen zu der Lektion 7 um exception handling und fange Fehler beim Öffnen von Dateien ab.

Aufgabe 3

Da wir jetzt wissen, wie man mit Modulen umgeht, können wir mit Modulen aus der Standardbibliothek arbeiten und etwas komplexere Sachen machen. Das Modul 'sys' (siehe Module Index auf http://www.python.org) ist nützlich, wenn man Strings von der Standardeingabe einlesen möchte. Es besitzt nämlich das Attribut argv (dazu kommen wir in der nächsten Lektion), was nichts anderes ist als eine Liste, mit den Eingabeparametern des aufgerufenen Scripts. Dabei ist wichtig, dass das erste Element (Index 0) immer der Programm-/Skript-Name selbst ist. Die Eingaben beginnen also erst ab Index 1.

Desweiteren lernen wir in dieser Aufgabe das Modul 'os' kennen. 'os' bietet betriebssystemspezifische Informationen und Methoden. Im Modul os ist eine Methode 'execvp' enthalten (siehe Module index), mit der man Programme aufrufen kann. Ich hab das selbst noch nie unter Windows gemacht, es sollte aber auch da funktionieren.

Also kommen wir zur eigentlichen Aufgabe. Schreibe ein Skript newpy, das als Eingabe einen Dateinamen bekommt und dann eine Skriptdatei vorbereitet. Der Aufruf soll über die Kommandozeile mittels:

# newpy MeinScript.py
erfolgen.

Ein allgemeines Pythonskript unter Unix sieht ungefähr so aus:

#!/usr/bin/env python3
# -*- coding utf-8 -*-
# MyScript.py

Als kleines Gimmick kann nun die os.execvp() Methode benutzt werden, um den favorisierten Editor zu öffnen. Beim Vim z.B. kann man noch die Option mit übergeben, dass der Editor direkt an die letzte Zeile in der Datei springt und man kann dann sofort mit dem Python-Skripting beginnen, nachdem 'newpy' aufgerufen wurde.

Lösungen

Übungen zu Python-Lektion 9

tree.py

Aufgabe 1

Implementiere für die Klasse `Tree` aus der Vorlesung folgende zusätzlichen Methoden:

  • find(self, key): Liefere den Teilbaum, dessen Wurzel den Dateneintrag key hat (oder erzeuge ggfs. einen Fehler).
  • size(self): Liefere die Zahl der Knoten des Baums.
  • height(self): Liefere die Höhe des Baums.

Aufgabe 2

Implementiere magische Methoden für Tree, so dass folgende Ausdrücke sich sinnvoll verhalten:

  • len(tree)
  • tree1 == tree2
  • -tree (liefert einen Baum, bei dem gegenüber tree die Reihenfolge aller Kinder umgekehrt ist)
  • del tree["Donald"]
  • tree["Daisy"] (lesender Zugriff)

Lösungen

Übungen zu Python-Lektion 10

Aufgabe 1

Schreibe eine Iterator-Klasse, die die Fibonacci-Zahlen < n berechnen kann.

Aufgabe 2

Schreibe eine Generator-Funktion, die die Fibonacci-Zahlen berechnet.

Aufgabe 3

Erstelle eine Generator-Comprehension, die alle 5-stelligen Binärzahlen inklusive der Integer-Repräsentation zurückliefert. Also Tupel (01011, 11) usw. in deren Binärdarstellung genau 3 Einsen enthalten sind.