NameError: имя 'Reduce' не определено в Python

188

Я использую Python 3.2. Пробовал это:

xor = lambda x,y: (x+y)%2
l = reduce(xor, [1,2,3,4])

И получил следующую ошибку:

l = reduce(xor, [1,2,3,4])
NameError: name 'reduce' is not defined

Пробовал печатать reduceв интерактивную консоль - получил эту ошибку:

NameError: name 'reduce' is not defined


Является ли на reduceсамом деле удалены в Python 3.2? Если это так, какова альтернатива?

Сергей
источник
3
@JBernardo, каков правильный инструмент?
Сергей

Ответы:

281

Он был перенесен в functools.

Игнасио Васкес-Абрамс
источник
49
@ julio.alegria: потому что Гвидо это ненавидит .
Игнасио Васкес-Абрамс
6
Статья, на которую ссылается @ IgnacioVazquez-Abrams, дает несколько хороших замечаний о том, как большинство случаев можно написать более читабельным образом. Для меня это написано sum(item['key'] for item in list_of_dicts).
Коннорбоуд
196

Можете добавить

from functools import reduce

прежде чем использовать уменьшить.

3heveryday
источник
3
Предыдущий пользователь уже ответил на вопрос, и ответ такой же, как и у его ответа
Kathiravan Natarajan
8

Или если вы используете шесть библиотек

from six.moves import reduce
Azd325
источник
3

В этом случае я считаю, что следующее эквивалентно:

l = sum([1,2,3,4]) % 2

Единственная проблема в том, что он создает большие числа, но, может быть, это лучше, чем повторяющиеся операции по модулю?

Дэвид М
источник
Повторные операции по модулю полезны, когда они помогают сохранять малые числа. Суммирование чисел не приведет к созданию больших чисел, если вы не сложите много чисел, поэтому в этом случае это не поможет. Тем более, что это не позволяет использовать встроенную функцию суммирования, которая будет работать намного быстрее, чем повторное применение пользовательской функции
HackerBoss