有没有办法记住python迭代器中的位置?

时间:2014-02-06 04:54:51

标签: python iterator generator

我想迭代一个可迭代的对象(比方说,一个列表)并在某个时刻离开,记住我离开的位置,以便在下次调用该对象的迭代器时继续。

类似的东西:

for val in list:
   do_stuff(val)
   if some_condition:
       break

do_stuff()

for val in list:
    continue_doing_stuff(val)

速度很重要,所考虑的清单非常大。因此,保存对象并在整个列表中再次迭代,直到找到保存的元素不是一个选项。如果没有为列表编写显式的迭代器类,这可能吗?

2 个答案:

答案 0 :(得分:7)

当您输入带有对象的for循环并返回迭代器时,将调用__iter__方法。我们通常不会将名称指向迭代器,但如果我们这样做,我们可以停止迭代,执行其他操作,然后继续迭代。

获取迭代器对象的最佳方法是使用内置iter函数:

a_list = ['a', 'b', 'c', 'd']
iter_list = iter(a_list)

for val in iter_list:
   print(val)                # do_stuff(val)
   if val == 'b':            # some_condition!
       break

print('taking a break')      # do_stuff()

for val in iter_list:
    print(val)               # continue_doing_stuff(val)

所示:

a
b
taking a break
c
d

iter(obj)只返回obj.__iter__()的结果,它应该是实现.__next__()方法的迭代器。

为每次迭代调用__next__方法,返回对象(在本例中为一个字符。)

如果您想自己调用__next__方法而不是通过for循环调用它,则应使用内置next函数:

a_list = ['a', 'b', 'c', 'd']
iter_list = iter(a_list)
print(next(iter_list))       # do_stuff(val)
print(next(iter_list))
print('taking a break')      # do_stuff()
print(next(iter_list))       # continue_doing_stuff(val)
print(next(iter_list))

打印:

a
b
taking a break
c
d

答案 1 :(得分:4)

您可以使用生成器执行此操作

def get_next(iterator):
    for item in iterator:
        yield item

my_list_iterator = get_next(my_list)

for val in my_list_iterator:
    do_stuff(val)
    if some_condition:
        break

do_stuff()

for val in my_list_iterator:
    continue_doing_stuff(val)