有没有办法写这些如果更好?

我需要在Python中编写这四个。 注意它做了什么,在一个循环中四种可能的状态之间变化: 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 

任何人都可以build议我一个更好/更好的方式来写这个?

 dx, dy = -dy, dx 

如有疑问,请申请math。 ;)

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

 statemap = {(1, 0): (0, 1), (0, 1): (-1, 0), (-1, 0): (0, -1), (0, -1): (1, 0)} dx, dy = statemap[dx, dy] 

即使在这种情况下,我也可以用字典争论,因为显然有四种状态,而且这些状态是重复的,但是很难抵制所有math的纯粹美

顺便说一句,你的问题中的代码有一个错误,并假设你testing的值是唯一可能的值,相当于:

 dx, dy = 1, 0 

这个错误是你需要在第二个和后续的条件下使用elif ,否则在改变它们之后你会继续testingdxdy 。 如果他们是10 ,那么你所有的条件将是真实的 ,他们最终也是一样的! 如果它们以01开始,那么第二个和所有后续的条件将是真实的,而你又以1, 0结束。 等等…

只是扩大马格努斯的答案。 如果你想象[dx,dy]作为一个向量,你实际上做的是一个90度的旋转 (或PI / 2)。

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

二维旋转

你的情况转换为:

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

由于sin(90) = 1cos(90) = 0我们将其简化为:

 x, y = -y, x 

在那里,你有它!

你正在使用的值似乎是一个不断旋转的单位向量 – 换句话说,一个相量 。 复数是坐标 ,所以:

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

假设我对dx的含义进行了解释,dy值是正确的,这会给你额外的灵活性,以后事情会变成你想要在每一步中旋转一些其他的量。

虽然我会与马格努斯的答案,这是另一种方法旋转一组值:

 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 

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

    Interesting Posts