• Python
  • 02. Chamando e criando funções
  • Chamando e criando funções

Chamando e criando funções#

Já vimos como podemos criar valores numéricos e realizar as operações aritméticas básicas (adição, subtração, divisão, multiplicação e potenciação) em Python. Sabemos que além dessas operações básicas existem diversas outras operações matemáticas úteis. Por exemplo: funções trigonométricas (seno, cosseno, tangente), logaritmo, fatorial, etc.

Em Python não existem operadores para seno, logaritmo, etc., mas temos pacotes que estendem a linguagem com essas funcionalidades. Para este exemplo específico, nós temos o pacote math, um pacote do Python com diversas funções matemáticas úteis.

Algumas funções oferecidas pelo pacote math do Python.

Se estiver preocupada/preocupado com a matemática

Nesse início do curso nós utilizamos exemplos matemáticos por serem mais diretos: uma expressão matemática diz exatamente o que deve ser feito e em qual ordem. A rigor não é necessário ser um gênio da matemática para aprender a programar, porém ela é importante em muitas áreas da computação que são o foco do nosso curso, como IA e Machine Learning.

Para dizer ao Python que queremos utilizar esse pacote nós devemos utilizar o comando import. Veja a seguir um exemplo de cálculo do cosseno de zero:

1
2
3
import math
resultado = math.cos(0)
print(resultado)

Na linha 1 estamos dizendo para o Python que queremos utilizar o pacote de funções matemáticas math. Antes de entendermos a linha 2, vamos relembrar o que a linha 3 está fazendo: estamos pedindo para o Python executar (através dos parênteses) a função print (que mostra um texto no terminal) utilizando como argumento o conteúdo da variável resultado.

Agora que revisamos o uso da função print, podemos voltar para a linha 2 do nosso código. Nessa linha nós estamos utilizando a função que calcula o cosseno (cos) do pacote math, ou seja, math.cos. Lembrando que os parênteses são a nossa forma de pedir para o Python executar uma função, o que essa linha faz é pedir para o Python executar a função math.cos com o argumento 0 (zero). Essa função vai devolver um resultado e nós queremos que o Python guarde esse resultado na variável resultado.

Exercise 1

Qual é o comando necessário para utilizar um pacote do Python.

Answer

Para utilizamos um pacote, usamos o comando import seguido do nome do pacote.

Exercise 2

Vamos usar o exercício "Iniciando em Funções" nos próximos passos. Abra ele no VScode e volte para este handout.

Acessar exercício

Exercise 3

Para iniciar nossa sequência de exercícios, digite o código abaixo no arquivo de exercício que você abriu no VSCode e execute.

import math
resultado = math.cos(0)
print(resultado)

O que foi impresso no terminal?

Answer

Foi impresso 1.0 que representa o cosseno de 0.

Antes de prosseguir

Recomendamos que você sempre teste os códigos apresentados no seu próprio computador. Para isso, procure sempre digitar o código ao invés de copiar e colar.

Exercise 4

Teste o código acima com valores diferentes, que você saiba o resultado esperado (para te auxiliar abaixo segue uma tabela com alguns valores de cosseno), e veja o que acontece.

Tabela com alguns valores de cosseno.

Deu diferente, e agora?

Provavelmente o resultado não é o que você esperava. Se tiver curiosidade, leia a documentação da função cos para tentar entender o problema.

Exercise 5

Se você tentou calcular o valor de cosseno para o ângulo 180° usando o seguinte trecho de código math.cos(180), deve ter percebido que o valor esperado foi diferente de -1.

Consultando a documentação da função math.cos, o que está faltando neste código para conseguirmos calcular o valor correto do cosseno?

Answer

Provavelmente, ao utilizar a função math.cos, você passou como argumento da função um ângulo em graus. Por exemplo, math.cos(90).

Mas ao consultar a documentação da função math.cos, podemos verificar que a função espera receber um ângulo em radianos.

Documentação da função math.cos.

Dessa forma, devemos passar os valores em radianos.

Valores dos ângulos em radianos.

Exercise 6

Vamos agora progredir e começar a passar alguns testes no nosso exercício. Adapte o código de exemplo para mostrar o cosseno de 30° e 120°, um em cada linha. Lembre-se que, para converter um ângulo A para radianos devemos aplicar a seguinte fórmula

\[ A \times \frac{\pi}{180} \]

Rode os testes depois de fazer essa adaptação. Agora seu código deve passar no teste Mostrou cosseno de 30 e 120. Você pode usar pi=3.14.

Você deve ter notado que, para usar math.cos duas vezes, precisamos repetir o código de converter para radianos. Ficar repetindo código assim traz dois problemas:

  1. se precisarmos mudar esse código temos agora um monte de lugares para mudar!
  2. é muito fácil esquecer de adaptar uma parte desse código copiado e introduzir erros.

