Code vereinfachen

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.
Antworten
CoC4
User
Beiträge: 13
Registriert: Dienstag 30. August 2011, 09:41

Hallo Leute,

ich versuche mich gerade an einer etwas komplexeren Aufgabe und möchte dabei meinen Code einfacher und lesbarer machen. Da ich es aber leider nicht besser weiß, kommen immer wieder sich-wiederholende Strukturen vor, die ich gerne durch eine klarere Anweisung umgehen würde. Im Moment sieht das Ganze (abstrakt) noch so aus:

Code: Alles auswählen

def callback():

    # Variablen auslesen    
    var1 = var_eins.get()
    print "Inhalt: ", var1
    
    var2 = var_zwei.get()
    print "Länge: ", var2
    
    var3 = var_drei.get()
    print "Klassen: ", var3

    # ...

usw.

Ich würde das gerne so vereinfachen, dass ich den Ablauf ein einziges mal definiere und sich die Variablen (z.B. durch eine vorherige Definition) sozusagen von selbst abarbeiten. Pseudo-Code:

Code: Alles auswählen

def callback():
    x = x in range(10)
    y = ['eins', 'zwei', 'drei', ...]
    var<x> = var<y>.get()
    print<Inhalt>, var<x>
(Wie) Geht das?

Vielen Dank schonmal!
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Eine Nummerierung von Variablen ist eigentich immer schlecht - da bieten sich listen an. Wo kommen denn var_eins, etc denn her?

Aber so wie es aussieht suchst du nach dicts.
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
CoC4
User
Beiträge: 13
Registriert: Dienstag 30. August 2011, 09:41

Die Variablen lesen Zustände aus Benutzeingaben aus und nehmen nur '1' oder '0' ein. Wenn der Benutzer die Variable auf '1' setzt, so wird eine Berechnung/Funktion ausgelöst. Da die Optionen halt ziemlich viele sind muss ich den Code (weil ichs eben nicht besser weiß) auch genauso oft wiederholen wie ich optionen hab...
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Das klingt schon sehr nach dict.

Code: Alles auswählen

def func_x(): pass
def func_y(): pass

operations = {
    'do_x': func_x,
    'do_y': func_y, 
}

def ask_for_operations():
    for op, func in operations.items():
        if raw_input(op) == '1':
            yield func

for func in ask_for_operations():
    func()
Zuletzt geändert von jbs am Samstag 24. September 2011, 18:57, insgesamt 1-mal geändert.
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
CoC4
User
Beiträge: 13
Registriert: Dienstag 30. August 2011, 09:41

Super, danke!

Ok, also über ein dictionary diejenigen funktionen aufrufen, die ich brauche...
'yield' übergibt dann die funktion wieder, richtig?

Und nur zum Verständnis für mich: die letzten beiden Zeilen deines Codes sind einfach die Anweisung zur Ausführung?
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Man kann auch direkt in der Zeile biem yield die Funktionen aufrufen. Es ging mir darum das Prinzip zu zeigen, wie man dicts dafür verwenden kann.

Vielleicht täte es dir nicht schlecht, einmal die Grundlagen von Python durch zu arbeiten.
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
CoC4
User
Beiträge: 13
Registriert: Dienstag 30. August 2011, 09:41

Ich komm einfach manchmal aufs Einfachste nicht... :lol:

Und nochmal danke für die Veranschaulichung - das hilft mir ein großes Stück weiter!
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

jbs: Du hast die Klammern vergessen, um die Funktion ask_for_operations auch aufzurufen (schließlich kann man nicht über eine Funktion iterieren). Die letzten beiden Zeilen müssten also so lauten:

Code: Alles auswählen

for func in ask_for_operations():
    func()
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

:oops:

Danke, ist geändert.
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
Antworten