Using an iterator in python?

前端 未结 4 911
[愿得一人]
[愿得一人] 2021-01-21 16:05

I have just learned about iterators in Python however I am having a hard time implementing them.

I am trying to write a class to so that this loop works:



        
相关标签:
4条回答
  • 2021-01-21 16:22

    There is probably a much cleaner way of doing this, but here is a quick stab:

    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
    
    0 讨论(0)
  • 2021-01-21 16:22

    This will give you an iterator-like object which provides even or odd numbers. However, it won't satisfy your for loop semantics as it is not a true iterator.

    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
    
    0 讨论(0)
  • 2021-01-21 16:33

    Your object needs to keep track of its state and update it when __next__ is called.

    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
    
    0 讨论(0)
  • 2021-01-21 16:35

    You need another variable to track the current number:

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

    Then you need to compare it with the ending number, and maybe increment it:

    def __next__(self):
        if self.current > self.number:
            raise StopIteration
        current = self.current
        self.current += 2
        return current
    
    0 讨论(0)
提交回复
热议问题