Introdução

Uma função nada mais é que um bloco de código que recebe algumas entradas e devolve(ou não) alguma saída. Na realidade já estamos utilizando algumas funções desde que começamos a criar nossos primeiros programas em python. Alguns exemplos são as funções raw_input, print e sqrt.

A grande vantagem de se utilizar funções é o reaproveitamento de código, pois uma vez que criarmos uma função de alguma rotina podemos chamar esta rotina sempre que precisarmos utilizando a função implementada. Na verdade, já fizemos isso inumeras vezes, por exemplo, sempre que usamos a função raw_input, estamos reaproveitando o código que mostra uma menssagem para o usuário, implementa a leitura de dados a partir do teclado e retorna o valor lido.

Agora chegou o momento de criarmos as nossas funções. Mas antes, temos entender como funciona uma função.

Funções

Podemos pensar numa função como uma pequena maquina, para a qual passamos alguns parâmetros de entrada e ela nos retorna um resultado baseado nestas entradas processadas.

Para criarmos uma função em python devemos definila, ou seja, devemos dizer quais são as entradas para esta função o que ela deve fazer e o que deve retornar. Toda função vai ter um nome único, este nome é dado quando definimos a nossa função e o utilizamos sempre que queremos chamar esta função em algum lugar do nosso código.

Criar ou definir uma função em python é muito simples, utilizamos a seguinte sintaxe:

 
def nome_da_funcao(parametro1, parametro2, parametro3):
    |
    |Bloco da função, aqui vão todos os comandos desta função. 
    |No mesmo molde do if/for/etc...

A palavra def diz ao python que queremos definir uma função, já o nome da função é como queremos chama-la, os parâmetros de entrada são as variáveis que vão entrar para dentro do bloco da função(estas variaveis ficam acessiveis dentro da função) e o bloco da função é o código que sera executado apenas quando esta função for chamada.

Exemplo:

Queremos criar uma função que realiza uma soma de dos valores A e B. (obiviamente temos o operador + para isto, mas este exemplo é bem simples para uma melhor compreenção do aluno).

O primeiro passo é definir a função:

In [1]:
def soma(A, B):
    s = A + B
    print "A soma e: "+ str(s)

Uma vez que definimos nossa função é só utilizarmos quando for conveniente. Exemplos:

In [2]:
def soma(A, B):
    s = A + B
    print "A soma eh: "+ str(s)

a = 10
b = 5
soma(a,b)
soma(20,a)
soma(55,-100)

    
A soma eh: 15
A soma eh: 30
A soma eh: -45

Você notou que agora podemos utilizar várias vezes a função soma em nosso código? Bacana né? Este é o ponto forte de uma função, uma vez que a defenimos podemos chamar a mesma onde quisermos e reutilizar inúmeras vezes o mesmo código ou rotina. Mas agora você deve estar se perguntando: "ok, a função recebe os parametros A e B e mostra a soma deles, mas e se eu quiser utilizar esta soma para alguma outro processamento?". Para podermos utilizar algum valor que uma função processa devemos retornar este valor para fora da função.

Retorno de valores de uma função.

Para retornarmos um valor de uma função devemos utilizar o comando return acompanhado do valor que devemos retornar. Vamos modificar o código do exemplo anterior para, em vez de imprimir o valor da soma, retornar este valor para fora da função.

In [3]:
def soma(A, B):
    s = A + B
    return s

a = 10
b = 5

soma(a,b) # nada acontece pois não estamos utilizando o valor retornado pela função
c = soma(a,b)
print c
print c + 2
print soma(20,a)
15
17
30

Como você pode ver, agora nossa função, em vez de imprimir o valor da soma, retorna o valor e este pode ser utilizado fora da função.

Vamos a mais um exemplo, imagine que queremos escrever um programa que necessita como entrada um numero positivo. Entretanto, em mais de um lugar será necessária esta leitura. Portanto podemos criar uma função que le o número positivo e retorna ele. Lembre que o usuário pode digitar um número que não é positivo, então iremos utilizar um while para ficar lendo enquanto o usuário não informar o número positivo.

