NameError: nazwa „zmniejsz” nie jest zdefiniowana w Pythonie

187

Używam Python 3.2. Próbowałem tego:

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

I wystąpił następujący błąd:

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

Próbowałem wydrukować reducena interaktywnej konsoli - otrzymałem ten błąd:

NameError: name 'reduce' is not defined


Czy reducenaprawdę jest usunięty w Pythonie 3.2? Jeśli tak jest, jaka jest alternatywa?

Siergiej
źródło
3
@JBernardo, jakie jest właściwe narzędzie?
Siergiej

Odpowiedzi:

280

Został przeniesiony do functools.

Ignacio Vazquez-Abrams
źródło
49
@ julio.alegria: Ponieważ Guido tego nienawidzi .
Ignacio Vazquez-Abrams
6
Artykuł przywołany w @ IgnacioVazquez-Abrams podaje kilka naprawdę dobrych uwag na temat tego, jak większość przypadków można napisać w bardziej czytelny sposób. Dla mnie to pisanie sum(item['key'] for item in list_of_dicts).
Connorbode,
195

Możesz dodać

from functools import reduce

przed użyciem zmniejsz.

3codziennie
źródło
3
Poprzedni użytkownik już odpowiedział na pytanie, a odpowiedź jest taka sama jak jego odpowiedź
Kathiravan Natarajan
8

Lub jeśli korzystasz z biblioteki sześciu

from six.moves import reduce
Azd325
źródło
3

W tym przypadku uważam, że następujące jest równoważne:

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

Jedynym problemem jest to, że tworzy duże liczby, ale może to jest lepsze niż powtarzane operacje modulo?

David M.
źródło
Powtarzane operacje modulo są przydatne, gdy pomagają utrzymać liczby małe. Sumowanie liczb nie utworzy dużych liczb, chyba że sumujesz DUŻO liczb, więc w tym przypadku nie pomogłoby. Zwłaszcza, że ​​nie zrobienie tego pozwala na użycie wbudowanej funkcji sumowania, która będzie działać znacznie szybciej niż wielokrotne stosowanie funkcji zdefiniowanej przez użytkownika
HackerBoss