用Python中的字典代替Case/Switch语句

2024-06-25 23:29:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我想随机化一个初始化为完整的魔方(所有颜色都在正确的边上)。我有旋转立方体的移动函数。我想随机选择50个函数,在一行,以适当的随机。

我正在做这个项目,以便了解更多关于Python的知识,因为我主要从事C++,我看到Python没有CASE/Switter,所以我正在尝试一本字典。当我制作字典时,代码似乎是出于某种原因执行的:

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]

所以当我编这本字典的时候,它似乎因为某种原因运行并执行了所有的11个条目(我想)。我似乎找不到更好的方法,至少比一长串if/elif语句更优雅。

啊!编辑:实现这两个建议时,两个建议都不会设置函数的“反转”标志。例如,调用1和7都会让我掉头,但输出显示,旗标本应在7上时未设置。

有什么想法吗?


Tags: 函数selfright字典backrandomleft建议
2条回答

我认为这称为“函数作为一级值”,这意味着最重要的是,您可以将引用函数作为参数的标识符传递给其他函数。

定义字典时,Python解释器计算函数并将值存储在字典中。若要在生成随机数之前推迟此操作,请尝试将对函数本身的引用存储在字典中,方法是去掉括号:

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
                }

然后在for循环中调用函数时,必须区分传递参数的正常情况和反转情况:

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

或者更简单地说:

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

定义dict时,它实际上是调用函数,并将返回值存储在字典中。为了让字典存储对函数的引用,您需要删除后面的括号。比如说:

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

然后,在底部,调用scramble[i]()

这将调用不带参数的函数。要处理将“inversed”作为参数传递的情况,可以定义单独的函数,如up_turn_inversed(),等等,也可以让字典存储一个由函数和参数组成的二元组,然后调用scramble[i][0](scramble[i][1])

从评论中的建议更新: 还可以使用lambda表达式定义函数,特别是需要参数的函数。这基本上等同于定义一个up-turn-inversed函数,但是作为一个匿名函数来实现。看起来是这样的:

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

等等

相关问题 更多 >