有没有更优雅的写法来处理这些 if 语句?
我需要用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)。
要计算这个旋转,你可以使用下面的转换公式:
在你的情况下,这个公式可以转化为:
x = x * cos(90) - y * sin(90)
y = x * sin(90) + y * cos(90)
因为sin(90) = 1
和cos(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
,否则在改变dx
和dy
后,你还在继续测试它们。如果它们是1
和0
,那么所有的条件都会成立,最后结果会变得一样!如果它们一开始是0
和1
,那么第二个和所有后续条件都会成立,你又会得到1, 0
。以此类推……
158
dx, dy = -dy, dx
有疑问的时候,就用数学来解决吧。;)