Aula 4 - Trabalhando com Funções

Conceito de Funções

In [2]:
#As funções são um bloco de código que executam uma tarefa sempre que acionadas.
#Para definir uma função usamos o def
#a função abaixo imprime bom dia sempre que chamada
def bomdia():
    print("Bom dia!")
In [4]:
#para chamar a função basta utilizar seu nome
bomdia()
Bom dia!
In [5]:
#nas funções podemos passar parâmetros para serem utilizados internamente
#no caso vamos desejar bom dia para para uma pessoa cujo o nome é passado como argumento no parâmetro da função
def bomdia(nome):
    print("Bom dia "+nome+'!')
In [7]:
#chamando a função com o argumento 'Paulo' no parâmetro nome
#argumento é o valor passado e parâmetro é que está definido na estrutura da função
bomdia('Paulo')
Bom dia Paulo!
In [8]:
#Os argumentos podem ser posicionais ou por nome
#no exemplo abaixo vamos utilizar o posicional
#a ordem dos argumentos serão na mesma ordem da definição dos parâmetros (primeiro x e depois y)
def soma(x,y):
    print(x+y)
soma(2,3)
5
In [9]:
#mas também podemos deixar os parâmetros nomeados.
#Neste caso não precisa ser na mesma ordem de definição da função
soma(y=3,x=2)
5
In [11]:
#Os parâmetros da função podem ter um valor padrão que serão usados se nenhum valor for passado
#neste caso, não passamos o 'y', então será usado o valor padrão 0
def soma(x=0,y=0):
    print(x+y)
soma(x=2)
2
In [4]:
#escopo de variáveis
#uma variável (ou parâmetro) criada dentro da função é visível apenas internamente (variavel local)
#Já variáveis criadas fora da função são globais, e podem ser acessadas dentro e fora da função
#no exemplo, pi pode ser acessado dentro da função, mas 'r' apenas internamente
pi=3.14
def area_circulo(r):
    area=2*pi*r**2
    print(area)

area_circulo(2)
25.12
In [6]:
#no exemplo, criamos uma variavel pi interna. A função usará ela, e não a variavel externa
pi=3.14
def area_circulo(r):
    pi=10
    area=2*pi*r**2
    print(area)

area_circulo(2)
80
In [10]:
#mas com 'global' conseguimos manipular o 'pi' dentro da função.
#observe que mudamos o valor para 10 e ele permanece após a execução da função
#não é uma boa prática usar global
pi=3.14
def area_circulo(r):
    global pi
    pi=10
    area=2*pi*r**2
    print(area)

area_circulo(2)
print(pi)
80
10
In [12]:
#com 'return' a função pode retornar um valor para o programa principal
#no exemplo abaixo a função retorna o valor da area do circulo
pi=3.14
def area_circulo(r):
    area=2*pi*r**2
    return area

resultado=area_circulo(2)
print(resultado)
25.12
In [14]:
#também é possível criar funções sem número fixo de parametros
#por padrão se usa *args, que retornará uma tupla com os valores passados como argumento
#no exemplo abaixo vamos criar uma função para somar um número indeterminado de elementos
#*args retornará uma tupla com os argumentos passados no parâmetro
#com o FOR somamos os elementos da tupla *args
def soma(*args):
    total = 0
    for numero in args:
        total += numero
    return total

total = soma(1, 2, 3, 4, 5)
print(total)
15

Higher Order Functions e First-Class Functions(funções de primeira classe)

Academicamente, os termos Higher Order Functions e First-Class Functions têm significados diferentes.

Higher Order Functions - Funções que podem receber e/ou retornar outras funções

First-Class Functions - Funções que são tratadas como outros tipos de dados comuns (strings, inteiros, etc...)

Na prática, este tipo de função são tratadas como objetos de primeira classe. Isso quer dizer que funções em Python podem ser: Atribuídas a variáveis, Passadas como argumentos para outras funções, Retornadas por outras funções, Armazenadas em estruturas de dados (como listas, dicionários, etc.)

In [1]:
#atribuir função em uma variável
def saudacao():
    print("Bom dia!")

valor = saudacao  # Atribuindo a função a uma variável
valor()           # Chamando a função usando a variável
Bom dia!
In [2]:
#passar função como argumento
def executar(funcao):
    funcao()  # Chama a função recebida

def saudacao():
    print("Bom dia!")

executar(saudacao)
Bom dia!
In [5]:
#retornar uma função de outra função

def criar_mensagem():
    def mensagem():
        print("Função retornada!")
    return mensagem

nova_funcao = criar_mensagem()
nova_funcao()
Função retornada!

Closure - São funções que retornam outras funções. Esta técnica pode reduzir drasticamente a quantidade de código.

In [7]:
#No exemplo, queremos criar funções que duplicam, triplicam e quadriplicam um valor
#Da forma tradicional, cada vez precisamos chamar a funções diferentes
#Se fosse para criar mais multiplicadores (quintuplicar por exemplo), teríamos um número indefindo de funções
def duplicar(numero):
    return numero * 2


def triplicar(numero):
    return numero * 3


def quadruplicar(numero):
    return numero * 4

print(duplicar(10))
20
In [8]:
#criando uma closure, nós passamos apenas o número e o multiplicador
#Desta forma criamos apenas uma função que possui uma função interna e retorna ela

def multiplicador(multiplicador):
    def multiplicar(numero):
        return numero * multiplicador
    return multiplicar


duplicar = multiplicador(2)
triplicar = multiplicador(3)
quadruplicar = multiplicador(4)

print(duplicar(2))
print(triplicar(2))
print(quadruplicar(2))
4
6
8
In [ ]: