Python:访问for循环中的迭代器对象

Python:访问for循环中的迭代器对象,python,for-loop,Python,For Loop,我想在循环中显式地使用循环迭代器。有没有比以下更好的方法: idx = iter(range(0, 10)) for i in idx: print i if i == 5: print "consuming %i in step %i" % (next(idx), i) Edit:我不知道是否有办法访问循环迭代器,而不是像我的示例中那样显式定义它 谢谢 您可以定义一个生成器来单独或成对地从迭代器生成元素。这使得for循环保持良好和简单,同时隔离了生成器中的过滤逻辑

我想在循环中显式地使用循环迭代器。有没有比以下更好的方法:

idx = iter(range(0, 10))

for i in idx:
   print i

   if i == 5:
      print "consuming %i in step %i" % (next(idx), i)
Edit:我不知道是否有办法访问循环迭代器,而不是像我的示例中那样显式定义它


谢谢

您可以定义一个生成器来单独或成对地从迭代器生成元素。这使得for循环保持良好和简单,同时隔离了生成器中的过滤逻辑

def my_filter(iterable):
    result=[]
    for i in iterable:
        result.append(i)
        if i==5:
            continue
        yield result
        result=[]        

idx = iter(range(0, 10))

for i in my_filter(idx):
    print i
导致

0
1
2
3
4
Consuming 5,6
7
8
9

next(idx)
有什么问题?它还不够明确和漂亮吗?@eumiro:如果
idx
还不是迭代器(例如列表),就不会。在迭代过程中使用迭代器的
下一个
也是非常罕见的做法。我强烈建议不要这样做,我担心的是循环的头部;通常人们会在范围(0,10)内看到类似于i的
——但是我无法访问迭代器对象…相关:也相关,并对其工作原理进行了更彻底的解释:我想使用所有元素;在某些情况下,我只需要在同一个迭代中使用它们。。。有时我正在迭代的元素需要成对使用,通常它们被视为“单个”。@MrPugh:您可以修改生成器(
my_filter
),以便它生成一个包含来自
idx
的单个元素或来自
idx
的多个元素的对象。理想情况下,
for循环
应该均匀地处理这些对象——它不应该关心对象是否包含来自
idx
的单个元素或多个元素。我已经修改了代码以显示我的意思。在上面,我只是使用一个列表来收集单个或成对的元素。根据您的问题,您可能希望使用其他容器,例如命名元组或dict,或者自定义类……我喜欢
my_filter
将生成我的配对;然而,我的实际代码要复杂一点,
my_filter
-循环中的
continue
将无法正常工作。所以我又回到了原来的问题:如何在同一个迭代中使用下一个元素。。。在我的初始示例中,可能显式创建迭代器对象并使用
next()
是我的方法。。。谢谢你的努力!我关心的是循环的头部。for循环的迭代器是以某种方式公开的吗?还是我必须像我(和你的)示例中那样显式地声明迭代器才能访问它?我看到,要求一个“更好”的方法通常不是很清楚……就我所知,没有办法直接访问循环迭代器;您需要显式地创建它,并事先保留一个副本。+1是一个很好的理由:您可以从迭代器中窃取更多的项,即使您在循环中。注意:您可能会得到一个StopIteration,它以一种明显干净的方式终止循环,但这可能会使您的程序逻辑处于不一致的状态。
0
1
2
3
4
Consuming 5,6
7
8
9