Подтвердить что ты не робот

Почему Python, встроенный в функцию "all", возвращает True для пустых итераций?

Я знаю, что у него есть веская причина, но я хочу знать, в чем причина?

>>> print all([])
True

Если all() предназначен для проверки того, соответствует ли каждый элемент в iterable "True", и мы знаем, что пустые списки оцениваются как False

>>> bool([])
False

Итак, почему all() возвращает True для пустых списков?

<edit>

Я уже читал документы, и я знаю реализацию

 def all(iterable):
    for element in iterable:
        if not element:
            return False
    return True

Но вопрос в том, почему нет?

def all(iterable):
    if not iterable:
        return False
    for element in iterable:
        if not element:
            return False
    return True

В этом есть логика? если у вас есть список выполненных задач

today_todo_status = [task.status for task in my_todo if task.date == today]
can_i_go_home = all(today_todo_status)

Хорошо, на примере гипотетического это действительно имеет смысл, если у меня нет задач, поэтому я могу вернуться домой.

Но есть и другие случаи, и я не думаю, что все() были сделаны для списков todo.. LOL

</edit>

4b9b3361

Ответ 1

Это выражается как "Для всех X в S, X истинно". Если S пусто, X нет. Однако утверждение истины остается True, потому что для всех X X было истинным... там просто нет X!

Вот объяснение с использованием логики.

Рассмотрим два множества A и B, где A + B - объединение двух множеств.

Если любой (A + B) = True → any (A) или любой (B) = True, но мы не можем утверждать либо любой (A) = True или любой (B) = True.

Если любой (A + B) = False → any (A) = False и любой (B) = False.

Если все (A + B) = True → all (A) = True и все (B) = True

если все (A + B) = False → all (A) = False или все (B) = False, но мы не можем утверждать ни все (A) = False, ни все (B) = False.

Теперь вместо B, добавим пустое множество 0 в A. Мы хотим подойти логики, так что добавление пустого набора не изменяет значения all() или any(), так как A + 0 = A.

любое (A + 0) = любое (A) или любое (0)

any (0) должно быть False, так что если любое (A) истинно, любое (A + 0) истинно, и если любой (A) является False, любое (A + 0) является False.

all (A + 0) = all (A) и все (0)

если все (A) истинны, все (A + 0) являются True. Следовательно, все (0) имеют значение True.

Ответ 2

all() (задокументировано значение "Возвращать True, если все элементы итерабельного являются истинными (или если итерабельность пуста)." ) эквивалентно следующему:

def all(iterable):
    for element in iterable:
        if not element:
            return False
    return True

Поскольку нет элементов, он пропустит цикл и вернет True.

Ответ 3

Потому что все элементы True. Когда нет элементов, вы можете сказать, что "все элементы... ничего"

Ответ 5

Версия ELI5.

Возьмите список номеров

L = [1,2,3,4,6]

all([isintance(l, int) for l in L])

all определяется таким образом, что единственным способом сделать это False является предоставление at least одного не целого числа.

Точно так же any определяется таким образом, что, чтобы сделать его True все, что вам нужно, - это at-least одно положительное целое число.

Поскольку all() являются дополнением к any() нужно быть True а другое должно быть False