Verbesserungsvorschläge....

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: 4872
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Dienstag 9. März 2010, 15:55

derdon hat geschrieben:EyDu: Du empfiehlst aufsteigende ganze Zahlen als Schlüssel für dicts zu verwenden? Warum?
Das hat etwas mit der Erdrotation zu tun, ist aber viel komplex um das hier zu erläutern.
Das Leben ist wie ein Tennisball.
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Dienstag 9. März 2010, 16:00

Code: Alles auswählen

def umfang_rechteck(a,b):
    return a*b

def end():
    raise KeyboardInterrupt

def main():
    options = {'1': dict(str='Umfang Rechteck', func=umfang_rechteck, params=('a','b')),
                'e': {'func': end},
                }
    
    def print_menu():
        print 'Menu'
        for i in range(1, len(options)):
            print '%s. %s' %(i, options[str(i)]['str'])
        print 'e for end'
        print
    
    def get_choice():
        exercise = None
        while not exercise:
            choice = raw_input('Bitte treffen Sie eine Auswahl: ')
            exercise = options.get(choice, None)
        params = {}
        for param in exercise.get('params', ()):
            params[param] = int(raw_input("Bitte einen Wert fuer %s eingeben: " %param))
        return exercise['func'], params
    
    try:
        while True:
            print_menu()
            func, kwargs = get_choice()
            print func(**kwargs)
            print
    except KeyboardInterrupt:
        print 'end'

if __name__ == '__main__':
    main()
Ganz so schön ist das nicht gemacht mit dem Mischen von Zahlen und dem "e".
[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]
rolgal_reloaded
User
Beiträge: 312
Registriert: Dienstag 24. Oktober 2006, 19:31

Dienstag 9. März 2010, 19:17

Warum eine Funktion main?

Das wirkt für mich überflüssig :?:

Und ob die Funktionen im Dict. besser lesbar sind....da kann ich sie doch frisch ausschreiben, der Zweizeiler ist mir da sympahtischer, oder gibts in deiner Fassung einen wesentlichen Vorteil?

LG

r_r
BlackJack

Dienstag 9. März 2010, 19:55

@rolgal_reloaded: `main()` weil Code und Variablen auf Modulebene unsauber sind. Da besteht halt immer die Gefahr, dass man die aus versehen oder absichtlich zur Kommunikation zwischen Funktionen oder Methoden verwendet und damit unnötige Abhängigkeiten einbaut die schwerer zu verstehen sind.

Von welchen zwei Zeilen Code redest Du? Überleg Dir mal wie man bei Deinem Code weitere Funktionen hinzufügt und wie das bei jbs' Code aussieht.
rolgal_reloaded
User
Beiträge: 312
Registriert: Dienstag 24. Oktober 2006, 19:31

Dienstag 9. März 2010, 20:02

BlackJack hat geschrieben:@rolgal_reloaded: `main()` weil Code und Variablen auf Modulebene unsauber sind. Da besteht halt immer die Gefahr, dass man die aus versehen oder absichtlich zur Kommunikation zwischen Funktionen oder Methoden verwendet und damit unnötige Abhängigkeiten einbaut die schwerer zu verstehen sind.

Von welchen zwei Zeilen Code redest Du? Überleg Dir mal wie man bei Deinem Code weitere Funktionen hinzufügt und wie das bei jbs' Code aussieht.
Ich rede von den zwei Zeilen, die meine Funktionen für die Berechnungen haben.

LG r_r
rolgal_reloaded
User
Beiträge: 312
Registriert: Dienstag 24. Oktober 2006, 19:31

Dienstag 9. März 2010, 20:09

Code: Alles auswählen

    def get_choice():
        exercise = None
        while not exercise:
            choice = raw_input('Bitte treffen Sie eine Auswahl: ')
            exercise = options.get(choice, None) 
Wofür das None im Methodenaufruf in der letzten Zeile?
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Dienstag 9. März 2010, 20:12

[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]
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Dienstag 9. März 2010, 20:25

