Notícias sobre Ubuntu, Debian, Fedora, Linux, Android, Tecnologia, LibreOffice e muito mais!

Programação Funcional Com Python

1 Introdução

Em ciência da computação, programação funcional é um paradigma da programação que lida com a computação e suas estruturas do ponto de vista da avaliação de expressões de funções matemáticas e que evita estados ou dados mutáveis, enfatizando na aplicação de funções; sendo um paradigma de programação declarativa, ou seja, ela faz uso expressões ou declarações ao invés de ‘statements’, pequenos blocos de códigos independentes. Existem alguns exemplos de linguagens que seguem este paradigma, tais como: haskell, lisp, clojure, OCaml.
A programação funcional deriva do cálculo-lambda (vide Referências [4],[6]) que está relacionado ao estudo formalizado de funções recursivas computáveis. 
Nota
De forma simplificada uma função é dita recursiva quando ela chama a si própria.
Exemplo abaixo código do fatorial de um número natual n, n =0,1,2,3,.. (vide referência [5]):
por definição, fatorial de 0 e 1 é igual à 1.
def fat(n):
  if n == 0 or n== 1:
    return 1
  else:
    return fat(n-1)*n

2 Python Funcional

Algumas das possibilidades de implementações da programação funcional em Python é através de construções com expressões lambda acrescidas do uso de funções como map, range, reduce, filter e zip; e interadores e geradores. Além da expressão condicional Se…Senão também poder ser escrita como: 
(  (expressão1) Se condição1  Senão (expressão2) )
equivalente à
Se condição1:
    expressão1
Senão:
    expressão2
e a estrutura Para (condição) Faça… escrita como
( (expressão1) Para (expressão) Em (Lista) )
equivale à
Para (expressão) Em Lista:
    expressão1
As duas formas (como vê-se na documentação Python, vide [8]) generalizadas
( expressão0 Para expressão Em Lista1
     Se condição1 Então expressão1
     Para expressão2 Em Lista2
     Se condição2 Então expressão2
     …
     Para  expressãoN Em ListaN
     Se condiçãoN Então expressãoN )

2.1 Funções Lambda

 De modo geral, a estrutura de uma função lambda segue o esquema:
<nome_func> = lambda <parametros>: <expressão>
uso, nome_func(<entradas>).
Exemplo:
>>> square = lambda n: n**2
>>> square(2)
Saída: 4

 2.2 Geradores e Interadores

Os geradores (generators) são um caminho para criação de interadores (interators), que por sua vez é um objeto que representa um “fluxo de dados”   (podendo ser uma sequência de elementos formando uma lista) que podem ser “percorridos” ou “mapeados”. As funções geradoras, diferentemente das funções comuns, retornam iteradores ou iterators.
Exemplo:
def ger_int(N):
  for i in range(N+1):
    yield i

[ i for i in ger_int(4)]
[0, 1, 2, 3, 4]



L = iter(ger_int(10))
print L
>>> print L
<generator object ger_int at 0x801b5d960>
>>> [i for i in L]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
e
L=iter(range(10))
>>> L
<listiterator object at 0x807c3b410>
A função iter recebe como entrada uma coleção ou se houver um segundo argumento (sentinel, vide Referências [8], [iter]) o primeiro argumento deve ser um método (uma função/método, objeto ‘callable’).
O Seguinte exemplo pode ser visto na documentação Python, onde iter recebe um segundo argumento,
with open('mydata.txt') as fp:
  for line in iter(fp.readline, ''):
    process_line(line)

 2.3 Outras Funções

Há outras funções como map, reduce, filter, zip, que podem ser combinadas com funções lambda. Para mais detalhes vide documentação Python, ( [11] e livros em Referências [9],[10]).
A função map toma dois argumentos sendo primeiro uma função e o segundo um elemento interavel, ou seja, uma sequência de elementos; assim a função irá “mapear” todos os elementos da sequência aplicando a função a cada um.
Exemplo:
>>> map(lambda x: x**2, range(6))
Saída: [0, 1, 4, 9, 16, 25]
A função reduce ou redução consiste em dada uma sequência de elementos e uma função que toma como entrada dois valores, ir aplicando a função aos dois primeiros elementos da lista tomar esse resultado como primeira entrada desta função e pegar o elemento seguinte da lista; sendo repetido até o último elemento da lista. Exemplo abaixo mostra como usar reduce para implementar a função que calcula o fatorial de um numero (como visto anteriormente com def).
Antes veja operator
>>> import operator
>>> operator.imul(2,4) #função para produto de dois inteiros.
Saída: 8
Implementando a função fat usando operator, reduce e range:
import operator
fat = lambda n:  1 if n <=1 else reduce(operator.imul, range(2,n+1))
A função filter (filtragem), é aplicada aos elementos de uma lista se a função retorna verdadeiro, resultando em uma nova lista com mesmo tamanho ou menor como saída. Vejamos exemplo que retorna lista de números impares entre 1 e 10,
>>> filter(lambda n: n%2, range(1,10))
Saída: [1, 3, 5, 7, 9]
A função zip, ou transposição, retorna uma lista de tuplas construída de uma sequência reestruturada em uma nova sequência, onde há a transposição dos elementos da lista antiga para formar a nova lista (como em transposição de uma matriz, vide Referências [12]).
>>> zip([‘Ana’,’Rafaela’, ‘Maria’], [‘Renato’, ‘Pedro’, ‘Tiago’])
Saída: [(‘Ana’, ‘Renato’), (‘Rafaela’, ‘Pedro’), (‘Maria’, ‘Tiago’)]
Matriz A dada por
A= [ [ 1 2 3],
        [ 4,5,6],
        [ 7,8,9] ]
>>> zip(*A)
Saida: [(1, 4, 7), (2, 5, 8), (3, 6, 9)]

 3 Conclusão

Em muitos casos, apesar de algumas limitações, funções lambda tem execução mais eficiente que as funções criadas através da forma comum usando diretiva def e blocos de instruções.

google_ad_client = “ca-pub-5822666425104102”;
google_ad_slot = “2795884478”;
google_ad_width = 728;
google_ad_height = 90;

Referências
  1. http://wiki.python.org.br/PythonFuncional;
  2. https://en.wikipedia.org/wiki/Functional_programming;
  3. http://wiki.python.org.br/PythonFuncional;
  4. Cálculo Lambda – https://pt.wikipedia.org/wiki/C%C3%A1lculo_lambda;
  5. Fatorial https://pt.wikipedia.org/wiki/Fatorial;
  6. “Lambda Calculus with Types (Perspectives in Logic)” Henk Barendregt,Wil Dekkers, Richard Statman – Cambridge University Press 1ª Edição (2013);
  7. “Functional Programming In Python” David Mertz – O’REILLY (2015)
  8. Functional https://docs.python.org/2/howto/functional.html 
  9. Python Para Desenvolvedores (2.x) Luis Eduardo Borges https://ark4n.wordpress.com/python/
  10. “Python Para Desenvolvedores” (3.x) Luis Eduardo Borges  Ed. Novatec
  11. Python www.python.org
  12. Transposta  https://pt.wikipedia.org/wiki/Matriz_transposta
Comentários