你不能“向前跳”和向后跳,不。您只能按照编写的方式执行循环;进行迭代k
you'll have完成所有中间步骤。这是因为 Python 无法知道状态是否会在迭代之间发生根本改变,因此您不能直接决定跳过迭代。
您始终可以在上下文中执行单个表达式。你可以运行foo(k)
并观察返回值。您甚至可以操纵很多状态。您只是无法访问所使用的迭代器对象for
向前跳过。
如果更改被测代码before运行调试器是一个选项,您可以与for
loop:
r = range(n)
it = iter(r)
for i in it:
foo(i)
现在你could进步it
到稍后的时间点(与next(it)
, 例如)。问题是你不能像这样倒回迭代器。
下一步是生成一个自定义迭代器can倒带:
class ControllableIterator(object):
def __init__(self, sequence):
self.pos = 0
self.seq = sequence
def __iter__(self): return self
def next(self):
try:
val = self.seq[self.pos]
except IndexError:
raise StopIteration
self.pos += 1
return val
__next__ = next # Python 3
并使用它:
r = range(n)
it = ControllableIterator(r)
for i in it:
foo(i)
在这里你可以设置it.pos
到不同的值和for
会很高兴地跟随。这仅适用于序列,不仅仅是任何可迭代的。
Demo:
$ bin/python test.py
> /Users/mj/Development/venvs/stackoverflow-2.7/test.py(19)<module>()
-> r = range(100)
(Pdb) l
14
15 def foo(i):
16 print i
17
18 import pdb; pdb.set_trace()
19 -> r = range(100)
20 it = ControllableIterator(r)
21 for i in it:
22 foo(i)
23
[EOF]
(Pdb) n
> /Users/mj/Development/venvs/stackoverflow-2.7/test.py(20)<module>()
-> it = ControllableIterator(r)
(Pdb)
> /Users/mj/Development/venvs/stackoverflow-2.7/test.py(21)<module>()
-> for i in it:
(Pdb)
> /Users/mj/Development/venvs/stackoverflow-2.7/test.py(22)<module>()
-> foo(i)
(Pdb)
0
> /Users/mj/Development/venvs/stackoverflow-2.7/test.py(21)<module>()
-> for i in it:
(Pdb)
> /Users/mj/Development/venvs/stackoverflow-2.7/test.py(22)<module>()
-> foo(i)
(Pdb)
1
> /Users/mj/Development/venvs/stackoverflow-2.7/test.py(21)<module>()
-> for i in it:
(Pdb) it.pos = 50
(Pdb) n
> /Users/mj/Development/venvs/stackoverflow-2.7/test.py(22)<module>()
-> foo(i)
(Pdb)
50
> /Users/mj/Development/venvs/stackoverflow-2.7/test.py(21)<module>()
-> for i in it: