Issue
I know it has a good reason, but I want to know what reason?
>>> print all([])
True
If all() is intended to check if every item on iterable evaluates to "True", and we know empty lists are evaluated to False
>>> bool([])
False
So why the all() returns True for empty lists?
< edit >
I already read the docs, and I know the implementation
def all(iterable):
for element in iterable:
if not element:
return False
return True
But the question is why not?
def all(iterable):
if not iterable:
return False
for element in iterable:
if not element:
return False
return True
There is a logic on this? if you have a list of done-tasks
today_todo_status = [task.status for task in my_todo if task.date == today]
can_i_go_home = all(today_todo_status)
Ok, on the above hypothetical example it really makes sense, if I have no tasks, so I can go home.
But there are other cases and I dont think all() was made for todo lists.. LOL
< /edit >
Solution
This is expressed as "For all X in S, X is true". If S is empty, there are no X. However, the truth statement remains True, because for all X, X was true... there just aren't any X!
Here is a explanation using logic.
Consider two sets A and B where A+B is the union of the two sets.
If any(A+B) = True -> any(A) or any(B) = True but we cannot assert either any(A)=True or any(B)=True.
If any(A+B) = False -> any(A) = False and any(B) = False.
If all(A+B) = True -> all(A)=True and all(B)=True
if all(A+B) = False -> all(A)=False or all(B)=False but we cannot assert either all(A)=False or all(B)=False.
Now instead of B, let's add the empty set Ø to A. We want to come up logic such that adding the empty set does not change the values of all() or any(), since A+Ø=A.
any(A+Ø) = any(A) or any(Ø)
any(Ø) must be False, so that if any(A) is True, any(A+Ø) is True, and if any(A) is False, any(A+Ø) is False.
all(A+Ø) = all(A) and all(Ø)
if all(A) is True, all(A+Ø) is True. Therefore, all(Ø) is True.
Answered By - Interrobang
0 comments:
Post a Comment
Note: Only a member of this blog may post a comment.