Difference between Python's Generators and Iterators

后端 未结 11 1218
谎友^
谎友^ 2020-11-22 05:20

What is the difference between iterators and generators? Some examples for when you would use each case would be helpful.

11条回答
  •  抹茶落季
    2020-11-22 05:25

    Generator Function, Generator Object, Generator:

    A Generator function is just like a regular function in Python but it contains one or more yield statements. Generator functions is a great tool to create Iterator objects as easy as possible. The Iterator object returend by generator function is also called Generator object or Generator.

    In this example I have created a Generator function which returns a Generator object . Just like other iterators, Generator objects can be used in a for loop or with the built-in function next() which returns the next value from generator.

    def fib(max):
        a, b = 0, 1
        for i in range(max):
            yield a
            a, b = b, a + b
    print(fib(10))             #
    
    for i in fib(10):
        print(i)               # 0 1 1 2 3 5 8 13 21 34
    
    
    print(next(myfib))         #0
    print(next(myfib))         #1
    print(next(myfib))         #1
    print(next(myfib))         #2
    

    So a generator function is the easiest way to create an Iterator object.

    Iterator:

    Every generator object is an iterator but not vice versa. A custom iterator object can be created if its class implements __iter__ and __next__ method (also called iterator protocol).

    However, it is much easier to use generators function to create iterators because they simplify their creation, but a custom Iterator gives you more freedom and you can also implement other methods according to your requirements as shown in the below example.

    class Fib:
        def __init__(self,max):
            self.current=0
            self.next=1
            self.max=max
            self.count=0
    
        def __iter__(self):
            return self
    
        def __next__(self):
            if self.count>self.max:
                raise StopIteration
            else:
                self.current,self.next=self.next,(self.current+self.next)
                self.count+=1
                return self.next-self.current
    
        def __str__(self):
            return "Generator object"
    
    itobj=Fib(4)
    print(itobj)               #Generator object
    
    for i in Fib(4):  
        print(i)               #0 1 1 2
    
    print(next(itobj))         #0
    print(next(itobj))         #1
    print(next(itobj))         #1
    

提交回复
热议问题