filter
, map
И reduce
работа отлично в Python 2. Вот пример:
>>> def f(x):
return x % 2 != 0 and x % 3 != 0
>>> filter(f, range(2, 25))
[5, 7, 11, 13, 17, 19, 23]
>>> def cube(x):
return x*x*x
>>> map(cube, range(1, 11))
[1, 8, 27, 64, 125, 216, 343, 512, 729, 1000]
>>> def add(x,y):
return x+y
>>> reduce(add, range(1, 11))
55
Но в Python 3 я получаю следующие выводы:
>>> filter(f, range(2, 25))
<filter object at 0x0000000002C14908>
>>> map(cube, range(1, 11))
<map object at 0x0000000002C82B70>
>>> reduce(add, range(1, 11))
Traceback (most recent call last):
File "<pyshell#8>", line 1, in <module>
reduce(add, range(1, 11))
NameError: name 'reduce' is not defined
Буду признателен, если кто-нибудь сможет объяснить мне, почему это так.
Скриншот кода для большей наглядности:
python
python-3.x
filter
functional-programming
reduce
Дик Лукас
источник
источник
Ответы:
Вы можете прочитать об изменениях в Что нового в Python 3.0 . Вы должны внимательно прочитать его, когда переходите с 2.x на 3.x, так как многое изменилось.
Весь ответ здесь - цитаты из документации.
Представления и итераторы вместо списков
Встроенные команды
источник
list(map(...)
везде ... как в мире это помогает удобочитаемости ...python
не может справиться с прогрессивным / потоковым применением функциональных комбинаторов. На других языках я могу связать дюжину операций с коллекцией подряд, и она может быть прочитана. Вот? что ты хочешь - дюжина вложенных путейin
??list
вызов вообще? Я думал, что значение «потоковая передача» - это «список не создается вообще; полностью обработайте каждый элемент ввода, прежде чем переходить к следующему».map
.Функциональность
map
иfilter
была намеренно изменена, чтобы возвращать итераторы, а редукция была удалена из встроенной и помещена вfunctools.reduce
.Таким образом, для
filter
иmap
, вы можете обернуть их,list()
чтобы увидеть результаты, как вы делали раньше.В настоящее время рекомендуется заменить использование карты и фильтра выражениями генераторов или списками. Пример:
Говорят, что циклы for в 99 процентах случаев легче читать, чем сокращать, но я бы просто придерживался их
functools.reduce
.Редактировать : 99-процентный показатель взят прямо со страницы « Что нового в Python 3.0», созданной Гвидо ван Россумом.
источник
[i*i*i for i in range(1,11)]
i**3
позвонитi.__pow__(3)
иi*i*i
i.__mul__(i).__mul__(i)
(или что-то в этом роде). Для ints это не имеет значения, но для числовых / пользовательских классов это может даже привести к другим результатам.list(list(list(.. )))
сделать то, что уже было многословно в python.Как дополнение к другим ответам, это звучит как хороший пример использования для менеджера контекста, который переназначит имена этих функций на те, которые возвращают список и вводят
reduce
в глобальное пространство имен.Быстрая реализация может выглядеть так:
С использованием, которое выглядит так:
Какие отпечатки:
Просто мои 2 цента :-)
источник
python
как язык беспорядок - но она имеет V хорошей до отличной библиотеки:numpy
,pandas
,statsmodels
и друзей .. Я был Buliding библиотеки удобства , как вы показать здесь , чтобы уменьшить боль родного языка - но потеряли энергию и стараться не уходить далеко отdata.frame
/datatable
илиxarray
. Но слава за попытку ..Поскольку
reduce
метод был удален из встроенной функции из Python3, не забудьте импортировать егоfunctools
в свой код. Пожалуйста, посмотрите на фрагмент кода ниже.источник
Вот примеры функций фильтра, отображения и сокращения.
//Фильтр
//Карта
// Уменьшить
Функция Reduce, поскольку она обычно не используется, была удалена из встроенных функций в Python 3. Она по-прежнему доступна в модуле functools, поэтому вы можете сделать:
источник
Одно из преимуществ сопоставления, фильтрации и уменьшения состоит в том, насколько разборчивыми они становятся, когда вы объединяете их в цепочки, чтобы сделать что-то сложное. Тем не менее, встроенный синтаксис не читается и все "назад". Итак, я предлагаю использовать
PyFunctional
пакет ( https://pypi.org/project/PyFunctional/ ). Вот сравнение двух:PyFunctional версия
Очень разборчивый синтаксис. Ты можешь сказать:
Версия Python по умолчанию
Это все задом наперед. Вы должны сказать:
источник