Implementing Iterators in, e.g., Linked Lists

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • adeleinandjeremy

    Implementing Iterators in, e.g., Linked Lists

    I am taking a second programming course in Java and am currently
    attempting to apply what I have learned using Python instead. One
    thing that is puzzling me is how to use an iterator.

    I am writing a module containing everything I'd need for canonical
    linked lists. One particularly useful feature would be to use a for
    loop over the whole structure. For this I have learned the benefits of
    iterators. I have read a few book entries on Python iterators, as well
    as an online article by David Mertz, I believe, and PEP 234, and I may
    be lacking some insight but I am still confused about one thing. How
    does the iteration know where to begin?

    AFAIU, in my LinkedList class, I can either have the LinkedList be its
    own iterator by making its __iter__() method return self and defining
    a next() method, or I can have a separate iterator called from
    LinkedList's __iter__(). My view is that it would be best to have the
    LinkedList be its own iterator - is that the case? Or is an external
    iterator preferable in this case?

    My problem with implementing the former comes with this: in LinkedList
    I would have:

    ....

    def __init__(self):
    return self

    ....

    def next(self):
    if self.__current. next == None:
    raise StopIteration
    self.__current = self.__current. next
    return self.__current. next

    ....

    Now, is this good in the eyes of more experienced programmers? Also,
    do I really want to dedicate an instance variable to keep track of
    where to begin iteration (if __current is used for other purposes,
    iteration could conceivably begin anywhere right?)? Does this suggest
    that I should have a separate LinkedListItera tor class? And if I do
    have that separate class, do I make the LinkedList.__it er__() pass on
    to LinkedListItera tor's constructor the head node of LinkedList, or
    the whole linked list?

    Thanks in advance,

    Jeremy


  • Rainer Deyke

    #2
    Re: Implementing Iterators in, e.g., Linked Lists

    adeleinandjerem y wrote:[color=blue]
    > AFAIU, in my LinkedList class, I can either have the LinkedList be its
    > own iterator by making its __iter__() method return self and defining
    > a next() method, or I can have a separate iterator called from
    > LinkedList's __iter__(). My view is that it would be best to have the
    > LinkedList be its own iterator - is that the case? Or is an external
    > iterator preferable in this case?[/color]

    External iterators are always preferable for two reasons.

    1. They allow multiple iterators over the same collection.

    2. They keep the interface of the base object clean by separating other
    functionality.


    --
    Rainer Deyke - rainerd@eldwood .com - http://eldwood.com


    Comment

    Working...