What exactly are iterator, iterable, and iteration?

前端 未结 13 1667
遥遥无期
遥遥无期 2020-11-21 05:27

What is the most basic definition of \"iterable\", \"iterator\" and \"iteration\" in Python?

I have read multiple definitions but I am unable to identify the exact m

相关标签:
13条回答
  • 2020-11-21 05:44

    An iterable is a object which has a __iter__() method. It can possibly iterated over several times, such as list()s and tuple()s.

    An iterator is the object which iterates. It is returned by an __iter__() method, returns itself via its own __iter__() method and has a next() method (__next__() in 3.x).

    Iteration is the process of calling this next() resp. __next__() until it raises StopIteration.

    Example:

    >>> a = [1, 2, 3] # iterable
    >>> b1 = iter(a) # iterator 1
    >>> b2 = iter(a) # iterator 2, independent of b1
    >>> next(b1)
    1
    >>> next(b1)
    2
    >>> next(b2) # start over, as it is the first call to b2
    1
    >>> next(b1)
    3
    >>> next(b1)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    StopIteration
    >>> b1 = iter(a) # new one, start over
    >>> next(b1)
    1
    
    0 讨论(0)
  • 2020-11-21 05:47

    Here's the explanation I use in teaching Python classes:

    An ITERABLE is:

    • anything that can be looped over (i.e. you can loop over a string or file) or
    • anything that can appear on the right-side of a for-loop: for x in iterable: ... or
    • anything you can call with iter() that will return an ITERATOR: iter(obj) or
    • an object that defines __iter__ that returns a fresh ITERATOR, or it may have a __getitem__ method suitable for indexed lookup.

    An ITERATOR is an object:

    • with state that remembers where it is during iteration,
    • with a __next__ method that:
      • returns the next value in the iteration
      • updates the state to point at the next value
      • signals when it is done by raising StopIteration
    • and that is self-iterable (meaning that it has an __iter__ method that returns self).

    Notes:

    • The __next__ method in Python 3 is spelt next in Python 2, and
    • The builtin function next() calls that method on the object passed to it.

    For example:

    >>> s = 'cat'      # s is an ITERABLE
                       # s is a str object that is immutable
                       # s has no state
                       # s has a __getitem__() method 
    
    >>> t = iter(s)    # t is an ITERATOR
                       # t has state (it starts by pointing at the "c"
                       # t has a next() method and an __iter__() method
    
    >>> next(t)        # the next() function returns the next value and advances the state
    'c'
    >>> next(t)        # the next() function returns the next value and advances
    'a'
    >>> next(t)        # the next() function returns the next value and advances
    't'
    >>> next(t)        # next() raises StopIteration to signal that iteration is complete
    Traceback (most recent call last):
    ...
    StopIteration
    
    >>> iter(t) is t   # the iterator is self-iterable
    
    0 讨论(0)
  • 2020-11-21 05:49

    In Python everything is an object. When an object is said to be iterable, it means that you can step through (i.e. iterate) the object as a collection.

    Arrays for example are iterable. You can step through them with a for loop, and go from index 0 to index n, n being the length of the array object minus 1.

    Dictionaries (pairs of key/value, also called associative arrays) are also iterable. You can step through their keys.

    Obviously the objects which are not collections are not iterable. A bool object for example only have one value, True or False. It is not iterable (it wouldn't make sense that it's an iterable object).

    Read more. http://www.lepus.org.uk/ref/companion/Iterator.xml

    0 讨论(0)
  • 2020-11-21 05:56

    I don’t know if it helps anybody but I always like to visualize concepts in my head to better understand them. So as I have a little son I visualize iterable/iterator concept with bricks and white paper.

    Suppose we are in the dark room and on the floor we have bricks for my son. Bricks of different size, color, does not matter now. Suppose we have 5 bricks like those. Those 5 bricks can be described as an object – let’s say bricks kit. We can do many things with this bricks kit – can take one and then take second and then third, can change places of bricks, put first brick above the second. We can do many sorts of things with those. Therefore this bricks kit is an iterable object or sequence as we can go through each brick and do something with it. We can only do it like my little son – we can play with one brick at a time. So again I imagine myself this bricks kit to be an iterable.

    Now remember that we are in the dark room. Or almost dark. The thing is that we don’t clearly see those bricks, what color they are, what shape etc. So even if we want to do something with them – aka iterate through them – we don’t really know what and how because it is too dark.

    What we can do is near to first brick – as element of a bricks kit – we can put a piece of white fluorescent paper in order for us to see where the first brick-element is. And each time we take a brick from a kit, we replace the white piece of paper to a next brick in order to be able to see that in the dark room. This white piece of paper is nothing more than an iterator. It is an object as well. But an object with what we can work and play with elements of our iterable object – bricks kit.

    That by the way explains my early mistake when I tried the following in an IDLE and got a TypeError:

     >>> X = [1,2,3,4,5]
     >>> next(X)
     Traceback (most recent call last):
        File "<pyshell#19>", line 1, in <module>
          next(X)
     TypeError: 'list' object is not an iterator
    

    List X here was our bricks kit but NOT a white piece of paper. I needed to find an iterator first:

    >>> X = [1,2,3,4,5]
    >>> bricks_kit = [1,2,3,4,5]
    >>> white_piece_of_paper = iter(bricks_kit)
    >>> next(white_piece_of_paper)
    1
    >>> next(white_piece_of_paper)
    2
    >>>
    

    Don’t know if it helps, but it helped me. If someone could confirm/correct visualization of the concept, I would be grateful. It would help me to learn more.

    0 讨论(0)
  • 2020-11-21 05:56

    Before dealing with the iterables and iterator the major factor that decide the iterable and iterator is sequence

    Sequence: Sequence is the collection of data

    Iterable: Iterable are the sequence type object that support __iter__ method.

    Iter method: Iter method take sequence as an input and create an object which is known as iterator

    Iterator: Iterator are the object which call next method and transverse through the sequence. On calling the next method it returns the object that it traversed currently.

    example:

    x=[1,2,3,4]
    

    x is a sequence which consists of collection of data

    y=iter(x)
    

    On calling iter(x) it returns a iterator only when the x object has iter method otherwise it raise an exception.If it returns iterator then y is assign like this:

    y=[1,2,3,4]
    

    As y is a iterator hence it support next() method

    On calling next method it returns the individual elements of the list one by one.

    After returning the last element of the sequence if we again call the next method it raise an StopIteration error

    example:

    >>> y.next()
    1
    >>> y.next()
    2
    >>> y.next()
    3
    >>> y.next()
    4
    >>> y.next()
    StopIteration
    
    0 讨论(0)
  • 2020-11-21 05:57

    Other people already explained comprehensively, what is iterable and iterator, so I will try to do the same thing with generators.

    IMHO the main problem for understanding generators is a confusing use of the word “generator”, because this word is used in 2 different meanings:

    1. as a tool for creating (generating) iterators,
      • in the form of a function returning an iterator (i.e. with the yield statement(s) in its body),
      • in the form of a generator expression
    2. as a result of the use of that tool, i.e. the resulting iterator.
      (In this meaning a generator is a special form of an iterator — the word “generator” points out how this iterator was created.)

    Generator as a tool of the 1st type:

    In[2]: def my_generator():
      ...:     yield 100
      ...:     yield 200
    
    In[3]: my_generator
    
    Out[3]: <function __main__.my_generator()>
    
    In[4]: type(my_generator)
    
    Out[4]: function
    

    Generator as a result (i.e. an iterator) of the use of this tool:

    In[5]: my_iterator = my_generator()
    In[6]: my_iterator
    
    Out[6]: <generator object my_generator at 0x00000000053EAE48>
    
    In[7]: type(my_iterator)
    
    Out[7]: generator
    

    Generator as a tool of the 2nd type — indistinguishable from the resulting iterator of this tool:

    In[8]: my_gen_expression = (2 * i for i in (10, 20))
    In[9]: my_gen_expression
    
    Out[9]: <generator object <genexpr> at 0x000000000542C048>
    
    In[10]: type(my_gen_expression)
    
    Out[10]: generator
    
    0 讨论(0)
提交回复
热议问题