有没有办法写这些ifs更好?

时间:2012-02-01 23:08:54

标签: python control-structure

我需要在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 个答案:

答案 0 :(得分:156)

dx, dy = -dy, dx

如有疑问,请应用数学。 ;)

答案 1 :(得分:55)

马格努斯的建议无疑是你提出的问题的正确答案,但一般来说,你想用字典来解决这样的问题:

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结束。等等...

答案 2 :(得分:31)

只是扩展马格纳斯的答案。如果你想象[dx,dy]作为向量,你实际做的是rotation 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

你有它!

答案 3 :(得分:18)

您正在使用的值似乎是一个连续旋转的单位矢量 - 换句话说,是phasorComplex numbers are coordinates,所以:

# at initialization
phase = 1
# at the point of modification
phase *= 1j
dx, dy = phase.real, phase.imag

假设我对dx的含义的解释,dy值是正确的,这为你提供了额外的灵活性,以防你以后想要在每一步中旋转一些其他数量。

答案 4 :(得分:6)

虽然我会选择Magnus的回答,但这是另一种旋转一组值的方法:

def rotate(*states):
    while 1:
        for state in states:
            yield state

for dx, dy in rotate((1, 0), (0, 1), (-1, 0), (0, -1)):
    pass

请注意,break循环中某处应该有for dx, dy,否则它永远不会结束。