Optimierung eines Telefonbuchs

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo.
Seeker hat geschrieben:Aber irgendwie bekomme ich dann schnell Probleme. Die Liste 'order' habe ich ja erstellt, damit die Angaben in einer bestimmten Reihenfolge ausgegeben werden. Wenn ich die Liste in das Dictionary nehme, geht das wieder verloren. Die einzige Möglichkeit wäre wieder, die Liste separat mitzunehmen.
Das ist das gleiche, was du im Moment auch hast. Die Reihenfolge geht genau so verloren wie bei dir. Dadurch, dass du die Liste ORDER speicherst, bleibt auch die Reihenfolge zur Ausgabe erhalten. Dein selbst geschriebenes Beispiel trifft es schon genau richtig, nur das es in Zeile 39 nicht "for key in pairs:" heißen darf, sondern "for key in keys". "keys" (was dan KEYS heißen sollte) kannst du dann als Konstante ruhig global machen.

[quote="Seeker]Aber ansonsten müsste ich ja für jedes Attribut ein print-statement machen (um zu spezifizieren, was vorne dran steht), nicht? Dazu kommt, dass ich dann wieder eine ganze Reihe von if-statements machen müsste.[/quote]
Oder ein Dictionary oder eine Liste ;-)
Seeker hat geschrieben:Dafür müsste ich aber zuerst eine Klasse aufbauen, oder?
Nee, du benutzt einfach die vorhandenen Typen:

Code: Alles auswählen

if isinstance(person_info[key], list):
    print "\n".join(person_info[key])
else:
    print person_info[key]
Seeker hat geschrieben:Ja, dann ist alles klar. Ich hatte meinen Weg nur gewählt, um eben eine global definiertes Argument zu vermeiden. Wenn ich das Modul phonebook.py als ganzes importiere, würde diese globale Konstante dann auch mit-importiert werden, oder?
Das sind keine global definierten Argumente, das sind Konstanten. Solange du sie nicht als Argumente oder Rückgabewerte verwendest, können sie auch global definiert werden.
Bei einem Import werden die Konstanten natürlich auch mit importiert, darum brauchst du dir aber keine Gedanken machen. Außer du machst einen *-Import, dann machst du aber etwas falsch ;-)
Das Leben ist wie ein Tennisball.
Seeker
User
Beiträge: 70
Registriert: Mittwoch 16. September 2009, 19:52

Dein selbst geschriebenes Beispiel trifft es schon genau richtig, nur das es in Zeile 39 nicht "for key in pairs:" heißen darf, sondern "for key in keys"
*doing*... natürlich ^^
Oder ein Dictionary oder eine Liste Wink
Was ich ja jetzt habe.. einfach direkt ins phonebook integriert. :)
Nee, du benutzt einfach die vorhandenen Typen:
Alles klar, vielen Dank :).
Das sind keine global definierten Argumente, das sind Konstanten. Solange du sie nicht als Argumente oder Rückgabewerte verwendest, können sie auch global definiert werden.
hm... ja, das ist klar. Ich verstehe nicht ganz was der Unterschied (praktisch gesehen) zwischen einem global definierten Argument und einer Konstante ist... aber gibts wahrscheinlich auch nicht=)

Danke für all die Antworten! :)
lg Seeker
BlackJack

@Seeker: Was ist bei Dir ein global definiertes Argument? Argumente sind das, was man Funktionen und Methoden beim Aufruf übergibt. Die können gar nicht global sein.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Seeker hat geschrieben:Was ich ja jetzt habe.. einfach direkt ins phonebook integriert. :)
Und damit vermischt du Verarbeitung und Ausgabe. Ok, das tust du im Moment in fast jeder Funktion, aber es ist nicht besonders schön. Wenn du beispielsweise die Sprache ändern möchtest (Englisch -> Deutsch), dann würdest du auch die Verarbeitung ändern (da die Keys angepasst werden). Das ist schon ein sehr unerwartetes Verhalten.
Seeker hat geschrieben:hm... ja, das ist klar. Ich verstehe nicht ganz was der Unterschied (praktisch gesehen) zwischen einem global definierten Argument und einer Konstante ist... aber gibts wahrscheinlich auch nicht=)
Doch, das ist ein recht wichtiger Unterschied. Konstanten haben, auch über mehrere Ausführungen des Programms hinweg, immer den selben Wert (ganz grob ausgedrückt). Stell dir zum Beispiel Pi vor. Das wird sich sicher niemals ändern.
Eine globales Argument/globale Variable hingegen, kann seinen Wert von Start zu Start des Programms ändern. Stell dir zum Beispiel eine Datei vor, welche du mit "open" geöffnet hast. Im allgemeinen Fall wirst du diese Argument auch verändern, indem du lesend auf eine Datei zugreifst (Änderung des file-Objekts) oder du neue Elemente zu einem Dictionary hinzufügst.
Das Leben ist wie ein Tennisball.
Seeker
User
Beiträge: 70
Registriert: Mittwoch 16. September 2009, 19:52

Und damit vermischt du Verarbeitung und Ausgabe. Ok, das tust du im Moment in fast jeder Funktion, aber es ist nicht besonders schön.
Werde ich zukünftig vermeiden :)
Doch, das ist ein recht wichtiger Unterschied. Konstanten haben, auch über mehrere Ausführungen des Programms hinweg, immer den selben Wert (ganz grob ausgedrückt). Stell dir zum Beispiel Pi vor. Das wird sich sicher niemals ändern.
Doch genau dies hat mich eben verwirrt. Denn eine Konstante ist ja schon vordefiniert, während ich die Liste ja selber noch definiere... (auch wenn sie im Code definiert ist und dann das ganze Programm hindurch gleich bleibt)
Aber ich glaub ich weiss, was du meinst :)
BlackJack

@Seeker: Wie werden denn Konstanten vordefiniert, wenn man das nicht irgendwo einmal *macht*!? `math.pi` fällt ja auch nicht vom Himmel; die Programmierer des `math`-Moduls haben irgendwo im Modul `pi` einmal seinen Wert zuweisen müssen.
Seeker
User
Beiträge: 70
Registriert: Mittwoch 16. September 2009, 19:52

@BlackJack:
Schon klar.. alles ist irgendwann definiert worden. Aber z.B. Pi, c, Permittivitäts-Zahlen oder so sind irgendwie von der Natur 'definiert' worden, wir haben ihnen einfach eine Bezeichnung zugeordnet. Das ist für mich eine Konstante (da sie für jeden Benutzer gleich ist).
Aber in meinem Fall ist meine Liste ja wirklich einfach ein selber kreierter und eingeführter Parameter meines phonebook-Programms, und keine allgemein gültige Konstante =). Ein anderer Benutzer würde vielleicht andere Werte wollen, und es wäre immer noch 'richtig' =).
Aber das sind halt einfach Wort-Definitionen... wichtig ist schlussendlich dass man sie richtig einsetzt ;).

Ich habe noch einmal die Beschreibung von "global" genauer durchgelesen, und verstehe jetzt so ungefähr den Unterschied. D.h. in meinem Fall würde es für das Programm keinen Unterschied machen, aber es würde nicht wirklich viel Sinn machen, ein global-Statement einzuführen.
BlackJack

@Seeker: Konstanten in Programmiersprachen sind halt etwas anderes als Naturkonstanten oder mathematische Konstanten. Genau wie Variablen in vielen Programmiersprachen nicht denen in der Mathematik entsprechen.
Antworten