如何使用迭代器在类中以可迭代的形式仅返回除以 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

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

这是输出: 3 没有任何 没有任何 6

所以实际上即使数字没有被3除并且它是None也是有输出的。 我是否弄错了,如果是,如何正确处理?实际上,我只需要具有迭代功能的可被 3 整除的数字形式的输出

提前致谢。

解决方法

根据您的逻辑 next 如果数字可以被 3 整除,则方法将返回数字,但是您没有指定如果数字不能被 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
,

您仅在 item % 3 == 0 时返回项目。 如果您想避免 Nones

,您应该在其他情况下返回其他内容 ,

您编写的代码是正确的,将返回用户定义范围内可被 3 整除的数字。您在输出中找到 E/MediaPlayerNative: attachNewPlayer called in state 16 D/AndroidRuntime: Shutting down VM E/AndroidRuntime: FATAL EXCEPTION: main Process: com.exampl.sujood,PID: 19814 java.lang.IllegalStateException at android.media.MediaPlayer._setDataSource(Native Method) at android.media.MediaPlayer.setDataSource(MediaPlayer.java:1335) at com.exampl.sujood.showDua$2.onButtonClick2(showDua.java:181) at com.exampl.sujood.adapterR$myviewholder$1.onClick(adapterR.java:156) at android.view.View.performClick(View.java:8160) at android.view.View.performClickInternal(View.java:8137) at android.view.View.access$3700(View.java:888) at android.view.View$PerformClick.run(View.java:30236) at android.os.Handler.handleCallback(Handler.java:938) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:246) at android.app.ActivityThread.main(ActivityThread.java:8528) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:602) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1130) 的原因是 None 函数。 尝试运行唯一的 print()。在 Jupyter 中,迭代器只返回 3 & 6