http://docs.python.org/library/stdtypes.html#dict.get hat geschrieben:If default is not given, it defaults to None
Was willst du uns also damit sagen?
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Dienstag 9. März 2010, 20:33

Hmm, dachte get ist so wie __getitem__ nur mit optionalem Argument.

Naja, explicit ist besser als implicit :)
[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]
EyDu
User
Beiträge: 4872
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Dienstag 9. März 2010, 23:10

rolgal_reloaded hat geschrieben:Und ob die Funktionen im Dict. besser lesbar sind....da kann ich sie doch frisch ausschreiben, der Zweizeiler ist mir da sympahtischer, oder gibts in deiner Fassung einen wesentlichen Vorteil?
Ich bin eigentlich davon ausgegangen, dass aus "Benutzereingabe" und "nicht in die Berechnungsfunktion" deutlich wird, dass du nicht die Berechnung in Dictionaries packen sollst.

Es läuft im Prinzip auf jbs Vorschlag mit den "options" Hinaus. Auch wenn ich kein inneres Dictionary sondern ein Tupel verwenden würde. Mit Dekoratoren kann man das ganze aber noch schöner gestalten.
Das Leben ist wie ein Tennisball.
rolgal_reloaded
User
Beiträge: 312
Registriert: Dienstag 24. Oktober 2006, 19:31

Dienstag 9. März 2010, 23:12

Erst jetzt habe ich gesehen, dass ich den Code von jbs doch nicht geschnallt habe. Wofür überhaupt options?

LG

r_r

@edit:

ach nee, forget it :D
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Dienstag 9. März 2010, 23:15

EyDu hat geschrieben:Es läuft im Prinzip auf jbs Vorschlag mit den "options" Hinaus. Auch wenn ich kein inneres Dictionary sondern ein Tupel verwenden würde. Mit Dekoratoren kann man das ganze aber noch schöner gestalten.
Mit Dekoratoren wirds dann doch ganz schön magisch :).

Ich mag Dictionary lieber, da man später noch sieht, was sich nun dahinter verbirgt und es lesbarer wird.
[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]
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Dienstag 9. März 2010, 23:20

rolgal_reloaded hat geschrieben:Erst jetzt habe ich gesehen, dass ich den Code von jbs doch nicht geschnallt habe. Wofür überhaupt options?

LG

r_r

@edit:

ach nee, forget it :D
Ich bündle die Sachen, die zusammen gehören. Jede Aufgabe hat eine Nummer, die auch später dann im Menü auftaucht. Diese ist zugleich der Key. Unter dem Wert verbergen sich dann die Beschreibung, die ich unglücklicherweise auf die Schnelle `str` genannt habe. Vielleicht wäre hier `desc` besser gewesen. Dann bildet ja jede Option im Menü eine Funktion ab, weshalb diese ebenfalls hinzugefügt wird. Dazu kommen noch die Parameter, die benötigt werden. Alternativ könnte man die Funktion untersuchen und schauen, welche Parameter sie benötigt und danach entsprechend fragen. Wenn man es dann noch besser haben möchte, könnte man die Docstrings auswerten, die zuvor noch sinnvoll erstellt werden müssen.

Edit: Man kann mit dem Dictionary schnell neue Funktionen hinzufügen und man hat den Vorteil nicht immer `elif x == y` schreiben zu müssen, sondern man greift einfach auf das Dictionary zu.
[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]
rolgal_reloaded
User
Beiträge: 312
Registriert: Dienstag 24. Oktober 2006, 19:31

Dienstag 9. März 2010, 23:29

@jbs

Aber dir bleibt es doch nicht erspart die Funktion auszuschreiben - so wie umfang_rechteck, oder?
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Dienstag 9. März 2010, 23:34

Irgendwie muss ich sie ja dispatchen. Die alternative wäre über die Dekoratoren, wie sie EyDu sie vorschlug.


Edit: Mir fällt gerade auf, dass ich den Flächeninhalt berechne, statt dem Umfang :D
[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