On Mar 10, 3:12 am, George Sakkis <[EMAIL PROTECTED]> wrote: > On Mar 9, 7:37 pm, Paul Hankin <[EMAIL PROTECTED]> wrote: > > > > > On Mar 9, 8:58 pm, duccio <[EMAIL PROTECTED]> 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 -- http://mail.python.org/mailman/listinfo/python-list