如何在python中查询迭代器而不改变其预查询状态

时间:2016-08-10 06:17:04

标签: python oop iterator

我构建了一个可迭代对象A,它包含其他对象的列表B.如果在for循环中使用对象A时标记为坏,我希望能够自动跳过列表中的特定对象B. / p>

class A():
  def __init__(self):
    self.Blist = [B(1), B(2), B(3)] #where B(2).is_bad() is True, while the other .is_bad() are False

  def __iter__(self):
    nextB = iter(self.Blist)
    #if nextB.next().is_bad():
    #   return after skip
    #else:
    #   return nextB

但是,我无法弄清楚如何编写上面伪代码中注释的条件,而不跳过迭代查询(else子句失败)

谢谢!

2 个答案:

答案 0 :(得分:1)

怎么样:

def __iter__(self):
    nextB = iter(self.Blist)
    for b_obj in nextB:
        if b_obj.is_bad():
            yield b_obj

简化示例:

class B:
    def __init__(self, cond):
        self.cond = cond

    def is_bad(self):
        return self.cond

class A:
  def __init__(self):
    self.Blist = [B(True), B(False), B(True)]

  def __iter__(self):
    nextB = iter(self.Blist)
    for b_obj in nextB:
        if b_obj.is_bad():
            yield b_obj

a = A()
for x in a:
    print(x.is_bad())

>> True
   True

答案 1 :(得分:1)

您可以使用生成器功能:

  def __iter__(self):
      for item in self.Blist:
          if not item.is_bad():
              yield item

生成器函数由关键字yield标记。生成器函数返回一个生成器对象,它是一个迭代器。它将暂停执行yield语句,然后在调用例程调用interator上的next时继续处理。