Aula 18 – Python – Programação funcional

More videos
Views
   

Aula 18 – Python – Programação funcional

Python - Programação funcional

Python – Programação funcional

Aula anterior

Próxima aula

Página principal

Se gostarem do conteúdo dêem um joinha 👍 na página do Código Fluente no
Facebook

Esse é o link do código fluente no Pinterest

Meus links de afiliados:

Hostinger

Digital Ocean

One.com

Seguindo 😉

Programação funcional em python

De acordo com o wikipedia, programação funcional é um paradigma de programação, ou seja, um estilo de construção da estrutura e dos elementos de programas de computador, que trata a computação como a avaliação de funções matemáticas e evita a mudança de estado e dados mutáveis.

Essas funções são chamadas de pure function, ou função pura.

Ela é uma função onde o resultado é apenas determinado pelos seus parâmetros de entrada, sem depender de fatores externos (APIs, sistema de arquivos, qualquer dependência que possa alterar o resultado de uma função).

Dessa forma, uma função pura retornará sempre o mesmo resultado para os mesmos parâmetros de entrada.

Essas funções podem ser aplicadas em sequências de dados (geralmente listas).

Imagine uma lista de preços em que você precisa adicionar 10% em todos os produtos da lista.

Em uma abordagem tradicional, poderíamos pensar em algo assim:


prices = [50, 60, 70]
newPrices = []
for price in prices: 
    newPrice = price * 1.1
    newPrices.append(newPrice)
# Saída
# [55.00000000000001, 66.0, 77.0]

Utilizando o método map(), teríamos esse resultado:


prices = [50, 60, 70]
list(map(lambda price: price * 1.1 , prices))
# Saída
# [55.00000000000001, 66.0, 77.0]

Vantagens:

  • Melhor legibilidade e manutenibilidade do código
  • Código simples e conciso
  • Imutabilidade. O resultado da nova lista nunca irá alterar os valores da lista original.

A lista abaixo mostra algumas linguagens de programação funcional:

  • LISP
  • Scheme
  • Haskell ( influenciou diretamente o Python )

O python não é uma linguagem funcional, mas dá suporte a múltiplos paradigmas de programação, inclusive o funcional.

As operações básicas do paradigma funcional são implementadas no Python pelas funções internas map() filter().

Lambda

Funções lambda são muito usadas em programação funcional.

No Python, a função anônima é uma função que é definida sem um nome.

As funções normais são definidas usando a palavra-chave def, já as anônimas são definidas usando a palavra-chave lambda.

As funções lambda podem ter apenas uma linha, e podem ser atribuídas a uma variável.

As funções lambda podem ter qualquer número de argumentos, mas, apenas uma expressão.

A expressão é avaliada e retornada.

Usamos funções lambda quando precisamos de uma função sem nome por um curto período de tempo.

Sintaxe:

lambda arguments: expression


# Uso básico de funções lambda
dobro = lambda x: x * 2

# Saída: 10
print(dobro(5))

No programa acima, lambda x: x * 2 é a função lambda.

Onde x é o argumento e x * 2 é a expressão que é avaliada e retornada.

Esta função não tem nome.

Ele retorna um objeto de função que é atribuído ao identificador dobro.

Podemos agora chamá-lo como uma função normal.

A declaração:


double = lambda x: x * 2

É quase a mesma coisa que:


def double(x):
   return x * 2

As funções Lambda são usadas junto com funções como filter(), map(), reduce() etc.

Exemplo de uso com filter()

A função filter() no Python recebe uma função e uma lista como argumentos.

A função é chamada com todos os itens da lista e uma nova lista é retornada, contendo itens que a função avalia como True.

Aqui está um exemplo de uso da função filter() para filtrar apenas números pares de uma lista.


# Programa para filtrar apenas os itens pares de uma lista

lst = [1, 5, 4, 6, 8, 11, 3, 12]

new_lst = list(filter(lambda x: (x % 2 == 0) , lst))

# Saída: [4, 6, 8, 12]
print(new_lst)

Exemplo de uso com map()

A função map() no Python recebe uma função e uma lista.

A função é chamada com todos os itens da lista e uma nova lista é retornada, contendo itens retornados por essa função para cada item.

Aqui está um exemplo de uso da função map() para duplicar todos os itens em uma lista.


# Programa para dobrar cada item em uma lista usando map()
lst = [1, 5, 4, 6, 8, 11, 3, 12]

