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

Запоминание списка в качестве замены для reduce() в Python

В следующем учебнике python сказано, что:

Пояснение к списку - это полная замена лямбда-функции, а также функции map(), filter() и reduce().

http://python-course.eu/python3_list_comprehension.php

Однако он не упоминает пример того, как понимание списка может заменить reduce(), и я не могу представить пример того, как это возможно.

Может ли кто-нибудь объяснить, как достичь сокращенной функции со списком или подтвердить, что это невозможно?

4b9b3361

Ответ 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)