【问题标题】:Creating an iterator that takes in a list and reverses it创建一个接受列表并将其反转的迭代器
【发布时间】:2021-08-04 20:25:54
【问题描述】:

我正在创建一个迭代器,它接收一个列表并将其反转。出于某种原因,当我运行我的代码时,我不断得到“计数”未定义。一切似乎都缩进得很好,或者至少我认为。一些帮助将非常感激

这是我的代码:

class RevIter():
    def __iter__(self):
        self.nums = ( [1, 2 ,3, 4, 5] )
        self. index = 0
        return self
    def __next__(self):
         if self.index <= 6:      
            count = self.nums[self.index]
            return count
         else:
            raise StopIteration
        
            
for i in RevIter():
    print(count.reverse())

【问题讨论】:

  • 为什么循环中的类外有count
  • 另外,你永远不会改变,index in __next__ 所以你的迭代器每次都会给你相同的值。
  • 请注意,您的迭代器不接受任何参数。您可能想在__init__ 中接受nums
  • 如果你想反转列表,你需要从len() - 1开始索引并下降1直到0
  • 不管怎样,这个错误很简单... 没有定义count...为什么你认为应该有?你认为count 指的是什么?

标签: python list iterator


【解决方案1】:

您正在尝试打印在您的 for 循环中未即时成像的 count 变量!

【讨论】:

    【解决方案2】:

    在您的 for 循环中,您正在打印 (count.reverse())。这里你告诉python有一个叫count的对象,但是没有这个对象。

    【讨论】:

      【解决方案3】:

      创建一个合适的可迭代类

      • 将初始化移到__init__
      • __next__ 方法中更改self.index,如果您不移动它,您将获得一个无限迭代,产生始终相同的值
      • 只需在主代码中使用i
      class RevIter:
          def __init__(self):
              self.nums = [1, 2, 3, 4, 5]
              self.index = len(self.nums) - 1
      
          def __iter__(self):
              return self
      
          def __next__(self):
              if 0 <= self.index < len(self.nums):
                  count = self.nums[self.index]
                  self.index -= 1
                  return count
              else:
                  raise StopIteration
      
      for i in RevIter():
          print(i)
      
      5
      4
      3
      2
      1
      

      前向迭代

      class RevIter:
          def __init__(self):
              self.nums = [1, 2, 3, 4, 5]
              self.index = 0
      
          def __next__(self):
              if 0 <= self.index < len(self.nums):
                  count = self.nums[self.index]
                  self.index += 1
                  return count
              else:
                  raise StopIteration
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-10-20
        • 1970-01-01
        • 1970-01-01
        • 2018-03-16
        • 1970-01-01
        • 1970-01-01
        • 2016-07-24
        • 2019-04-30
        相关资源
        最近更新 更多