Man kann über Einträge in einer Liste direkt iterieren, dazu braucht man nicht den Umweg über einen Index. Und einen Index `anzahl_*` zu nennen ist etwas irreführend.
Wenn man nach einem ``if`` mit einem weiteren ``if`` auf die genau gegenteilige Bedingung prüft, dann kann man dafür auch ein ``else`` benutzen.
Anstelle von `find()` könnte man den ``in``-Operator benutzen, was wesentlich leichter lesbar ist:
In `suchen()` ist dann auch gleich wieder eine Menge Quelltext, der nahezu identisch mit der `ausgabe()` ist. Das Programm würde kürzer, wenn man in `suchen()` einfach eine Liste mit den Adressen erstellt, auf die der Suchbegriff passt und damit dann `ausgabe()` aufruft.
Beim `eintragen()` wird wieder ein unnötiger Umweg über den Index gemacht und die vorletzte Zeile ist eine umständliche Art ``adressbuch.append(neu_eintrag)`` zu schreiben. Da taucht auch wieder dieses `spkrit` auf. Ich würd's `FELDNAMEN` oder so nennen und an den Anfang des Quelltextes verschieben.
Beim `beenden()` ist das ``f.seek(0)`` überflüssig. Und ob man die Anzahl der Datensätze wirklich in die Datei schreiben muss, hatte ich früher ja schon einmal hinterfragt. Man weiss ja, dass ein Datensatz sieben Zeilen lang ist, also kann man beim einlesen einfach alle sieben Zeilen einen neuen Datensatz an die Adressen-Liste anfügen.
Das schreiben ist dann wieder maximal umständlich. Wieder ein unnötiger Index und dann wird für eine einzelne Zeichenkette `writelines()` benutzt. Die Funktion erwartet ein "iterable" über Zeichenketten und schreibt jedes Element nacheinander in die Datei. In diesem Fall wird also jeder Buchstabe einzeln geschrieben. Da die Adressenliste schon Zeichenketten enthält, reicht ein einfaches ``f.writelines(adressbuch)`` um alles zu schreiben. Danach sollte man die Datei schliessen.
Das laden des Adressbuchs würde ich auch in eine Funktion verpacken. Auf Modulebene sollte so wenig wie möglich ausführbarer Code stehen.
Die Überprüfung der Auswahl ist auch wieder umständlich. Wieso wird auf enthaltensein in einer Liste mit einem Element geprüft, wenn ein einfacher Vergleich genügen würde?
So wie es jetzt da steht, könnte man die Funktionen so schreiben, dass alle das Adressbuch als einzelnes Argument entgegennehmen und eine Abbildung von Buchstabe zu Funktion benutzen.
Das speichern der Feldnamen in den Daten ist etwas ungünstig. Man sollte zum Beispiel nicht nach dem Vornahmen 'Andy' suchen, weil der durch 'Handy:' Bestandteil von jedem Datensatz ist.
Angepasste Version:
http://paste.pocoo.org/show/1426/