Mehrfachverzweigung in Python / wo ist switch/case?

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Mehrfachverzweigung in Python / wo ist switch/case?

    Servus,
    da Python keine Möglichkeit von switch/case anbietet muss man ein bisschen tricksen um nicht ständig mit vielen ifs und elifs zu hantieren:

    Ich hab hier ein Dictionary genommen und mappe Schlüssel(die cases) drauf.
    Leider kann ich dann nur String zu String mappen und muss diesen String dann evaluieren, und kann z.B. im Dict. keine Funktionen direkt aufrufen :cry:

    Weiß jemand vll. ne elegantere Methode?

    Hier übrigens die schicke,kurze variante von Blatt7A2 von Programmieren 3 ohne das ganze if,elif,elif,... gedöns 8)

    Quellcode

    1. functions = {
    2. 'xy': 'dreidpunkt[0:-1]',
    3. 'yz': 'dreidpunkt[1:]',
    4. 'xz': 'dreidpunkt[0::2]'
    5. }
    6. def machebild(punkte, name="bild", mode="xy"):
    7. if mode=="all":
    8. machebild(punkte,name,mode="xy")
    9. machebild(punkte,name,mode="xz")
    10. machebild(punkte,name,mode="yz")
    11. else:
    12. typus=functions[mode]
    13. im=Image.new('1',(400,400))
    14. for dreidpunkt in punkte:
    15. im.putpixel(eval(typus),1)
    16. im.save(name+"-"+mode+".png")
    Alles anzeigen
  • Deine Idee finde ich interessant. Eine elegantere Methode kenne ich nicht, habe aber auch kein Problem mit einer Reihe von elifs.

    Du kannst als Schlüssel von dicts aber sehr wohl Zahlen verwenden:
    5.5 Dictionaries
    ...
    Unlike sequences, which are indexed by a range of numbers, dictionaries are indexed by keys, which can be any immutable type; strings and numbers can always be keys
  • Hallo MrFloppy! Marco? Bist du das?

    Ich habe meine Lösung soeben online gestellt:
    http://www.easy-coding.de/loesung-3d-objektdatei-zu-einem-2d-bild-t2545.html#10471

    Ich arbeite genau wie du mit einem Dictionary..

    Quellcode

    1. def direction(x, mode):
    2. "reduziert drei punkte zu einem"
    3. case = {"xz":(x[0],x[1]),"xy":(x[0],x[2]), "yz":(x[1],x[2])}
    4. return map(int, case[mode])


    Und so funktioniert das mit einem dreidimensionalem Array

    Quellcode

    1. punkte = map(lambda x:direction(x,mode), punkte)


    //EDIT: Den Fall "all" hab ich vergessen.. ergänze ich vielleicht später