filter
, map
E reduce
funcionar perfeitamente em Python 2. Aqui está um exemplo:
>>> 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
Mas no Python 3, recebo as seguintes saídas:
>>> 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
Eu apreciaria se alguém pudesse me explicar por que isso acontece.
Captura de tela do código para maior clareza:
python
python-3.x
filter
functional-programming
reduce
Dick Lucas
fonte
fonte
Respostas:
Você pode ler sobre as alterações em O que há de novo no Python 3.0 . Você deve lê-lo completamente quando passar de 2.x para 3.x, pois muitas alterações foram alteradas.
A resposta completa aqui são citações da documentação.
Exibições e iteradores em vez de listas
Builtins
fonte
list(map(...)
todos os lugares .. como no mundo isso ajuda a legibilidade ..python
parece não conseguir lidar com a aplicação progressiva / de streaming de combinadores funcionais. Outros idiomas Eu posso encadear uma dúzia de operações contra uma coleção em uma linha e é legível. Aqui? o que você quer - uma dúzia de maneiras aninhadasin
??list
chamada? Eu pensei que o significado de "streaming" é "nenhuma lista é criada; processe cada elemento da entrada completamente antes de passar para a próxima".map
.A funcionalidade de
map
efilter
foi intencionalmente alterada para retornar iteradores e a redução foi removida de ser incorporada e inseridafunctools.reduce
.Assim, para
filter
emap
, você pode envolvê-loslist()
para ver os resultados como você fez antes.A recomendação agora é substituir o uso de mapa e filtro por expressões de geradores ou compreensão de lista. Exemplo:
Eles dizem que para loops são 99% das vezes mais fáceis de ler do que reduzir, mas eu apenas continuaria
functools.reduce
.Edit : O número de 99% é extraído diretamente da página What's New In Python 3.0 , de Guido van Rossum.
fonte
[i*i*i for i in range(1,11)]
i**3
ligarái.__pow__(3)
ei*i*i
i.__mul__(i).__mul__(i)
(ou algo assim). Com ints, não importa, mas com números numpy / classes personalizadas, pode até produzir resultados diferentes.list(list(list(.. )))
fazer o que já estava detalhado em python.Como um adendo para as outras respostas, isso parece um bom caso de uso para um gerenciador de contexto que irá mapear novamente os nomes dessas funções para aquelas que retornam uma lista e são introduzidas
reduce
no espaço para nome global.Uma implementação rápida pode ser assim:
Com um uso assim:
Que imprime:
Apenas meus 2 centavos :-)
fonte
python
como língua é uma bagunça - mas tem v bons a excelentes bibliotecas:numpy
,pandas
,statsmodels
e amigos .. eu tinha sido buliding bibliotecas de conveniência como você mostrar aqui para reduzir a dor da língua nativa -, mas perderam a energia e não tentar afastar-se de umdata.frame
/datatable
, ouxarray
. Mas parabéns por tentar ..Como o
reduce
método foi removido da função interna do Python3, não se esqueça de importá-lofunctools
no seu código. Veja o snippet de código abaixo.fonte
Aqui estão os exemplos de filtrar, mapear e reduzir funções.
//Filtro
//Mapa
//Reduzir
A função de redução, como não é comumente usada, foi removida das funções internas do Python 3. Ela ainda está disponível no módulo functools, para que você possa:
fonte
Uma das vantagens de mapear, filtrar e reduzir é o quão legíveis elas se tornam quando você as "liga" para fazer algo complexo. No entanto, a sintaxe interna não é legível e é "invertida". Então, sugiro usar o
PyFunctional
pacote ( https://pypi.org/project/PyFunctional/ ). Aqui está uma comparação dos dois:Versão PyFunctional
Sintaxe muito legível. Você pode dizer:
Versão padrão do Python
Está tudo ao contrário. Você precisa dizer:
fonte