Para isso Python nos permite criar funções. Você pode pensar na função como uma parte reaproveitável de um programa. Como assim? Considere math.cos que acabamos de testar. Nós pedimos para o Python executar essa função passando um ângulo. Não sabemos (e nem precisamos saber, por enquanto) como ela faz isso, mas ela calcula o cosseno desse ângulo e devolve o resultado. Pensando no nosso programa, o que aconteceu foi que plugamos uma caixa preta na qual entram números representando ângulos e saem números representando o seu cosseno e é isso o que precisamos saber. Inclusive, chamamos math.cos duas vezes com ângulos diferentes.

Função math.cos representada como uma caixa preta.

Criando nossas próprias funções em Python#

Vamos começar com um exemplo de uma função que converte valores de milhas para quilômetros:

Função converte_milhas_para_km

Vamos entender o que está acontecendo, começando pelos nomes:

  1. O converte_milhas_para_km é o nome da nossa função em Python. Sempre que formos criar uma função em Python utilizamos a palavra def seguida do nome que queremos dar à função.
  2. O distancia_mi na linha 1 é chamado de argumento da função. Neste exemplo, o argumento representa um valor em milhas que a função irá receber para aplicar o cálculo da conversão para quilômetros.
  3. As linhas 2 e 3 são chamadas de corpo ou bloco da função.
  4. O distancia_km na linha 3 é chamado de retorno ou resultado da função. Depois de converter a distância em milhas (distancia_mi) para uma distância em quilômetros distancia_km precisamos devolver o valor calculado. Note que para devolver o valor precisamos colocar a palavra return seguido pelo valor retornado.
  5. O corpo da função é identificado com os 4 espaços no começo da linha. Esses 4 espaços são chamados de indentação.

Indentação

Indentação na função converte_milhas_para_km

A indentação é crucial e Python e tem um significado especial. Ela é utilizada para indicar blocos de código. Portanto não se deve utilizar indentações a mais ou a menos, pois isso causará um erro na execução do programa.

O uso de 4 espaços é outra padronização da comunidade Python. Se você usar 2, 3 ou qualquer outra quantidade de espaços (ou até mesmo o caractere tab) o código funcionará da mesma forma. Desde que seja consistente, ou seja, escolha um formato e utilize-o em todo o seu programa. Recomendamos que você utilize 4 espaços para seguir o padrão da comunidade.

Dois-pontos

Você notou a presença dos dois-pontos (:) ao final da linha 1 da função converte_milhas_para_km?

Dois pontos na função converte_milhas_para_km

Ao definir uma função, não podemos esquecer de usar os dois-pontos. Usamos os dois-pontos para indicar que vamos utilizar indentação para o bloco de código que vier em seguida.

Vamos agora definir nossa própria função? Nosso primeiro passo será definir a nossa função usando o modelo abaixo. É uma boa prática colocar as nossas funções no início do arquivo logo após as linhas contendo import.

  1. Trocamos nome_da_funcao pelo nome que queremos dar a ela. No nosso caso, usaremos graus_para_radianos como nome.
  2. Trocamos argumento por graus, que é a entrada da nossa função.
  3. Aqui podemos colocar uma sequência de comandos Python que serão executados. A variável graus já vem preenchida quando o código da função rodar. Para facilitar neste início, vamos sempre terminar preenchendo uma variável resultado com o valor calculado pela nossa função.
  4. Aqui podemos manter igual. O comando return diz que o valor a sua direita é o resultado da função e deve ser devolvido para quem chamou ela.

Exercise 7

Faça as substituições acima e rode seu programa. Ele deverá executar sem erros. A saída do programa mudou?

Seu arquivo de solução deve estar parecido com o modelo abaixo.

import math

# defina sua função aqui

# resto do código dos outros exercícios vai aqui

Você deverá estar vendo código parecido com o abaixo. Alguns pontos de atenção:

  1. as linhas 4 e 5, que esão logo abaixo do def devem iniciar com 4 espaços. Todo código iniciando com 4 espaços está "dentro" da função e será executado quando graus_para_radianos for chamada
  2. a definição da função (linhas 3-5) deve estar antes das linhas de print
1
2
3
4
5
6
7
8
9
import math

def graus_para_radianos(graus):
    resultado = graus * 3.14 / 180
    return resultado

# Os print abaixo estão comentados, então por enquanto eles não irão executar
# print(math.cos(30 * 3.14 / 180))
# print(math.cos(120 * 3.14 / 180))

