我想随机化初始化为完整的魔方(所有颜色都在正确的边上)。我有旋转立方体的移动函数。我想连续随机选择 50 个函数以正确随机化它。
我正在做这个项目来了解更多关于 Python 的知识,因为我主要做C++并且我看到 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("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 都会给我down_turn,但输出显示该标志在应该在数字 7 上时未设置。
有什么想法吗?
当你定义字典时,它实际上是在调用函数,并将返回值存储在字典中。 要让字典存储对函数的引用,您需要删除尾随括号。 所以像这样:
scramble = { 0: self.up_turn,
1: self.down_turn,
etc.
然后,在底部,调用scramble[i]()
.
这将调用不带参数的函数。 为了处理将"inverted"作为参数传递的情况,您可以定义单独的函数,如up_turn_inverted()等,或者您可以让字典存储由函数和参数组成的2-ple,然后调用某些东西likes scramble[i][0](scramble[i][1])
从评论中的建议更新:您还可以使用 lambda 表达式来定义函数,尤其是需要参数的函数。 这基本上等效于定义up_turn_inverted函数,但作为匿名函数就地完成。 它看起来像这样:
6: lambda: self.up_turn("inverted")
7: lambda: self.down_turn("inverted")
等。
这被称为"函数作为一等值",这意味着最重要的是,您可以将引用函数的标识符作为参数传递给其他函数。
定义字典时,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"))