Передача выражений генератора в Any() и all()Python

Программы на Python
Anonymous
Передача выражений генератора в Any() и all()

Сообщение Anonymous »

Я просто возился с интерпретатором Python и обнаружил неожиданное поведение.

Код: Выделить всё

>>> bools = (True, True, True, False)
>>> all(bools)
False
>>> any(bools)
True
Хорошо, пока ничего необычного...

Код: Выделить всё

>>> bools = (b for b in (True, True, True, False))
>>> all(bools)
False
>>> any(bools)
False
Здесь все становится жутковато. Я полагаю, что это происходит потому, что функция all перебирает выражение генератора, вызывая его метод __next__ и используя значения, пока не встретит значение False. Вот некоторые доказательства, подтверждающие эту теорию:

Код: Выделить всё

>>> bools = (b for b in (True, False, True, True))
>>> all(bools)
False
>>> any(bools)
True
Я думаю, что результат отличается, потому что False находится не в конце, поэтому в генераторе еще остались неиспользованные значения. Если вы наберете

Код: Выделить всё

>>> bools = (b for b in (True, False, True, True))
>>> all(bools)
False
>>> list(bools)
[True, True]
Похоже, что осталось только два значения.

Итак, почему именно это происходит на самом деле? Я уверен, что мне не хватает многих деталей.

Подробнее здесь: https://stackoverflow.com/questions/570 ... ny-and-all

Вернуться в «Python»