Re: Can this be written more concisely in a functional style

From: Jeremy Fincher (tweedgeezer_at_hotmail.com)
Date: 11/18/03


Date: 18 Nov 2003 13:04:33 -0800

mis6@pitt.edu (Michele Simionato) wrote in message news:<2259b0e2.0311180714.4f605bab@posting.google.com>...
> tweedgeezer@hotmail.com (Jeremy Fincher) wrote in message news:<698f09f8.0311180259.bdd4359@posting.google.com>...
> > def any(p, seq):
> > """Returns true if any element in seq satisfies predicate p."""
> > for elt in itertools.ifilter(p, seq):
> > return True
> > else:
> > return False
> >
> > def all(p, seq):
> > """Returns true if all elements in seq satisfy predicate p."""
> > for elt in itertools.ifilterfalse(p, seq):
> > return False
> > else:
> > return True
>
> This is a perfect example of why I dislike the "else" clause. I
> would code this as
>
> def any(p, seq):
> """Returns true if any element in seq satisfies predicate p."""
> for elt in itertools.ifilter(p, seq):
> return True
> return False
>
> def all(p, seq):
> """Returns true if all elements in seq satisfy predicate p."""
> for elt in itertools.ifilterfalse(p, seq):
> return False
> return True
>
> Since the "else" is unnecessary, it disturbs me, I get confused,
> I don't see why it is used (there is no break in the loop)

It's used because the for loop is effectively serving as an if
statement. Iterators have no __nonzero__ method -- you can't simply
bool() them. So I use a for loop like a if statement, and throw the
else in there to emphasize that usage. The for loop will never
iterate; either its body executes or it doesn't.

An alternative way to code this would be:

def any(p, seq):
    try:
        itertools.ifilter(p, seq).next()
        return True
    except StopIteration:
        return False
    
but I find that less clear.

I also use else because it puts my return statements at the same level
of indentation, which I find more readable, since logically they're
equivalent.

> Am I the only one? ;)

One can only hope! <wink>

Jeremy



Relevant Pages