有没有办法写这些如果更好?
我需要在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
,否则在改变它们之后你会继续testingdx
和dy
。 如果他们是1
和0
,那么你所有的条件将是真实的 ,他们最终也是一样的! 如果它们以0
和1
开始,那么第二个和所有后续的条件将是真实的,而你又以1, 0
结束。 等等…
只是扩大马格努斯的答案。 如果你想象[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
在那里,你有它!
你正在使用的值似乎是一个不断旋转的单位向量 – 换句话说,一个相量 。 复数是坐标 ,所以:
# 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
否则它将永远不会结束。