Se você executar o código acima não vai acontecer nada. Nesse código nós estamos apenas definindo a função graus_para_radianos (por isso a palavra def). Podemos entender a linha 1 como: "Python, quando eu pedir para você executar a função graus_para_radianos, passando um valor para graus, o que você deve fazer é: multiplicar o valor armazenado na variável graus por 3.14/180 e guardar o resultado na variável resultado e depois devolver o valor armazenado na variável resultado como o resultado". Em outras palavras, é como se estivéssemos criando um novo comando do Python (assim como já temos o print ou o math.cos, por exemplo).

Vamos refletir brevemente sobre a função que acabamos de criar. Qual é o valor esperado para o resultado da chamada da função graus_para_radianos(graus)? A resposta é: depende! Depende do valor de graus. A função graus_para_radianos só pode devolver um valor se definirmos um valor para graus.

Essa ideia é a mesma que apresentamos sobre a função print, ou seja, precisamos de uma informação adicional. Uma vez que definimos uma função é como se ela se tornasse parte da linguagem Python. Assim, para esse contexto introdutório, não existe nenhuma diferença entre a função print e a função converte_milhas_para_km(graus) em termos de importância. Ambas são comandos disponíveis no Python para o programador utilizar em seu código.

Exercise 8

A partir da linha 6 já temos graus_para_radianos disponível para usar no nosso programa. A partir da linha 6 já temos graus_para_radianos disponível para usar no nosso programa. Vamos agora voltar a mostrar os números na saída, mas dessa vez chamando nossa função ao invés de fazer as contas explicitamente a cada print.

Levando em conta as informações acima, como você mudaria as linhas 8 e 9 para usar a sua função ao invés de escrever a expressão de conversão para radianos duas vezes?

Answer

Sabendo que usamos nossa função igual ao print, podemos usar graus_para_radianos(30) para fazer a primeira conversão. Com isso podemos substituir a expressão 30 * 3.14 / 180 pela chamada da função graus_para_radianos(30).

Para indicar que queremos chamar uma função usamos (). Se ela recebe argumentos, os colocamos dentro dos parênteses.

Aqui já começamos a combinar funções:

  1. primeiro computamos o resultado de graus_para_radianos(30)
  2. esse valor é passado para math.cos
  3. cujo resultado é passado para print para mostrar na tela.

Quanto mais complexos os programas que criarmos mais funções estaremos combinando, sejam elas criadas por nós mesmos como graus_para_radianos como funções já existentes como math.cos.

Dica Pro: use bons nomes!

No dia seguinte você abre o programa mostrado acima. O que faz mesmo esse código? Acredite, é mais comum do que você imagina. Enquanto estamos desenvolvendo o programa temos muito claro para quê cada variável serve, mas não precisamos de muito tempo para olhar o mesmo código e não ter ideia do que está acontecendo. Imagine se, em vez de usar o nome graus_para_radianos escrevêssemos a seguinte função:

def calcula(x):
    return x * 0.017444444444444446

Você conseguiria adivinhar o que ela faz? E se eu te disser que o número 0.017444444444444446 é igual a 3.14/180? Essa função tem o mesmo resultado que graus_para_radianos mas é difícil perceber isso só de ler o código, já que nem o nome da função nem seu argumento e muito menos o número estranho na multiplicação dão nenhum dica do que ela faz. Por isso, use nomes que façam sentido para as suas variáveis e funções. Quando não estiver claro o suficiente, adicione comentários, mas as vezes boas escolhas de nomes dispensam comentários no código.

Em resumo, funções são muito importantes para resolver problemas que aparecem frequentemente. Ao invés de repetirmos código, criamos um novo comando do Python e usamos este comando em vários lugares.

Dica PRO: procure usar funções da biblioteca do Python 1

Tanto converter graus para radianos quanto o usar o número \(\pi\) são tarefas comuns em programas numéricos em Python. Por isso já existem a função math.radians e a constante math.pi que podemos usar diretamente em nossos programas. Por que reimplementamos isso então?

Nosso objetivo aqui é aprender a criar funções, então começamos pelo que tem de mais simples. Quando vocês estiverem mais proficientes conseguirão criar funções complexas, mas isso não ocorre no primeiro dia.

Exercise 9

Como já vimos um exemplo de como construir uma função. Vamos tentar exercitar um pouco?

Para isso, tente resolver o exercício Celsius para Fahrenheit.

Acessar exercício

Falando um pouco mais sobre argumentos de uma função#

Nos exemplos até o momento as funções recebem somente um argumento.

A função converte_milhas_para_km possui somente um argumento.

Mas podem ter casos em que a função precise receber mais de um argumento. Para resolver isso, basta colocar os argumentos separados por vírgulas.

Exemplos de funções recebendo múltiplos argumentos.

Exercise 10

Agora que descobrimos que as funções podem receber mais de um argumento, vamos resolver o exercício Velocidade média.

Acessar exercício

Exercise 11

Faça o exercício Movimento retilíneo uniforme.

Acessar exercício