Запоминание списка в качестве замены для reduce() в Python
В следующем учебнике python сказано, что:
Пояснение к списку - это полная замена лямбда-функции, а также функции map()
, filter()
и reduce()
.
http://python-course.eu/python3_list_comprehension.php
Однако он не упоминает пример того, как понимание списка может заменить reduce()
, и я не могу представить пример того, как это возможно.
Может ли кто-нибудь объяснить, как достичь сокращенной функции со списком или подтвердить, что это невозможно?
Ответы
Ответ 1
В идеале, понимание списка заключается в создании нового списка. Цитирование официальной документации,
Сопоставление списков обеспечивает краткое создание списков.. Общие приложения должны создавать новые списки, где каждый элемент является результатом некоторых операций, применяемых к каждому члену другой последовательности или итерации, или для создания подпоследовательность тех элементов, которые удовлетворяют некоторому условию.
тогда как reduce
используется для уменьшения итерации до одного значения. Цитирование functools.reduce
,
Применить функцию двух аргументов кумулятивно к элементам последовательности слева направо, чтобы уменьшить последовательность до единственного значения.
Таким образом, понимание списка не может использоваться в качестве замены для замены reduce
.
Ответ 2
Сначала я был удивлен тем, что Guido van Rossum, создатель Python, был против reduce
. Его рассуждение заключалось в том, что помимо суммирования, умножения и использования и/или использования с использованием reduce
получается нечитаемое решение, которое лучше подходит для функции, которая выполняет итерацию и обновляет аккумулятор. Его статья по этому вопросу здесь. Нет, альтернатива reduce
отсутствует, но вместо этого "питонический" способ заключается в том, чтобы реализовать накопительную функцию старомодным способом:
Вместо:
out = reduce((lambda x,y: x*y),[1,2,3])
Использование:
def prod(myList):
out = 1
for el in myList:
out *= el
return out
Конечно, ничто не мешает вам продолжать использовать reduce
(python 2) или functools.reduce
(python 3)