【问题标题】:Python Program Giving me StopIterationPython 程序给我 StopIteration
【发布时间】:2021-12-22 06:27:24
【问题描述】:

我做了一个函数:generatesequence(如下图)

def generatesequence(start: float, itera: float = 1, stop: float = None):
    """
    Generate a sequence, that can have a stopping point, starting point.
    """

    __num = start

    # if sequence has a stopping point
    if stop != None:
        # if stop is negative
        if stop < 0:
           # while num is greater than stop (0 < 5, but 0 > -5)
            while __num >= stop:
                # yield __num variable (yield = return without exiting function)
                yield __num
                # add iter to __num
                __num += itera

        else:
            while __num <= stop:
                yield __num
                __num += itera
    else:
        # if sequence has no stopping point, run forever
        while True:
            yield __num
            __num += itera

我也做了一个序列类(如下图)

class Sequence:
  def __init__(self, start, itera, stop):
    self.sequence = generatesequence(start, itera, stop)
    self.sequencelength = iterlen(self.sequence)
    print(self.sequencelength)

 def printself(self):
    for i in range(self.sequencelength):
      print(next(self.sequence))

但是,当我在 Sequence 实例上运行 printself 时,它给了我一个 StopIteration 错误。我该如何解决这个问题?

【问题讨论】:

  • 代替 For i in range(self.sequencelength),使用 for i in self.sequence

标签: python compiler-errors generator


【解决方案1】:

您无需使用生成器执行此操作,只需执行以下操作:

 def printself(self):
    for i in self.sequence:
      print(i)

这样就不需要事先计算生成器的长度

【讨论】:

  • 我已将新函数复制粘贴到我的班级中,但它不会打印任何内容
【解决方案2】:

计算生成器的长度违背了使用生成器的全部目的。它还解释了 StopIteration。

与列表或某些数据结构占用 O(n) 内存空间不同,生成器占用 O(1) 空间,并且如果不逐个迭代它就无法知道长度。

通过计算长度,您将生成器的迭代器从头移动到尾,现在您的迭代器指向 StopIteration。

现在当您之后访问生成器时,它会返回 StopIteration。

实际上,生成器等的全部目的是为您知道最多迭代一次的可迭代对象节省内存空间。您不能在生成器上进行两次或更多次完整迭代。为此,请事先在生成器上使用列表函数并将值保存在列表或类似数据结构中。或者只是在它用完后重新创建生成器(=迭代)。

简而言之,要修复错误,请删除它在 init 方法中计算生成器长度的行。并使用 for 循环

"for i in generator_name:"

语法

或者,您可以创建一个生成生成器的方法,并随时随地调用它来重新创建生成器

【讨论】:

    猜你喜欢
    • 2023-04-09
    • 2014-09-25
    • 1970-01-01
    • 2013-02-20
    • 2018-10-14
    • 2016-05-29
    • 2018-03-26
    • 2017-12-27
    • 2013-12-05
    相关资源
    最近更新 更多