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

标签 python iterator generator

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

类似于:

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

do_stuff()

for val in list:
    continue_doing_stuff(val)

速度很重要,考虑的列表非常大。因此,保存对象并再次遍历整个列表直到找到保存的元素不是一种选择。如果不为列表编写显式迭代器类,这是否可能?

最佳答案

__iter__ 方法在您进入带有对象的 for 循环时被调用,返回一个迭代器。我们通常不会保留指向迭代器的名称,但如果这样做,我们可以停止迭代,做其他事情,然后恢复迭代。

获取迭代器对象的最佳方法是使用内置的 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

关于python - 有没有办法记住 python 迭代器中的位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21594302/

相关文章:

Java - 将迭代器与数组一起使用

javascript - 迭代 jQuery 集合而不必重建 jQuery 对象

python - 如何在 Keras 中使用 fit_generator() 来平衡数据集?

python - 函数和生成器函数的动态调用(python)

python - 如何在 python 中使用带有元组的生成器表达式

python - 在 python 中使用 "With open"写入另一个目录

python - 列表理解 - Python 2.7

python - 使用 IN 运算符在 pandas.Series 中查找字符串

python - 两个 3D 张量之间的点积

c++ - 如何从 C++ 中的迭代器中检索值类型?