Eu sempre pensei que a programação funcional pode ser feita em Python. Portanto, fiquei surpreso que o Python não tenha sido mencionado nessa pergunta e, quando foi mencionado, normalmente não era muito positivo. No entanto, não foram dadas muitas razões para isso (a falta de correspondência de padrões e os tipos de dados algébricos foram mencionados). Então, minha pergunta é: por que o Python não é muito bom para programação funcional? Existem mais motivos do que a falta de correspondência de padrões e tipos de dados algébricos? Ou esses conceitos são tão importantes para a programação funcional que uma linguagem que não os suporta pode ser classificada apenas como uma linguagem de programação funcional de segunda classe? (Lembre-se de que minha experiência com programação funcional é bastante limitada.)
fonte
Respostas:
A pergunta que você faz referência pergunta quais idiomas promovem o OO e a programação funcional. O Python não promove programação funcional, embora funcione razoavelmente bem.
O melhor argumento contra a programação funcional no Python é que os casos de uso imperativos / OO são cuidadosamente considerados por Guido, enquanto os casos de uso de programação funcional não são. Quando escrevo Python imperativo, é uma das linguagens mais bonitas que conheço. Quando escrevo Python funcional, ele se torna tão feio e desagradável quanto a linguagem comum que não possui um BDFL .
O que não quer dizer que seja ruim, apenas que você terá que trabalhar mais do que faria se mudasse para uma linguagem que promova a programação funcional ou passasse a escrever OO Python.
Aqui estão as coisas funcionais que sinto falta no Python:
list
se quiser persistência. (Os iteradores são usados uma vez)fonte
Guido tem uma boa explicação sobre isso aqui . Aqui está a parte mais relevante:
Eu retiro duas coisas disso:
fonte
O esquema não possui tipos de dados algébricos ou correspondência de padrões, mas certamente é uma linguagem funcional. Coisas irritantes sobre Python de uma perspectiva de programação funcional:
Lambdas aleijados. Como o Lambdas pode conter apenas uma expressão e você não pode fazer tudo tão facilmente em um contexto de expressão, isso significa que as funções que você pode definir "on the fly" são limitadas.
Ifs são declarações, não expressões. Isso significa, entre outras coisas, que você não pode ter um lambda com um If dentro dele. (Isso é corrigido por ternários no Python 2.5, mas parece feio.)
Guido ameaça remover o mapa, filtrar e reduzir de vez em quando
Por outro lado, o python possui fechamentos lexicais, lambdas e compreensão de listas (que são realmente um conceito "funcional", independentemente de Guido o admitir). Eu faço bastante programação em "estilo funcional" em Python, mas dificilmente diria que é o ideal.
fonte
Eu nunca chamaria o Python de "funcional", mas sempre que programa em Python, o código invariavelmente acaba sendo quase puramente funcional.
É certo que isso se deve principalmente à compreensão extremamente agradável da lista. Portanto, eu não sugeriria necessariamente o Python como uma linguagem de programação funcional, mas sugeriria a programação funcional para quem usa o Python.
fonte
Deixe-me demonstrar com um pedaço de código retirado de uma resposta a uma pergunta Python "funcional" no SO
Pitão:
Haskell:
A principal diferença aqui é que a biblioteca padrão de Haskell tem funções úteis para programação funcional: neste caso
iterate
,concat
e(!!)
fonte
grandKids()
o corpo com gerador de expressões:return reduce(lambda a, v: concat((x for x in kidsFunc(v)) for v in a), xrange(generation), [val])
.concat
:return reduce(lambda a, v: (x for v in a for x in kidsFunc(v)), xrange(generation), [val])
itertools.chain.from_iterable
Uma coisa que é realmente importante para esta pergunta (e as respostas) é a seguinte: O que diabos é a programação funcional e quais são as propriedades mais importantes dela. Vou tentar dar a minha opinião:
A programação funcional é como escrever matemática em um quadro branco. Ao escrever equações em um quadro branco, você não pensa em uma ordem de execução. Não há (normalmente) nenhuma mutação. Você não volta no dia seguinte e olha para ele e, quando faz os cálculos novamente, obtém um resultado diferente (ou pode, se tiver tomado um café fresco :)). Basicamente, o que está no quadro está lá, e a resposta já estava lá quando você começou a escrever as coisas, mas você ainda não percebeu o que é.
A programação funcional é muito parecida com isso; você não muda as coisas, apenas avalia a equação (ou, neste caso, "programa") e descobre qual é a resposta. O programa ainda está lá, sem modificações. O mesmo com os dados.
Eu classificaria o seguinte como os recursos mais importantes da programação funcional: a) transparência referencial - se você avaliar a mesma declaração em outro momento e local, mas com os mesmos valores de variável, ainda assim significará o mesmo. b) sem efeito colateral - não importa quanto tempo você olhe para o quadro branco, a equação que outro cara está olhando para outro quadro branco não mudará acidentalmente. c) funções também são valores. que podem ser passados e aplicados com ou para outras variáveis. d) composição da função, você pode fazer h = g · f e, assim, definir uma nova função h (..) que é equivalente a chamar g (f (..)).
Como a lista está na minha ordem priorizada, a transparência referencial é a mais importante, seguida por nenhum efeito colateral.
Agora, se você passar pelo python e verificar o quão bem a linguagem e as bibliotecas suportam e garantem esses aspectos - você estará no caminho certo para responder sua própria pergunta.
fonte
Python é quase uma linguagem funcional. É "leve funcional".
Possui recursos extras, portanto, não é puro o suficiente para alguns.
Também não possui alguns recursos, portanto, não está completo o suficiente para alguns.
Os recursos ausentes são relativamente fáceis de escrever. Confira posts como este no FP em Python.
fonte
Outro motivo não mencionado acima é que muitas funções e métodos internos de tipos internos modificam um objeto, mas não retornam o objeto modificado. Se esses objetos modificados fossem retornados, isso tornaria o código funcional mais limpo e conciso. Por exemplo, se some_list.append (some_object) retornou some_list com some_object anexado.
fonte
Além de outras respostas, uma das razões pelas quais o Python e a maioria das outras linguagens multiparadigma não são adequadas para a verdadeira programação funcional é porque seus compiladores / máquinas virtuais / tempos de execução não oferecem suporte à otimização funcional. Esse tipo de otimização é alcançado pelo compilador que entende as regras matemáticas. Por exemplo, muitas linguagens de programação suportam um
map
função ou método. Essa é uma função bastante padrão que assume uma função como um argumento e é iterável, pois o segundo argumento aplica essa função a cada elemento no iterável.De qualquer forma, acontece que
map( foo() , x ) * map( foo(), y )
é o mesmo quemap( foo(), x * y )
. O último caso é realmente mais rápido que o anterior, porque o primeiro executa duas cópias, enquanto o último executa uma.Linguagens funcionais melhores reconhecem esses relacionamentos com base matemática e executam automaticamente a otimização. Idiomas que não são dedicados ao paradigma funcional provavelmente não serão otimizados.
fonte
map( foo() , x ) * map( foo(), y ) == map( foo(), x * y )
não é verdade para todas as funções. Por exemplo, considere o caso aofoo
calcular uma derivada.+
vez de*
.