Iterator Method – Python Design Patterns

Iterator method is a Behavioral Design Pattern which allows us to traverse the elements of the collections without taking the exposure of in-depth details of the elements. It provides a way to access the elements of complex data-structure sequentially without repeating them.

According to GangOfFour, Iterator Pattern is used ” to access the elements of an aggregate object sequentially without exposing its underlying implementation”.

Following diagram depicts Linked List data structure.

Iterator-Method-Linked-List

Iterator-method-Linked-List

Problem Without using Iterator Method

Imagine you are creating an application for small kids which takes any valid alphabet as input and return all the alphabets up to that. When this application will be used only few times, it is okay to run For loop and While loop again and again but when the frequency of running increases this process becomes quite inefficient. So, we have to find a way in order to avoid these loops. This problem may become bigger when we will work on complex non-linear data structures like Trees, Graphs where traversing is not that simple as in an array.
The following diagram depicts the image of the Tree data structure.



Iterator-Method-Tree-Data-Structure

Iterator-Method-Tree-Data-Structure

Solution Using Iterator Method

Here we will discuss the solution for the above-described problem. It’s always handy for Python users to use Iterators for traversing any kind of data structure doesn’t matter they are linear or no-linear data structures. We have two options to implement Iterators in Python either we can use the in-built iterators to produce the fruitful output or explicitly we can create iterators with the help of Generators. In the following code, we have explicitly created the Iterators with the help of generators.

Note: Following code is the example of explicitly created Iterator method

filter_none

edit
close

play_arrow

link
brightness_4
code

""" helper method for iterator"""
  
def alphabets_upto(letter):
  
    """Counts by word numbers, up to a maximum of five"""
    alphabets = [chr(i) for i in range(65, 91)]
  
    for alpha in alphabets[:ord(letter)-65 + 1]:
  
        yield alpha
  
"""main method"""
if __name__ == "__main__":
  
    alphabets_upto_K = alphabets_upto('K')
    alphabets_upto_M = alphabets_upto('M')
  
    for alpha in alphabets_upto_K:
        print(alpha, end = " ")
  
    print()
  
    for alpha in alphabets_upto_M:
        print(alpha, end = " ")

chevron_right


Note: Following code is the example of using in-built iterator method

filter_none

edit
close

play_arrow

link
brightness_4
code

"""utility function"""
def inBuilt_Iterator1():
      
    alphabets = [chr(i) for i in range(65, 91)]
      
    """using in-built iterator"""
    for alpha in alphabets:
        print(alpha, end = " ")
    print()
  
"""utility function"""
def inBuilt_Iterator2():
      
    alphabets = [chr(i) for i in range(97, 123)]
      
    """using in-built iterator"""
    for alpha in alphabets:
        print(alpha, end = " ")
    print()
  
  
"""main method"""
if __name__ == "__main__" :
      
    """call the inbuiltIterators"""
    inBuilt_Iterator1()
    inBuilt_Iterator2()

chevron_right


Class Diagram

Following is the class diagram for the Iterator Method

Iterator-Method-Class-Diagram

Iterator-Method-Class-Diagram

Advantages

  • Single Responsibility Principle: It’s really easy to extract the huge algorithms into the separate classes in Iterator method.
  • Open/Closed Principle: Passing the new iterators and collections into the client code does not break the code can easily be installed into it.
  • Easy to use Interface: It makes the interface really simple to use and also supports the variations in the traversal of the collections.

Disadvantages

  • Unnecessary Wasting resources: Its not always a good habit to use the Iterator Method because sometimes it may proves as a overkill of resources in a simple application where complex things are not required.
  • Increases Complexity: As we said earlier, using Iterator method makes simple applications complex.
  • Decreases Efficiency: Accessing elements directly is a much better option as compared to accessing elements using the iterator in terms of efficiency .

Applicability

  • Limited Exposure: When you want to access the elements at the lower level i.e., you are not interested in the internal implementation of the elements then it’s always preferred to use Iterator Method.
  • Traversing Unknown Data Structures: Iterator method can be easily used to traverse various types of data structures such as Trees, Graphs, stack, Queue etc. as the code provides the couple of generic interfaces for both collections and iterators.

Further Read – Iterator Method in Java

Attention geek! Strengthen your foundations with the Python Programming Foundation Course and learn the basics.

To begin with, your interview preparations Enhance your Data Structures concepts with the Python DS Course.




My Personal Notes arrow_drop_up

Engineering student who loves competitive programming too much

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.


Article Tags :

1


Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.