В предыдущем посте мы запускали нужную нам функцию внутри генератора списка. Выглядит странно, когда мы не сохраняем результат этого генератора, так как обычно нужен именно он.
Обычно, в таких случаях более наглядно смотрится функция map():
array = [1, 2, 3, 4, 5, 6, 7, 8, 9]
more, less = [], []
map(lambda x: [less.append, more.append][x>5](x), array)
Проверяем результат
>>> print(more, less)
[] []
Хм, не сработало! Что произошло? Почему итерация не запустилась?
Дело в том, что в Python3 многие итеративные функции (если не все) стали генераторами. А что такое генератор? Это не тот генератор списка который List Comprehensions, а именно Generator.
Объект, который внутри себя имеет алгоритм получения следующего элемента и он не станет запускать итерацию пока мы не начнём запрашивать эти элементы.
Что возвращает функция map()?
>>> print(map(...))
<map object at 0x0000023114ADE3C8>
Тоже самое произошло и с функцией range
>>> print(range(10))
range(0, 10)
Значит всё что остаётся, это запустить итерацию по элементам генератора. Как это сделать максимально коротко?
Можно просто в цикле for
for _ in map(...): pass
Либо конвертнуть в список
list(map(...))
Или оператором *
[*map(...)]
Ну а полностью будет выглядеть так
[*map(lambda x: [less.append, more.append][x>5](x), array)]
Теперь генератор сразу вычисляется. Хотя, как по мне, такая запись менее "читабельна")
#tricks