为什么循环未命中检查条件

时间:2017-04-05 11:58:01

标签: python turtle-graphics

我遇到一个小环,让乌龟在遇到广场角落后转90度。第一个循环很好,但Python似乎忘记在下一个循环中检查条件。

我开始画画

t.setpos(-300,300)

这适用于第一个循环:

for i in range(4):
t.forward(600)
print(t.pos())
if t.pos() > (300,300):
    t.right(90)
elif t.pos() > (300,-300):
    t.right(90)
elif t.pos() > (-300, -300):
    t.right(90)
elif t.pos() > (-300,300):
    t.right(90)

但是,当我将range()增加到5时,代码会忘记检查elif t.pos() > (-300,300):t.right(90),而是Python继续将t.forward(600)绘制到此位置:

  

( - 300.00,900.00)

for i in range(5):
t.forward(600)
print(t.pos())
if t.pos() > (300,300):
    t.right(90)
elif t.pos() > (300,-300):
    t.right(90)
elif t.pos() > (-300, -300):
    t.right(90)
elif t.pos() > (-300,300):
    t.right(90)

任何想法为什么Python忘记检查这样的条件?不知怎的,我觉得我在某个地方做错了。

2 个答案:

答案 0 :(得分:1)

这是我的解决方案,它可能效率不高,但它可以工作,不知怎的......

if myturtle[count].xcor() > 300 and myturtle[count].heading() == 0:
   myturtle[count].right(90)
if myturtle[count].ycor() < -300 and myturtle[count].heading() == 270:
   myturtle[count].right(90)
if myturtle[count].xcor() < -300 and myturtle[count].heading() ==180:
   myturtle[count].right(90)
if myturtle[count].ycor() > 300 and myturtle[count].heading() == 90:
   myturtle[count].right(90)

答案 1 :(得分:1)

看似简单的解决方法是这种比较是落后的:

elif t.pos() > (-300, 300):

它应该是:

elif t.pos() < (-300, 300):

range(4)情况下没有看到它的原因是循环在执行之前退出。在range(5)情况下,它最终执行,反向比较导致失败。

但是,此代码存在严重问题,在您构建时会出现这些问题。虽然您的调试print(t.pos())语句显示:

(300.00,300.00)
(300.00,-300.00)
(-300.00,-300.00)
(-300.00,300.00)
(-300.00,900.00)

真正发生的事情是:

(300.0, 300.0)
(300.00000000000006, -300.0)
(-299.99999999999994, -300.00000000000006)
(-300.00000000000006, 299.99999999999994)
(-300.00000000000017, 900.0)

您没有看到这一点的原因是因为t.pos()没有返回通用tuple,它会返回tuple {@ 1}}的特化,其中包含Vec2D通过仅显示两位精度数字来掩盖浮点模糊性的自己的repr()方法:

 def __repr__(self):
        return "(%.2f,%.2f)" % self

您可能希望您的条款按顺序触发,但它们不会:

职位:(300.0, 300.0)

跳过第二个条款:elif t.pos() > (300,-300):

职位:(300.00000000000006, -300.0)

跳过第一个条款:if t.pos() > (300,300):

职位:(-299.99999999999994, -300.00000000000006)

跳过第三个条款:elif t.pos() > (-300, -300):

和职位:

(-300.00000000000006, 299.99999999999994)
(-300.00000000000017, 900.0)

不要绊倒任何条款。添加一些print()语句以说服自己。