进入for循环后如何重置指针
How to reset pointer after break in for loop
我有一个名为 ObjectSet 的 class,我希望它是可迭代的。它会在 for 循环后重置我的 "pointer" 但如果我中断循环则不会。
我的 class 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,就像处理列表一样。
您可以实施 iterator pattern。
但鉴于您的基本数据结构已经支持迭代,您可以这样做:
def __iter__(self):
return iter(self.objects)
(并从 class 中删除 __next__
方法和 self.pointer
)。
您的设计存在问题,您的 class ObjectSet
每个实例只有一个 self.pointer
。但是正如您只注意到迭代器一样,您 return 应该记住下一个位置。这就是迭代器模式将为您做的。
我有一个名为 ObjectSet 的 class,我希望它是可迭代的。它会在 for 循环后重置我的 "pointer" 但如果我中断循环则不会。
我的 class 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,就像处理列表一样。
您可以实施 iterator pattern。
但鉴于您的基本数据结构已经支持迭代,您可以这样做:
def __iter__(self):
return iter(self.objects)
(并从 class 中删除 __next__
方法和 self.pointer
)。
您的设计存在问题,您的 class ObjectSet
每个实例只有一个 self.pointer
。但是正如您只注意到迭代器一样,您 return 应该记住下一个位置。这就是迭代器模式将为您做的。