By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
434,921 Members | 1,493 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 434,921 IT Pros & Developers. It's quick & easy.

Using and Implementing iterators with classes such as linked lists

P: n/a
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 LinkedListIterator class? And if I do
have that separate class, do I make the LinkedList.__iter__() pass on
to LinkedListIterator's constructor the head node of LinkedList, or
the whole linked list?

Thanks in advance,

Jeremy

__________________________________
Do you Yahoo!?
Free Pop-Up Blocker - Get it now
http://companion.yahoo.com/

Jul 18 '05 #1
Share this Question
Share on Google+
3 Replies


P: n/a
Adelein and Jeremy <ad**************@yahoo.com> wrote in
news:ma*************************************@pytho n.org:
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?


It sounds a very bad idea to have LinkedList be its own iterator. If you
did that then you could only have one iteration over each list at a time.
In practical use, you will find that you want to iterate over a list, and
you don't know or care whether another piece of code is already iterating
over the same list.

The easiest way to handle it here is to use a generator to do the actual
iteration:

def __iter__(self):
def iterate(current):
while current.next is not None:
next = current.next
yield current
current = next
return iterate(self)
--
Duncan Booth du****@rcp.co.uk
int month(char *p){return(124864/((p[0]+p[1]-p[2]&0x1f)+1)%12)["\5\x8\3"
"\6\7\xb\1\x9\xa\2\0\4"];} // Who said my code was obscure?
Jul 18 '05 #2

P: n/a
In article <Xn**************************@127.0.0.1>,
Duncan Booth <du****@rcp.co.uk> wrote:

def __iter__(self):
def iterate(current):
while current.next is not None:
next = current.next
yield current
current = next
return iterate(self)


Huh? Why the extra function and complexity?

def __iter__(self):
current = self
while current is not None:
yield current
current = current.next
--
Aahz (aa**@pythoncraft.com) <*> http://www.pythoncraft.com/

Weinberg's Second Law: If builders built buildings the way programmers wrote
programs, then the first woodpecker that came along would destroy civilization.
Jul 18 '05 #3

P: n/a
aa**@pythoncraft.com (Aahz) wrote in news:bq**********@panix3.panix.com:
In article <Xn**************************@127.0.0.1>,
Duncan Booth <du****@rcp.co.uk> wrote:

def __iter__(self):
def iterate(current):
while current.next is not None:
next = current.next
yield current
current = next
return iterate(self)


Huh? Why the extra function and complexity?

def __iter__(self):
current = self
while current is not None:
yield current
current = current.next


Because I was asleep.

--
Duncan Booth du****@rcp.co.uk
int month(char *p){return(124864/((p[0]+p[1]-p[2]&0x1f)+1)%12)["\5\x8\3"
"\6\7\xb\1\x9\xa\2\0\4"];} // Who said my code was obscure?
Jul 18 '05 #4

This discussion thread is closed

Replies have been disabled for this discussion.