如何使用迭代器 return 只有在 class 中以可迭代形式除以 3 的数字

How to return only numbers that divide by 3 in iterable form within class using iterator

我已经开始学习迭代器,我正在尝试自己实现它们。 我创建了一个 class,它应该以可迭代的形式提供从用户定义的开始到用户定义的结束范围内的数字。

现在我的代码如下所示:

class Can_be_divided_by_three:
  def __init__(self, start, end):
      self.start = start
      self.end = end

  def __iter__(self):
    return self

  def __next__(self):
    if self.start > self.end:
      raise StopIteration
    item = self.start
    self.start += 1
    if item % 3 == 0:
      return item

iterator = Can_be_divided_by_three(3, 8)
print(next(iterator))
print(next(iterator))
print(next(iterator))
print(next(iterator))

这是输出: 3个 None None 6

所以其实这个数不除以3也是None也有输出。 我是不是弄错了,如果是,如何改正?我实际上需要的是具有迭代功能的可被 3 整除的数字形式的唯一输出。

提前致谢。

如果 item % 3 == 0,您只有 return 项。 如果你想避免 Nones

,你应该在其他情况下 return 其他东西

按照你的逻辑 next 方法将 return 如果数字可以被 3 整除但是你没有指定如果数字是这个函数应该做什么不能被三整除,所以试试下面的代码:

class Can_be_divided_by_three:
  def __init__(self, start, end):
      self.start = start
      self.end = end

  def __iter__(self):
    return self

  def __next__(self):
    if self.start > self.end:
      raise StopIteration
    item = self.start
    self.start += 1
    if item % 3 == 0:
      return item
    else:
      return self.__next__()      

iterator = Can_be_divided_by_three(3, 8)
print(next(iterator))
print(next(iterator))
print(next(iterator))
print(next(iterator))

根据 John Coleman 的评论,你只需要找到 3 的最小倍数,你可以用这个实现同样的效果:

def Can_be_divided_by_three(start, end):
    while start % 3:
        start += 1
    
    for i in range(start, end, 3):
        yield i

您编写的代码是正确的,并且 return 数字在用户定义的范围内可以被 3 整除。您在输出中找到 None 的原因是 print() 函数。 尝试 运行 唯一的 next(iterator)。在 Jupyter 中,迭代器 returns 只有 3 & 6