我有一个运行16次的循环,因为它读取的文件中有16行,我正在使用循环来读取时间戳的前两个字符。但我无法弄清楚如何保持n变量达到17.我试图使用条件将n限制为16但无济于事。这是我的整个功能,我正试图在http://calicoproject.org/Calico_Python_GIS详细描述飓风艾琳的路径:
def drawIrene(win):
line = Line()
n = 0
for (x,y) in dots:
time_stamp[n] = time_stamp[n][:2]
time_stamp[n+1] = time_stamp[n+1][:2]
time1 = abs(int(time_stamp[n]) - 12)
time2 = abs(int(time_stamp[n+1]) - 12)
wait_time = abs(int(time1) - int(time2))
x, y = ll2xy(x, y)
c = Circle(Point(x, y), int(eye_size[n]))
line.append(Point(x,y))
c.fill = Color(255, 255, 0, 62)
c.draw(win)
t = Polygon((x, y), (x+10, y+5), (x+int(movement_speed[n]), y-int(movement_speed[n])/2))
t.fill = Color("orange")
t.draw(win)
print(time1)
print(time2)
print()
#print (wait_time)
wait(wait_time)
if n < len(dots):
n += 1
else:
break
line.draw(win)
line.border = 2
答案 0 :(得分:1)
问题是您要循环两个长度相同的序列dots
和time_stamp
。但是,您在time_stamp
序列中向前看,访问当前项和下一项以计算wait_time
值。这导致您的IndexError
在最后一次循环中通过循环,因为n+1
索引指向列表的末尾。
有几种不同的方法可以解决这个问题。您可以修改数据结构,以便dots
只有一个元素,或者time_stamp
还有一个元素。或者你可以简单地循环一次,如评论中所建议的那样。
但我认为最好的解决方案是更改循环中的逻辑,以便在第一个或最后一个循环中以不同方式计算wait_time
。例如,您可能选择在最后一个周期没有延迟。
这里有一些代码可以做到这一点。特殊情况是最后一次传递,其中n
等于len(time_stamp)-1
,并且在这种情况下简单地将wait_time
设置为零。请注意,我正在n
循环中的内置enumerate
函数生成for
,因此无需将其初始化为零或手动更新:
for n, (x, y) in enumerate(dots):
if n < len(time_stamp)-1:
time_stamp[n] = time_stamp[n][:2]
time_stamp[n+1] = time_stamp[n+1][:2]
time1 = abs(int(time_stamp[n]) - 12)
time2 = abs(int(time_stamp[n+1]) - 12)
wait_time = abs(int(time1) - int(time2))
else: # special case n >= len(time_stamp)-1, which should be the last pass
wait_time = 0
x, y = ll2xy(x, y)
c = Circle(Point(x, y), int(eye_size[n]))
line.append(Point(x,y))
c.fill = Color(255, 255, 0, 62)
c.draw(win)
t = Polygon((x, y), (x+10, y+5),
(x+int(movement_speed[n]), y-int(movement_speed[n])/2))
t.fill = Color("orange")
t.draw(win)
wait(wait_time)