# any() and all() on empty list?

Steve R. Hastings steve at hastings.org
Wed Mar 29 07:32:51 CEST 2006

So, Python 2.5 will have new any() and all() functions.
http://www.python.org/dev/peps/pep-0356/

any(seq) returns True if any value in seq evaluates true, False otherwise.

all(seq) returns True if all values in seq evaluate true, False otherwise.

I have a question: what should these functions return when seq is an empty
list?

Here is Guido's original article where he suggested any() and all():

He offered this sample code for the semantics of any() and all():

def any(S):
for x in S:
if x:
return True
return False

def all(S):
for x in S:
if not x:
return False
return True

And he pointed out how nifty it is to combine generator functions with
these two new functions:

any(x > 42 for x in S)     # True if any elements of S are > 42
all(x != 0 for x in S)     # True if all elements if S are nonzero

I'm completely on board with the semantics for any().  But all() bothers
me.  If all() receives an empty list, it will return True, and I don't
like that.  To me, all() should be a more restrictive function than any(),
and it bothers me to see a case where any() returns False but all()
returns True.

In the all() example, if there *are* no values in S, then none of the
values can be != 0, and IMHO all() should return False.

Therefore, I propose that all() should work as if it were written this way:

def all(S):
ret_val = False

for x in S:
ret_val = True
if not x:
return False

return ret_val