在python中使用迭代器?

在python中使用迭代器?,python,Python,我刚刚学习了Python中的迭代器,但是我很难实现它们 我正在尝试编写一个类,以使此循环工作: odds = OddNumbers(13) for i in odds: print(i) 我想写一个iter()函数和一个next()函数来实现这一点 到目前为止,我已经: class OddNumbers: def __init__(self, number): self.number = number def __iter__(self

我刚刚学习了Python中的迭代器,但是我很难实现它们

我正在尝试编写一个类,以使此循环工作:

  odds = OddNumbers(13)
  for i in odds:
      print(i) 
我想写一个iter()函数和一个next()函数来实现这一点

到目前为止,我已经:

class OddNumbers:

    def __init__(self, number):
        self.number = number

    def __iter__(self):
        return self

    def __next__(self):
        current = self.number
        if self.number%2 == 0:
            return current
        else:
            raise StopIteration
但目前这一切都没有回报。我希望输出是

1
3
5
7
9
11
13

帮助?

您的对象需要跟踪其状态,并在调用
\uuuu next\uuuu
时对其进行更新

class OddNumbers(object):
    def __init__(self, number):
        self.current = ...
        self.number = number

    def __iter__(self):
        return self

    def __next__(self):
        # Update self.current
        # If the limit has been reached, raise StopIteration
        # Otherwise, return something

您需要另一个变量来跟踪当前编号:

def __init__(self, number):
    self.number = number
    self.current = 1
然后,您需要将其与结束数字进行比较,并可能增加它:

def __next__(self):
    if self.current > self.number:
        raise StopIteration
    current = self.current
    self.current += 2
    return current

可能有一种更干净的方法可以做到这一点,但这里有一个简单的方法:

class OddNumbers:

    def __init__(self, number):
        self.number = number

    def __iter__(self):
        self.current = self.number
        return self

    def __next__(self):
        if self.current > 0:
            if self.current % 2 == 0:
                self.current -= 1
            self.current -= 1
            return self.current + 1
        raise StopIteration

这将为您提供一个类似迭代器的对象,它提供偶数或奇数。但是,它不能满足for循环语义,因为它不是真正的迭代器

class NumberIterator(object):
    """Returns simple even/odd number iterators."""
    def __init__(self, current):
        self.current = current
    def next(self):
        self.current += 2
        return self.current
    @classmethod
    def getOddIterator(cls):
        return cls(-1) # start at 1
    @classmethod
    def getEvenIterator(cls):
        return cls(0) # start at 2


    odd_numbers = NumberIterator.getOddIterator()
    even_numbers = NumberIterator.getEvenIterator()

    odd_numbers.next() # Returns 1
    odd_numbers.next() # Returns 3

你想干什么?您只有一个元素。为什么需要将该类设置为iterable?示例代码应该打印哪些数字?如果以奇数开头,则
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。如果以偶数开头,它将只返回该数字。你的意思是让
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu!不过我现在已经编辑了它。在您的情况下,
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
将在第一个循环中引发异常,因此迭!这解决了我的问题!在某个阶段,我确实有另一个变量来跟踪迭代次数,除了我没有用init方法初始化它,我只是在下一个阶段引入了它。再次感谢你!你不应该把全部答案告诉OP,这并不能教会他们任何东西。@augurar,OP表现出了努力,并发布了真实的代码,所以答案是正确的。评论显示他从中吸取了教训。@BrentWashburne你刚刚告诉了他答案。所以他知道了正确的答案。干得好,我想。