中断for循环后如何重置指针

Posted

技术标签:

【中文标题】中断for循环后如何重置指针【英文标题】:How to reset pointer after break in for loop 【发布时间】:2020-02-25 15:26:36 【问题描述】:

我有一个名为 ObjectSet 的类,我希望它是可迭代的。它会在 for 循环后重置我的“指针”,但如果我打破循环则不会。

我的类 ObjectSet 具有附加代码中定义的方法。我遍历一个对象集,当我找到一个特定对象时,我打破了循环,但我不知道在这种情况下如何以一种好的方式重置指针。

class ObjectSet:

   def __init__(self,objects = None):
      if not objects: self.objects = []
      else: self.objects = objects
      self.pointer = 0
   def __iter__(self):
      return self
   def __len__(self):
      return len(self.objects)
   def __next__(self):
      cur_pointer = self.pointer
      if cur_pointer >= len(self):
         self.pointer = 0
         raise StopIteration
      self.pointer += 1
      return self.objects[cur_pointer]


objs = ObjectSet([1,2,3])
for obj in objs:
   if obj == 2:
      break
for obj in objs:
   print(obj)

代码只打印 3,但我希望它打印 1、2 和 3,就像它处理列表一样。

【问题讨论】:

建议的重复***.com/questions/21665485/… 的答案正是这个问题中提供的代码...... 感谢您指出重复,我错过了。 我不是要告诉你有重复的;恰恰相反。有人用上面的链接作为重复的链接结束了你的问题。我重新打开它是因为 answer 存在您的 question (并且不适用于您的情况)。 【参考方案1】:

你可以实现iterator pattern。

但鉴于您的基本数据结构已经支持迭代,您可以这样做:

def __iter__(self):
    return iter(self.objects)

(并从您的课程中删除 __next__ 方法和 self.pointer)。

您的设计问题在于您的类ObjectSet 的每个实例只有一个self.pointer。但正如您注意到只有返回的迭代器应该记住下一个位置。这就是迭代器模式将为您做的事情。

【讨论】:

以上是关于中断for循环后如何重置指针的主要内容,如果未能解决你的问题,请参考以下文章

如何将值添加到数组中而不将其在for循环外重置为0

使用基于范围的 for 循环遍历指针列表

JAVA中的for循环运行一次后如何停止,但是还可以在输入数字后继续运行?

如何重置对象循环“计数器”?

for循环与forEach循环的区别

列表未在 for 循环中重置