Verwenden von Wörterbüchern in Python anstelle von Case / Switch-Anweisung

Ich möchte einen Weichmacher, der als komplett initialisiert ist, randomisieren (alle Farben auf den richtigen Seiten). Ich habe Bewegungsfunktionen, die den Würfel drehen. Ich möchte zufällig 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 meistens C ++ mache und ich sehe, dass es keinen Fall / Switch für Python gibt, also versuche ich ein Wörterbuch. Wenn ich das Wörterbuch mache, scheint der Code aus irgendeinem Grund auszuführen:

def random_cube(self): scramble = { 0 : self.up_turn(), 1 : self.down_turn(), 2 : self.left_turn(), 3 : self.right_turn(), 4 : self.front_turn(), 5 : self.back_turn(), 6 : self.up_turn("inverted"), 7 : self.down_turn("inverted"), 8 : self.left_turn("inverted"), 9 : self.right_turn("inverted"), 10: self.front_turn("inverted"), 11: self.back_turn("inverted") } for x in range(50): i = random.randint(0,11) scramble[i] 

Also, wenn ich dieses Wörterbuch mache, scheint es zu laufen und alle 11 Einträge aus irgendeinem Grund auszuführen (ich denke). Ich kann nicht scheinen, einen besseren Weg zu finden, zumindest eleganter als eine lange if / elif String von Aussagen.

! EDIT: Bei der Umsetzung von beiden Vorschlägen wird das ("invertierte") Flag für die Funktionen nicht durch einen Vorschlag gesetzt. Zum Beispiel, rufen 1 und 7 beide geben mir down_turn, aber die Ausgabe zeigt, dass die Fahne nicht gesetzt wurde, wenn es auf Nummer 7 gewesen sein sollte.

Irgendwelche Ideen?

2 Solutions collect form web for “Verwenden von Wörterbüchern in Python anstelle von Case / Switch-Anweisung”

Wenn du das Dict definierst, ruft es eigentlich die Funktionen auf und speichert den Rückgabewert im Wörterbuch. Um nur den Wörterbuch speichern einen Verweis auf die Funktionen, müssen Sie die nachlaufenden Klammern fallen. So etwas wie:

 scramble = { 0: self.up_turn, 1: self.down_turn, etc. 

Dann runter scramble[i]() .

Dies wird die Funktion ohne Argumente aufrufen. Um den Fall zu behandeln, in dem du als Argument "invertiert" gehst, kannst du entweder separate Funktionen wie up_turn_inverted (), etc. definieren oder du hättest den Wörterbuchspeicher ein 2-fach bestehend aus der Funktion und dem Argument Etwas kippt scramble[i][0](scramble[i][1])

Update aus Vorschlag in Kommentaren: Du kannst auch Lambda-Ausdrücke verwenden, um die Funktionen zu definieren, insbesondere diejenigen, die ein Argument benötigen. Dies ist grundsätzlich gleichbedeutend mit der Definition einer up_turn_inverted-Funktion, aber an Ort und Stelle als anonyme Funktion. Es würde so aussehen:

 6: lambda: self.up_turn("inverted") 7: lambda: self.down_turn("inverted") 

etc.

Ich glaube, das heißt "Funktionen als erstklassige Werte", was am wichtigsten ist, dass man Identifikatoren übergeben kann, die sich auf Funktionen als Parameter auf 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 du deine zufälligen Zahlen generierst, versuchst du stattdessen die Verweise auf die Funktionen selbst in deinem Wörterbuch zu speichern, indem du die Klammern verlässt:

 def random_cube(self): scramble = { 0 : self.up_turn, 1 : self.down_turn, 2 : self.left_turn, 3 : self.right_turn, 4 : self.front_turn, 5 : self.back_turn, 6 : self.up_turn, 7 : self.down_turn, 8 : self.left_turn, 9 : self.right_turn, 10: self.front_turn, 11: self.back_turn } 

Wenn du dann deine Funktionen in der for-Schleife aufrufst, musst du zwischen deinen normalen und invertierten Fällen unterscheiden, mit welchen Parametern du übereinstimmst:

  for x in range(50): i = random.randint(0,11) if i <= 5: scramble[i]() else: scramble[i]("inverted") 

Oder einfacher:

  for x in range(50): i = random.randint(0,11) scramble[i]( () if i < 6 else ("inverted")) 
  • Wie kann ich diesen zufälligen Textgenerator in Python effizienter machen?
  • Python ist die beste Programmiersprache der Welt.