【问题标题】:simple Iteration on pythonpython上的简单迭代
【发布时间】:2023-04-01 20:00:02
【问题描述】:

我的目标是编写一个类并仅使用__iter__next 方法来查找数字的除数。这是我写的:

class Divisors(object):
    def __init__(self, integer):
        self.integer = integer
    def __iter__(self):
        self.divisor = 1
        return self
    def next(self):
        div = 0
        if self.divisor >= self.integer:
            raise StopIteration
        else:
            if self.integer % self.divisor == 0:
                div = self.divisor
            self.divisor += 1
        return div

当我检查时:

for i in Divisors(6):
    print i

我明白了

1
2
3
0
0

而不是1 2 3 6

但我不确定是否应该使用 print 代替上面使用的 div。关于我在这里做错了什么的任何提示?

【问题讨论】:

  • 与您的问题无关,但Divisors 真的 不应该是一个类。作为一个函数,它会更有意义。
  • 为什么 4 是 6 的除数?
  • 阅读ericlippert.com/2014/03/05/how-to-debug-small-programs 了解调试代码的一些技巧。
  • @chrisz 错字抱歉,已编辑。谢谢你的评论。
  • @Aran-Fey 谢谢,但实际上重点是我明天有一个测试,它会涵盖类和方法,所以我试图想一些我可以练习的简单示例。跨度>

标签: python python-2.7 loops methods


【解决方案1】:

每当在这种情况下进行调试时,您都应该逐行进行。您编写的代码不仅仅打印数字的除数。

如果您仔细查看 next 方法,它首先将 div 初始化为 0。然后如果除数大于或等于整数,则停止循环。否则,如果整数可以被除数整除,它会修改div,然后返回div(修改后的或原始的0)。

按照上述逻辑,只要整数不能被除数整除,您的代码就会返回 0。一旦循环执行 5 次(整数 = 6),它就会停止。因此输出1 2 3 0 0。在前三个迭代中,除数成功地除以整数(除数 = 1、2、3),而在接下来的两个迭代中,除数不成功(除数 = 4 和 5)。当除数等于整数(在本例中为 6)时,循环停止而不返回任何内容。

这是产生所需输出的 ​​python2 的工作代码

class Divisors(object):
def __init__(self,integer):
    self.integer = integer

def __iter__(self):
    self.divisor = 0
    return self

def next(self):
    div = 0

    self.divisor += 1
    while self.integer >= self.divisor and self.integer % self.divisor != 0:
        self.divisor += 1

    if self.divisor > self.integer:
        raise StopIteration

    div = self.divisor
    return div


for i in Divisors(6):
    print i

产生的输出是:

1
2
3
6

【讨论】:

  • 非常感谢先生,我也已设法修复它!爱您耐心等待详细的审查。
【解决方案2】:

您需要在 next() 方法中使用 while 循环。我们可以添加它并简化您的逻辑:

class Divisors(object):
    def __init__(self, integer):
        self.integer = integer

    def __iter__(self):
        self.divisor = 1
        return self

    def next(self):

        while self.integer % self.divisor != 0:

            self.divisor += 1

            if self.divisor > self.integer:
                raise StopIteration

        self.divisor += 1

        return self.divisor - 1

【讨论】:

    猜你喜欢
    • 2011-05-25
    • 1970-01-01
    • 2011-08-11
    • 2021-11-15
    • 2017-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多