NameError: o nome 'reduzir' não está definido no Python

187

Estou usando o Python 3.2. Tentei isso:

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

E obteve o seguinte erro:

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

Tentei imprimir reduceno console interativo - obtive este erro:

NameError: name 'reduce' is not defined


É reducerealmente removido no Python 3.2? Se for esse o caso, qual é a alternativa?

Sergey
fonte
3
@JBernardo, qual é a ferramenta certa?
Sergey

Respostas:

280

Foi movido para functools.

Ignacio Vazquez-Abrams
fonte
49
@ julio.alegria: Porque Guido odeia .
Ignacio Vazquez-Abrams
6
O artigo mencionado em @ IgnacioVazquez-Abrams faz alguns pontos realmente bons sobre como a maioria dos casos pode ser escrita de maneira mais legível. Para mim, é por escrito sum(item['key'] for item in list_of_dicts).
connorbode
195

Você pode adicionar

from functools import reduce

antes de usar o reduzir.

3heveryday
fonte
3
O usuário anterior já respondeu à pergunta e a resposta é a mesma da sua resposta
Kathiravan Natarajan
8

Ou se você usar a biblioteca de seis

from six.moves import reduce
Azd325
fonte
3

Nesse caso, acredito que o seguinte seja equivalente:

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

O único problema com isso é que ele cria grandes números, mas talvez isso seja melhor do que operações repetidas no módulo?

David M
fonte
Operações repetidas do módulo são úteis quando ajudam a manter os números pequenos. A soma de números não criará números grandes, a menos que você some MUITOS números, portanto, nesse caso, não ajudaria. Especialmente porque não fazê-lo permite o uso do built-in função de soma, que vai correr muito mais rápido do que a aplicação repetida de uma função definida pelo usuário
HackerBoss