Beginners guide to Iterator, Iteration and Iterable in Python
Tags: python, programming, tutorial, beginners
Published: 2021-05-29 12:25:22

# Introduction
In programming iterable, iterator and iteration are pretty familiar words and one can have much confusion explaining and understanding these pretty common topics. Let's demystify them one by one. 

# Iterable

The natural language definition of *Iterable* is *[capable of being repeated or iterated](https://www.thefreedictionary.com/Iterable)*. 
However, the pythonic definition of **iterator** is an object that implements these two magic methods: **`__iter__`** and **`__getitem__`**.

The **`__iter__`** method of **iterable** returns an **iterator**,  which we will see next and similarly the **`__getitem__`** method takes an argument or key item from its sequences starting index zero and until the index is no longer valid and python raises an exception called [IndexError](https://docs.python.org/3/library/exceptions.html#IndexError). The ` __getitem__ ` method is used mostly for index-based lookup over the collections.

In python default types: `list` & `strings` have`__iter__` &  **`__getitem__`** implemented and hence we can refer them as an iterable.

For a more concise visual representation let's assume a single row bookshelf where there are  7 different books. 

![image.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1622285248628/lnQ7CAlJQ.png)

On this bookshelf, we can go through each book one by one, also we can change order of the books, can swap the places,  hence we can consider this bookshelf as an **object**. But as a reader, I can read only one book at a time. 
So, it can be clearly seen this bookshelf can be considered iterable from what we have discussed to this point.



# Iterator
In programming, an iterator is an object that let us travel through the Iterable objects. This iterator object remembers where it is during the process of travelling. 

In python, an iterator is an object with a `__next__` method implemented in it.  The 
`__next__` method returns the next value while traversing(travelling through) the iterable object sequence starting from index zero of the iterable. After each call, the `__next__` method updates its state to point to the next object in the iterable sequence. And when the travelling process is completed, it raises the **StopError** exception.



For a visual representation, let's assume you have a toy laser light that you can use to point to the book sequentially to read through them one by one, during this process to take out the first book you first point your toy laser light to the first book in the bookshelf, you take out that book and while doing so the laser focus points to next book in the sequence and so on until going through them one by one completes. 

![image.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1622287169083/nPjKU3cNj.png)

```python
>>> bookshelf = ['The Diary of a young girl', 'Crime and punishment', 'Romeo and Juliet', ...] #7 books
>>> flashlight  = iter(bookshelf)
>>> next(flashlight)
The Diary of a young girl
>>> next(flashlight)
Crime and punishment
```

In python, the `for` loop, `map` and list comprehension automatically call this `next` method.

# Iteration
The [Merriam Webster](https://www.merriam-webster.com/dictionary/iteration) dictionary defines iteration as: 
 - *the repetition of a sequence of computer instructions a specified number of times or until a condition is met— compare RECURSION*
 - *one execution of a sequence of operations or instructions in an iteration*.

From the above bookshelf analogy, we can say the process of repeating through book one by one can be referred to as an iteration. 

In programming, while doing iteration the same block of code is repeated every time. We use loops to achieve iteration that basically executes instruction or sequence of instruction repeatedly.

# Pythonic Conclusion
**Iterable**: list, strings, and any objects that have implemented `__getitem__` and `__iter__` methods.

**Iterator**: Use of `iter()` function on an iterable gives iterator object, Iterator has __next__ method in it. This iterator object remember where it is during the iteration

**Iteration**: The use of `for` loop `while` loop or even `list comprehension`. 
Please leave an example in the comment box :D 

# Reference
1. [Iterator](https://docs.python.org/3/tutorial/classes.html#iterators)
2. [Iterator Types](https://docs.python.org/dev/library/stdtypes.html#iterator-types)
3. [Iterator, iterators and Iterations](https://stackoverflow.com/questions/9884132/what-exactly-are-iterator-iterable-and-iteration)



> Finally, If you learned something from this article, please share it with your friends.

> You may also follow me on  [LinkedIn](https://www.linkedin.com/in/geeksambhu/)  and  [Twitter](https://twitter.com/geeksambhu) .