__iter__ yield

Paul Hankin paul.hankin at gmail.com
Mon Mar 10 09:32:43 CET 2008


On Mar 10, 3:12 am, George Sakkis <george.sak... at gmail.com> wrote:
> On Mar 9, 7:37 pm, Paul Hankin <paul.han... at gmail.com> wrote:
>
>
>
> > On Mar 9, 8:58 pm, duccio <d... at tiscali.it> wrote:
>
> > > Someone knows if it's possible to make this __iter__ function with just
> > > one 'yield' intead of two?
> > > ...
> > >      def __iter__(self):
> > >          yield self #1
> > >          for n in self.childs:
> > >              for nn in n.__iter__():
> > >                  yield nn #2
>
> > Only one yield and shorter (but not really any simpler):
>
> > from itertools import chain
>
> > class Node:
> >     ...
> >     def __iter__(self):
> >         for x in chain([self], *self.childs):
> >             yield x
>
> Actually this doesn't need a yield at all:
>
> class Node:
>     ...
>     def __iter__(self):
>         return chain([self], *self.childs)

The two have slightly different behaviours: without the yield, iter is
called immediately on every node in the tree as the iterators are
built. With yield, iterators are built lazily, giving better
behaviour.

But perhaps it's a defect of chain that it calls iter on all of its
arguments straight away -- would it be better if it only built the
iterators when they're needed?

--
Paul Hankin




More information about the Python-list mailing list