can Python be useful as functional?
duncan.booth at invalid.invalid
Tue Sep 18 09:41:03 CEST 2007
"Rustom Mody" <rustompmody at gmail.com> wrote:
> On 9/18/07, Alex Martelli <aleax at mac.com> wrote:
>> Rustom Mody <rustompmody at gmail.com> 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).
More information about the Python-list