Hm... also da ist jetzt leider wieder einiges nicht so gelungen!
- Die Zeilen 2-5 sind unschön! Kommandozeilen Parsing gehört in eine ``main``-Funktion und vor allem *weg* von Modulebene! Und nutze dafür doch ``argparse``.
- In Zeile 14 handelst Du Dir vollkommen unnötiger Weise eine *globale Variable* ein. Wieso das? Wieso holst Du dir die Adressen nicht in Deiner ``main__-Funktion, also ab Zeile 62 und übergibst diese dann an die Funktionen, die eine Sammlung von Adressen benötigen?
- ``anzeigen`` ist komplett unnötig! Vor allem aber hast Du die Intention nicht verstanden, die ich beim Umbau und dem Vorschlag eine formatierte Ausgabe für *eine* Adresse zu schaffen. In ``ausgabe_formatieren`` behandelst Du jetzt *alle* Adressen, ok. Aber wie bekomme ich denn jetzt *eine* Adresse schön formatiert ausgegeben? Das wäre nur über umständliche Wege zu erreichen! Denk mal drüber nach, wie man das auflösen kann. (Ist wirklich einfach!)
- Die Schlüssel des Dictionary nun ``kontakt_info`` zu nennen, ist wenig hilfreich beim Verständnis des Codes. Ich würde bei ``schluessel`` bleiben (wobei ich englische Namen nutzen würde).
- Du solltest Dir das API von Dictionaries noch einmal angucken:
dict Darin findest Du Methoden, die Dich z.B. durch jeweils ein Schlüssel-Wert-Paar laufen lassen, was Dir bei der Ausgabe den Code einfacher werden lässt.
- Wieso interessieren Dich beim Suchen die Schlüssel? Es reicht dabei doch, sich die *Werte* aus einem Adresseintrag heraus zu suchen und bei denen zu testen, ob ein Eintrag dabei ist oder nicht! Im übrigen würde ich statt des ``==``-Operators den ``in``-Operator verwenden; dieser prüft unscharf, d.h. bei der Suche nach ``Chris`` würden sowohl Einträge mit ``Christian`` als auch mit ``Christoph`` gefunden werden. Du könntest auch noch ``str.lower`` nutzen, um Groß- und Kleinschreibung zu ignorieren.
- Das Suchen gibt nur *eine*, nämlich die zuerst gefundene, Adresse zurück - wieso das? Will man da nicht eine *Sammlung* von Adressdaten haben, bei den das Suchmuster gepasst hat?
- Zeile 38 ist ein *Anti-Pattern* in Python! Abgesehen davon, dass die Laufvariable ``adresse`` etwas vollkommen falsches vermittelt (man denkt es handele sich um eine Adresse, in Wahrheit ist es ein *Index*!), wieso zum Geier iterierst Du nicht einfach *direkt* über die Liste von Adressen? Ist doch wesentlich einfacher!
- Beim Löschen würde ich mit einem Schlüssel arbeiten, d.h. der Benutzer muss einen *eindeutigen* Identifier angeben, der einen Datensatz wirklich *eindeutig* bestimmt. Deine Suche - und auch mein Vorschlag zur Änderung der Suche - kann ja alles mögliche zurück liefern und schwupps hast Du Daten gelöscht, die nicht gewollt waren. Der Index eines Eintrags ist leider keine gute Option, da sich dieser nach jeder Lösch-Operation für alle nachfolgenden Elemente ändert. (Außer man würde von hinten nach vorne löschen... aber das erscheint mir ein wenig zu "magic"). An dieser Stelle solltest Du über einen eindeutigen Schlüssel für die Einträge nachdenken. Wie man diesen erzeugt oder definiert ist nun eine Frage der "Kreativität". Man könnte auf jeden Fall anstatt der Liste für die Sammlung von Adressen ein Dictionary nutzen. Damit hast Du schon mal die Eindeutigkeit einer Schlüssel-Wert-Beziehung abgedeckt. Wie Du den Schlüssel wählst, ist dann wieder eine andere Frage. Man könnte einen md5 Hash aus Name und Vorname berechnen o.ä. Man könnte auch aus dem Anfangsbuchstaben eines Nachnamen und eines Vornamens Schlüssel bauen. Allerdings braucht man dann noch Zusatz-Werte bei gleichen Namen. Als einfachste Lösung kannst Du zunächst auf einfach mit einem numerischen Schlüssel arbeiten und bei der Neuanlage einfach den bisherigen Maximalwert + 1 als neuen Schlüssel nehmen.
- Evtl. magst Du Dir mal das
Unittest-Modul von Python angucken; damit könntest Du Deine Basisfunktionen ganz einfach testen und wärst auch bei Änderungen in Funktionen (== Refactoring) sicher, dass Du nichts kaputt gemacht hast.
Edit: Ach ja: Nutze für die Entwicklung doch ein Versionskontrollsystem. Zum einen fängt der Code an, zu groß zu werden, um hier in jeden Beitrag eingefügt zu werden, zum anderen verlierst Du dann die "Angst" vor massiven Änderungen, weil Du im Zweifel einfach einen vorherigen Stand wieder abrufen kannst. Viele hier mögen
Github, aber auch
Bitbucket ist recht beliebt. Evtl. reicht Dir auch erst einmal ein Pastebin aus, um den Code hier zu präsentieren. Neben dem im Forum eingebauten (s. ganz oben in der Menüleiste des Forums!), böte sich sonst auch noch gist.github.com an - als (registrierter?) Benutzer kann man die Gists sogar verwalten, sprich neuere Versionen hochladen.