275
9.8
Lösungen
Hinweise zur Programmierung:
Verfahren Sie nach dem Prinzip der schrittweisen Verfeinerung und definieren Sie
Funktionen.
Verwenden Sie ein Dictionary mit den Namen als Schlüssel und den Telefonnummern
als Werten.
Beim Start des Programms wird das Dictionary mithilfe einer pickle-Funktion geladen
und vor Beendigung wieder gespeichert.
9.8 Lösungen
Lösung 1
Erläuterung:
#1: Der Variablen nummer wird ein beliebiger Anfangswert zugewiesen, damit die while-
Schleife funktionieren kann und schon beim ersten Test der Schleifenbedingung der Name
nummer definiert ist.
#2: In die Datei wird ein String geschrieben, der sich wie folgt zusammensetzt:
Inhalt der Variablen nummer
der konstante String ": "
aktuelles Datum und Zeit
die Escape-Sequenz "\n", die das Zeilenende markiert.
(N)eue Nummer eintragen
(A)lle Nummern ausgeben
(E)nde
Ihre Wahl: e
Danke, dass Sie dieses Produkt verwendet haben.
# marathon.py
import time
print("Marathon")
print()
num m er = " " #1
daten = open("/marathon/daten.txt", "w")
while nummer != "":
nummer = input("Startnummer (Ende mit <Enter>): ")
daten.write(nummer + ": " + time.asctime() + "\n") #2
d a t e n.f l ush( ) #3
print()
print("Die Daten befinden sich in der Datei /marathon/daten.txt")
dat e n.c l o s e() #4
Kapitel 9
Ein- und Ausgabe
276
#3: Mit der Methode flush() wird die Datei auf der Festplatte zwischengespeichert. Dabei
verändert sich die Position des Cursors nicht. Das heißt, beim nächsten Aufruf der
write()-
Methode wird in der nächsten Zeile weitergeschrieben.
#4: Datei wird geschlossen.
Den Inhalt der Textdatei
/marathon/daten.txt kann man sich mit einem normalen
Texteditor ansehen. Abbildung 9.9 zeigt das Ergebnis nach dem Beispieldialog in der Auf-
gabenstellung. In der letzten Zeile steht die Zeit bei Beendigung des Programms (keine
Startnummer).
Abb. 9.9: Ankunftszeiten in der Datei /marathon/daten.txt (Windows 10)
Lösung 2
Erläuterung:
#1: Die zwei Items werden durch Leerzeichen getrennt (Voreinstellung sep=" "). Danach
folgt kein Zeilenwechsel, sondern ein String mit zwei Schrägstrichen (
end=" // ").
# metallprobe.py
liste = [('Gold', 0.1234), ('Silber',23.45), ('Platin', 0.0678)]
for i in liste:
print(i[0], i[1], end=" // ") #1
print()
print()
for i in liste:
print(i[0], i[1], sep="\t") #2
print()
for i in liste:
print(i[0],format(i[1],"6.2f"), sep="\t") #3
277
9.8
Lösungen
#2: Zwischen die beiden Items, die in einer print()-Anweisung geschrieben werden, wird
ein Tabulator-Zeichen als Separator eingefügt. Nach den beiden Items folgt ein Zeilenwech-
sel (Voreinstellung
end = "\n ").
#3: Hier wird die Formatierungsfunktion zur Darstellung der Gleitkommazahl verwendet.
Der Formatierungsstring besagt Folgendes: Feldweite 6 Zeichen, 2 Nachkommastellen.
Die dritte Darstellung hat den Vorteil, dass die Texte (den Lesegewohnheiten entsprechend)
linksbündig sind und die Gleitkommazahlen so ausgerichtet sind, dass die Punkte genau
übereinander stehen. So kann man sie besser vergleichen.
Lösung 3
# telemanager.py
import pickle
def erzeugeTel():
t r y : #1
f = open("tel.txt", "rb")
t = pickle.load(f)
f.close()
except:
t = {} #2
return t
def r ech e r che ( ) : #3
name = input("Name: ")
if name in tel.keys():
print("Nummer: ", tel[name])
e l s e :
print("Name unbekannt")
def verabschiedung(): #4
print("Danke, dass Sie dieses Produkt verwendet haben.")
f = open('tel.txt', 'wb')
pickle.dump(tel, f)
f.close()
def menue():
e i n g abe = "" #5
while eingabe not in[ "e" , "E"]: #6
p r int( )
print("(S)uche nach Telefonnummer")
print("(N)eue Nummer eintragen")
print("(A)lle Nummern ausgeben")
Kapitel 9
Ein- und Ausgabe
278
Erläuterung:
#1: Es wird versucht, aus der Datei mit dem relativen Pfad tel.txt ein Dictionary (das
zuvor mit
pickle.dump() in dieser Datei gespeichert worden ist) zu laden. Wichtig ist, dass
die Datei im binären Modus geöffnet wird, weil mit dem
pickle-Mechanismus Bytestrings
verarbeitet werden.
#2: Falls es zu einem Fehler kommt – z.B. weil die Datei nicht existiert –, wird ein leeres Dic-
tionary
{} zurückgegeben.
#3: Hier wird auf das globale Dictionary tel zugegriffen. »Global« heißt hier, dass der Name
tel im Hauptprogramm (#10) definiert wird und nicht in dieser Funktionsdefinition.
#4: Diese Funktion speichert das globale Dictionary tel in einer Datei mit dem Namen
tel.txt im gleichen Verzeichnis ab, in dem sich auch das Skript befindet.
#5: Die Variable eingabe muss auf einen Anfangswert gesetzt werden, sonst gäbe es beim
Testen der Bedingung in der
while-Schleife einen Fehler.
#6: Die while-Schleife wird so lange durchlaufen, bis der Benutzer ein kleines e oder ein
großes
E eingibt.
#7: Falls der eingegebene Buchstabe (Inhalt der Variablen eingabe) in der Liste ["S", "s"]
enthalten ist, wird die Funktion recherche() aufgerufen.
print("(E)nde")
print()
eingabe = input("Ihre Wahl: ")
if eingabe in["S", "s"]: recherche() #7
elif eingabe in["A", "a"]: ausgeben()
elif eingabe in["N", "n"]: neu()
def ausgeben():
print("Name", "Nummer", sep="\t") #8
print(30*"_")
for k in tel.keys():
print(k, tel[k], sep="\t")
def neu():
gl o b al t e l #9
name = input("Name: ")
nummer = input("Nummer: ")
tel[name] = nummer
print("Neuer Eintrag gespeichert")
# Hauptprogramm
tel = erz e u geT e l () #10
menue()
verabschiedung()

Get Python 3 - Lernen und professionell anwenden now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.