new_lst = list(map(lambda x: x * 2 , lst))

# Saída: [2, 10, 8, 12, 16, 22, 6, 24]
print(new_lst)

Exemplo de uso com reduce()


# reduce() não é mais builtin no python 3, por isso o import abaixo

from functools import reduce

def soma(x1, x2): 
    return x1 + x2

# Saída: 10
print(reduce(soma, [1, 2, 3, 4]))

Outro exemplo do reduce()


from functools import reduce
 # Calcula o fatorial de n
def fat(n):
    return reduce(lambda x, y: x * y, range(1, n))
# Saída: 720
print(fat(7))

Exemplo do zip()

Esta função retorna uma lista de tuplas, onde a i-ésima tupla contém o i-ésimo elemento de cada um dos argumentos.


x = [1, 2, 3]
y = [4, 5, 6]
for t in zip(x, y):
    print(t)
#Saída: 
#(1, 4)
#(2, 5)
#(3, 6)

A função zip() retorna uma sequência de tuplas.

Lista com tamanhos diferentes serão emparelhadas e a diferença entre elas será desconsiderada.


lst_a = [6, 7, 8, 9]
lst_b = [1, 2, 3, 4, 5]

for x in zip(lst_a, lst_b):
    print(x)
"""
(6, 1)
(7, 2)
(8, 3)
(9, 4)
"""

A função zip() aponta para o objeto instanciado:


x = [1, 2, 3]
y = [4, 5, 6]
zip(x, y) 
<zip object at 0x7faded7b3608>

Para vermos a lista precisamos passá-la para a função interna list().


x = [1, 2, 3]
y = [4, 5, 6]
list(zip(x, y))
#Saída
[(1, 4), (2, 5), (3, 6)]

Veja a diferença entre um mesmo código na forma imperativa e na funcional:

Imperativo


# Gera uma lista da string de forma imperativa
string = 'Python'
lst = [] # estado inicial

for l in string:
    lst.append(l) # cada iteração gera um novo estado

print(lst) # ['P', 'y', 't', 'h', 'o', 'n']

 Funcional


# Gera uma lista da string de forma funcional
string = lambda x: x

lst = list(map(str, string('Python'))) # atribuição a um novo objeto

print(lst) # ['P', 'y', 't', 'h', 'o', 'n']

List Comprehension

Em computação, List Comprehension é uma construção que equivale a notação matemática do tipo:

S = {x^2 ∀ x em ℕ, x>=20}

Ou seja, S é o conjunto formado por x ao quadrado para todo x no conjunto dos naturais, se x for maior ou igual a 20.

Sintaxe:

lista = [ <expressão> for <referência> in <sequência> if <condição> ]


nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
# Eleve os ímpares ao quadrado
print([ x**2 for x in nums if x % 2 ])
# Saída
#[1, 9, 25, 49, 81, 121]

List Comprehension é mais eficiente do que usar as funções map() e filter() em relação a processamento e consumo de memória.

Generator Expressions

Gerador é um iterável criado usando uma função com uma declaração yield.

A principal característica de um gerador é avaliar os elementos sob demanda.

Quando você chama uma função normal com uma instrução de retorno, a função é finalizada sempre que encontrar uma instrução de retorno.

Em uma função com uma instrução yield, o estado da função é “salvo” da última chamada e pode ser selecionado na próxima vez que você chamar uma função geradora.

Generator Expression usa menos recursos do que o List Comprehension, pois os itens são gerados um de cada vez, apenas quando necessário, economizando principalmente memória.

A sintaxe e o conceito são semelhantes aos de uma List Comprehension.

Em termos de sintaxe, a única diferença é que você usa parênteses em vez de colchetes.

O tipo de dado retornado por List Comprehension e Generator Expression é diferente.


gen_exp = (x ** 2 for x in range(10) if x % 2 == 0)
list(gen_exp)
# Saída
# [0, 4, 16, 36, 64]

 

Por hora ficamos por aqui, nos vemos na próxima aula.  🖖

Aula anterior

Próxima aula

Página principal

Se gostarem do conteúdo dêem um joinha 👍 na página do Código Fluente no
Facebook

Esse é o link do código fluente no Pinterest

Meus links de afiliados:

Hostinger

Digital Ocean

One.com

Obrigado, até e bons estudos. 😉

(Visited 81 times, 1 visits today)
About The Author
-

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>