In [4]:
def lerNumeroPositivo():
    numero = int(raw_input("Digite um numero positivo: "))
    while numero < 1:
        numero = int(raw_input("Você não digitou um numero positivo, Digite um numero positivo: "))
    return numero

num = lerNumeroPositivo()
print "imagine que aqui acontecem vários outros comandos no programa"
print "muitos mesmo"
print "depois disto precisamos novamente de um numero positivo"
b = lerNumeroPositivo()
        
Digite um numero positivo: -5
Você não digitou um numero positivo, Digite um numero positivo: 0
Você não digitou um numero positivo, Digite um numero positivo: 1
imagine que aqui acontecem vários outros comandos no programa
muitos mesmo
depois disto precisamos novamente de um numero positivo
Digite um numero positivo: -3
Você não digitou um numero positivo, Digite um numero positivo: 3

Então podemos utilizar funções para tratar as entradas de nosso programa, o que é muito interessamte. Mais para frente iremos poder melhorar ainda mais isso com o uso de exceções.

Você notou algo especial nesta função?

Ela não possui nenhum parâmetro de entrada, e não tem problema pois podemos ter uma função que não recebe nada como entrada.

Um outro conceito importante para você dominar em funções são as variáveis locais e globais.

Variáveis globais e locais

Quando declaramos uma variável dentro de uma função, ou seja, dentro do bloco de código da mesma, esta variável vai pertencer a função e só existira e será acessível de dentro da função que a declarou. Chamamos este tipo de variável de variável local, pois ela só esta acessível e existirá dentro da função.

Existe um outro tipo de variável que pode ser acessada em qualquer local do nosso código e dentro de qualquer função do mesmo. Este tipo de variável é chamado de variável global. Para declararmos uma variavel global é só declararmos a mesma fora da função e a mesma vai estar disponível para todas as funções do código.

Exemplo:

In [5]:
uma_variavel_global = 10

def funcao_que_soma():
    uma_variavel_local = 2
    return uma_variavel_local + uma_variavel_global
    

print uma_variavel_global
uma_variavel_global = funcao_que_soma()
print uma_variavel_global
uma_variavel_global = funcao_que_soma()
print uma_variavel_global
uma_variavel_global = funcao_que_soma()
print uma_variavel_global
    
10
12
14
16

Observe que no codigo anterir temos uma variavel declarado fora da função, a qual foi chamada de uma_variavel_global, ela inicialmente recebeu o valor 10. Depois da função temos alguns prints, o primeiro imprime o valor da variavel uma_variavel_global que, obiviamente, é 10.

Na sequencia do código, temos que a variável uma_variavel_global recebe o resultado da função funcao_que_soma, portanto o valor desta vai ser alterado. Mas para qual valor ele será alterado? Bom, é só olharmos dentro da função e ver o que ela faz. Basicamente a função cria uma variavel local chamada uma_variavel_local (lembre que esta variavel só vai existir dentro da função) com o valor 2 e retorna o a soma da uma_variavel_local com a variavel uma_variavel_global. Por isso que o segundo print, que imprime o valor de uma_variavel_global imprime 12. Observe que são chamados mais vezes o mesmo comando com a função e a cada novo print a variavel global tem seu valor alterado.

Se tivermos outra função a variavel global também poderá ser acessada dela.

Exemplo:

In [6]:
uma_variavel_global = 10

def funcao_que_soma():
    uma_variavel_local = 2
    return uma_variavel_local + uma_variavel_global
    
def funcao_que_subtrai():
    uma_variavel_local = 5
    return uma_variavel_global - uma_variavel_local
    
    
print uma_variavel_global
uma_variavel_global = funcao_que_soma()
print uma_variavel_global
uma_variavel_global = funcao_que_subtrai()
print uma_variavel_global
uma_variavel_global = funcao_que_soma()
print uma_variavel_global
10
12
7
9

Observe que agora temos uma função chamada subtrai, que remove 5 do valor da variavel global e retorna o mesmo.

