有没有更优雅的写法来处理这些 if 语句?

38 投票
5 回答
2056 浏览
提问于 2025-04-17 12:09

我需要用Python写这四个if语句。注意它的作用,就是在一个循环中在四种可能的状态之间切换:1,0 -> 0,1 -> -1,0 -> 0,-1,然后再回到第一个状态。

if [dx, dy] == [1,0]:
    dx, dy = 0, 1
if [dx, dy] == 0, 1:
    dx, dy = -1, 0
if [dx, dy] == [-1, 0]
    dx, dy = 0, -1
if [dx, dy] == [0, -1]:
    dx, dy = 1, 0

有没有人能给我建议一个更好或者更简洁的写法?

5 个回答

31

我只是想补充一下Magnus的回答。如果你把[dx, dy]想象成一个向量,其实你在做的是一个90度的旋转(或者说PI/2)。

要计算这个旋转,你可以使用下面的转换公式:

two dimensional rotation

在你的情况下,这个公式可以转化为:

x = x * cos(90) - y * sin(90)
y = x * sin(90) + y * cos(90)

因为sin(90) = 1cos(90) = 0,所以我们可以简化成:

x, y = -y, x

就这样!

56

Magnus的建议确实是你问题的正确答案,但一般来说,在这种问题中,使用字典会更好:

statemap = {(1, 0): (0, 1), (0, 1): (-1, 0), (-1, 0): (0, -1), (0, -1): (1, 0)}

dx, dy = statemap[dx, dy]

即使在这种情况下,我也可以说使用字典更好,因为很明显有四种状态,并且它们是重复的,但很难抵挡所有数学的美妙。

顺便说一下,你问题中的代码有个错误,假设你测试的值是唯一可能的值,这段代码等同于:

dx, dy = 1, 0

这个错误在于你需要在第二个和后续条件前加上elif,否则在改变dxdy后,你还在继续测试它们。如果它们是10,那么所有的条件都会成立,最后结果会变得一样!如果它们一开始是01,那么第二个和所有后续条件都会成立,你又会得到1, 0。以此类推……

158
dx, dy = -dy, dx

有疑问的时候,就用数学来解决吧。;)

撰写回答