gpt4 book ai didi

python - 你能跳到循环中的第 n 次迭代吗?

转载 作者:行者123 更新时间:2023-12-04 00:34:58 24 4
gpt4 key购买 nike

42 -> for i in range(n):
43 foo(i)

我在这里,在 pdb session 的中间。我想用 i = k 跳转到循环迭代, 不评估 foo(i)i < k , 然后继续评估 foo(i)i > k .如果我向前走一条线
42    for i in range(n):
43 -> foo(i)

套装 i = k , 和 continue ,然后 i在下一次迭代时回到 1。我可以转到 k + 1反而?

最佳答案

你不能“向前跳跃”和向后跳跃,不。您只能按照写入的方式执行循环;进入迭代 k您必须通过所有中间步骤。这是因为 Python 无法知道状态是否会在迭代之间发生根本性的变化,您不能只是决定跳过那里的迭代。

您始终可以在上下文中执行单个表达式。您可以运行 foo(k)并观察返回值。你甚至可以操纵很多状态。您只是无法访问 for 使用的迭代器对象。跳过。

如果在运行调试器之前更改被测代码是一个选项,您可以与 for 共享迭代器。环形:

r = range(n)
it = iter(r)
for i in it:
foo(i)

现在你可以提前 it稍后(例如使用 next(it) )。问题是你不能像那样倒带迭代器。

下一步是生成一个可以重绕的自定义迭代器:
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会愉快地跟随。这仅适用于序列,而不仅仅是任何可迭代的。

演示:
$ 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:

关于python - 你能跳到循环中的第 n 次迭代吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25668194/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com