Entretanto, como podemos ver nestes 2 exemplos anteriores, só estamos acessando o valor da variavel global, se tentarmos modificar a mesma dentro de uma função, teremos um erro ou o python não irá modificar o mesmo.

Exemplo:

In [7]:
uma_variavel_global = 5

def modifica_global():
    uma_variavel_global = 10
    

print uma_variavel_global
modifica_global()
print uma_variavel_global
5
5

A função modifica_global() muda o valor da uma_variavel_global para 10. Entretanto observe que nos prints o valor desta variavel não muda. Porque?

Bom é muito simples, ao ecrever "uma_variavel_global = 10" o python entende que esta é a declaração de uma variavel local e portanto ela só pertece à função modifica_global, fazendo assim, com que a variavel global não seja modificada.

Mas como modificamos uma variável global dentro de uma função?

Simples, dizemos para o python que queremos que aquela variavel seja interpretada como global dentro da função usando a palavra global.

Exemplo:

In [8]:
uma_variavel_global = 5

def modifica_global():
    global uma_variavel_global 
    uma_variavel_global = 10
    

print uma_variavel_global
modifica_global()
print uma_variavel_global
5
10

Observe que agora o valor da variável uma_variavel_global foi modificado pela função.

Parâmetros Opcionais em funções:

No python podemos criar parâmetros Opcionais, ou seja, quem for utilizar esta função não é obrigado a informar estes parâmetros pois eles possuem um valor padrão. Entretanto, podemos modificar este valor caso seja desejado.

Para criar um parâmetro opcional é só atribuir um valor ao parametro na função. É preferível que estes parâmetros sejam informados por ultimo na função para evitar a necessidade de nomeação dos mesmos.

Exemplo:

In [9]:
def somatorioEntreNumeros(inicio, fim, imprimir=False):
    somatorio = 0
    for i in range(inicio,fim+1):
        somatorio = somatorio + i;
        if imprimir:
            if fim == i:#caso seja o ultimo numero
                print str(i) + " =",
            else:
                print str(i) + " +"  ,

    return somatorio


print somatorioEntreNumeros(2,7)
print somatorioEntreNumeros(2,7,False)
print somatorioEntreNumeros(2,7,True)
27
27
2 + 3 + 4 + 5 + 6 + 7 = 27

Veja que o parâmetro imprimir na definição da função recebe o valor False, ou seja, o valor padrão desta variável de entrada vai ser False. Caso o usuário da função passe um valor para este parâmetro ele será modificado para um novo valor. Parâmetros opcionais funcionam com qualquer tipo de variável.

Nomeando parametros

No python podemos nomear parametros que vamos passar para a função, desta forma podemos mudar a ordem de entrada dos parametros da função, ou só informar alguns dos parâmetros opcionais. Para fazer isso é só informarmos o nome do parâmetro que desemos passar para a função na sua chamada.

Exemplo:

In [10]:
#observe que agora a variavel inicio virou opcional tbm.
def somatorioEntreNumeros(fim, inicio=1 ,imprimir=False):
    somatorio = 0
    for i in range(inicio,fim+1):
        somatorio = somatorio + i;
        if imprimir:
            if fim == i:#caso seja o ultimo numero
                print str(i) + " =",
            else:
                print str(i) + " +"  ,

    return somatorio


print somatorioEntreNumeros(7)
print somatorioEntreNumeros(7,2)
print somatorioEntreNumeros(7,2,True)

#aqui temos exemplos de nomeação
print somatorioEntreNumeros(inicio=2, fim=5)
print somatorioEntreNumeros(7, imprimir=True)
28
27
2 + 3 + 4 + 5 + 6 + 7 = 27
14
1 + 2 + 3 + 4 + 5 + 6 + 7 = 28

Os recursos de parâmetros opcionais e nomeção possibilitam criar funçãoes bem mais genéricas e poderosas. Você vai ver bastante o uso destes recursos na sua evolução na liguagem python.

Bom, agora já temos a parte teórica, vamos aos exercícios.

In [ ]: