NameError: ім'я "зменшити" не визначено в Python


187

Я використовую 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, який правильний інструмент?
Сергій

Відповіді:


280

Це було перенесено до functools.



6
Стаття, на яку посилається @ IgnacioVazquez-Abrams, дає деякі справді хороші моменти щодо того, як більшість випадків можна писати більш читабельним способом. Для мене це написання sum(item['key'] for item in list_of_dicts).
connorbode

195

Ви можете додати

from functools import reduce

перед тим, як скористатись зменшенням.


3
Попередній користувач вже відповів на питання, і відповідь така ж, як у його відповіді
Kathiravan Natarajan

8

Або якщо ви використовуєте шість бібліотеки

from six.moves import reduce

3

У цьому випадку я вважаю, що таке рівнозначне:

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

Єдина проблема з цим полягає в тому, що це створює велику кількість, але, можливо, це краще, ніж повторні операції модуля?


Повторні модульні операції корисні, коли це допомагає зберегти малі цифри. Підведення підсумкових чисел не створюватиме великі числа, якщо ви не підсумуєте ВІДКЛЮЧЕННЯ чисел, тому в цьому випадку це не допоможе. Тим більше, що не робити це дозволяє використовувати вбудовану функцію суми, яка запуститься набагато швидше, ніж повторне застосування визначеної користувачем функції
HackerBoss,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.