man*_*uel 38 python control-structure
我需要if用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
有谁能建议我更好/更好的方式来写这个?
kin*_*all 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第二个和后续条件,否则您将继续测试dx并dy在更改它们之后.如果他们1和0,然后所有的条件将是真实的,他们最终在年底一样!如果他们开始0,1然后第二个和所有后续条件都将成立,你再次结束1, 0.等等...
And*_*ues 31
只是扩展马格纳斯的答案.如果你想象[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
你有它!
Kar*_*tel 18
您正在使用的值似乎是一个连续旋转的单位矢量 - 换句话说,相量.复数是坐标,所以:
# at initialization
phase = 1
# at the point of modification
phase *= 1j
dx, dy = phase.real, phase.imag
假设我的DX的含义解释,DY值是正确的,这给你的情况下,额外的灵活性,事实证明后来,你想在每一步其他一些量旋转.
虽然我会选择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否则它将永远不会结束.