Verwenden von Dictionaries in Python anstelle der Case / Switch-Anweisung

8

Ich möchte einen Zauberwürfel randomisieren, der als vollständig initialisiert ist (alle Farben auf den richtigen Seiten). Ich habe Bewegungsfunktionen, die den Würfel drehen. Ich möchte nach dem Zufallsprinzip 50 Funktionen in einer Reihe auswählen, um sie richtig zu randomisieren.

Ich mache dieses Projekt, um ein bisschen mehr über Python zu lernen, da ich hauptsächlich C ++ mache und ich sehe, dass es keinen Fall / Schalter für Python gibt, also versuche ich ein Wörterbuch. Wenn ich das Wörterbuch mache, scheint der Code aus irgendeinem Grund ausgeführt zu werden:

%Vor%

Wenn ich also dieses Wörterbuch mache, scheint es alle 11 Einträge aus irgendeinem Grund auszuführen und auszuführen (glaube ich). Ich finde keinen besseren Weg, zumindest eleganter als eine lange if / elif Folge von Aussagen.

! BEARBEITEN: Bei der Umsetzung beider Vorschläge wird das ("invertierte") Flag für die Funktionen nicht von beiden Vorschlägen gesetzt. Wenn Sie beispielsweise 1 und 7 aufrufen, geben Sie mir down_turn, aber die Ausgabe zeigt, dass das Flag nicht gesetzt wurde, obwohl es auf Nummer 7 hätte sein müssen.

Irgendwelche Ideen?

    
d d 29.04.2012, 03:50
quelle

2 Antworten

15

Wenn Sie das Diktat definieren, ruft es tatsächlich die Funktionen auf und speichert den Rückgabewert im Wörterbuch. Um nur einen Verweis auf die Funktionen im Wörterbuch zu speichern, müssen Sie die abschließenden Klammern löschen. So etwas wie:

%Vor%

Rufen Sie dann am unteren Rand scramble[i]() .

auf

Dies ruft die Funktion ohne Argumente auf. Um den Fall zu behandeln, in dem Sie "invertiert" als Argument übergeben, könnten Sie entweder separate Funktionen wie up_turn_inverted (), etc. definieren, oder Sie könnten im Dictionary einen 2-ple speichern, der aus der Funktion und dem Argument besteht, und dann aufrufen etwas liks scramble[i][0](scramble[i][1])

Aktualisierung vom Vorschlag in Kommentaren: Sie können auch Lambda-Ausdrücke verwenden, um die Funktionen zu definieren, insbesondere diejenigen, die ein Argument erfordern. Dies entspricht im Wesentlichen der Definition einer up_turn_inverted-Funktion, die jedoch als anonyme Funktion ausgeführt wird. Es würde so aussehen:

%Vor%

usw.

    
happydave 29.04.2012, 03:58
quelle
2

Ich glaube, dass dies "Funktionen als erstklassige Werte" genannt wird, was im Wesentlichen bedeutet, dass Sie Kennungen übergeben können, die sich auf Funktionen als Parameter für andere Funktionen beziehen.

Wenn Sie Ihr Wörterbuch definieren, wertet der Python-Interpreter die Funktionen aus und speichert die Werte im Wörterbuch. Um dies auszuschalten, bis Sie Ihre Zufallszahlen generieren, versuchen Sie stattdessen, Referenzen auf die Funktionen selbst in Ihrem Wörterbuch zu speichern, indem Sie die Klammern weglassen:

%Vor%

Wenn Sie dann Ihre Funktionen in der for-Schleife aufrufen, müssen Sie zwischen Ihren normalen und invertierten Fällen unterscheiden, durch welche Parameter Sie übergeben werden:

%Vor%

oder einfacher:

%Vor%     
machine yearning 29.04.2012 03:59
quelle