"Rustom Mody" <[EMAIL PROTECTED]> wrote: > On 9/18/07, Alex Martelli <[EMAIL PROTECTED]> wrote: >> Rustom Mody <[EMAIL PROTECTED]> wrote: >> >> > Can someone help? Heres the non-working code >> > >> > def si(l): >> > p = l.next() >> > yield p >> > (x for x in si(l) if x % p != 0) >> > >> > There should be an yield or return somewhere but cant figure it out >> >> Change last line to >> >> for x in (x for x in si(l) if x % p != 0): yield x > > > Thanks but why does > > (yield(x) for x in si(l) if x % p != 0) > > not work? I would have expected generator expression to play better > with generators.
Why should it? It evaluates the expression which returns an object that just happens to be a generator and then as with any other expression that isn't assigned or returned it throws away the result. > More generally, if one wants to 'splice in' a generator into the body > of a generator, is there no standard pythonic idiom? Yes there is, as Alex showed you the standard python idiom for a generator to yield all elements of an iteratable (whether it is a generator or any other iterable) is: for somevar in iterable: yield somevar There have been various proposals in the past such as 'yield from iterable', but there doesn't seem any compelling case to introduce a new confusing syntax: the existing syntax works, and adding a special syntax wouldn't open the door to any performance benefits since the implementation would have to be pretty much the same (at most you would save a couple of local variable accesses). -- http://mail.python.org/mailman/listinfo/python-list