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.
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:
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
Answer
Para utilizamos um pacote, usamos o comando import
seguido do nome do pacote.
Exercise 2
Exercise 3
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
Exercise 5
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.
Dessa forma, devemos passar os valores em radianos.
Exercise 6
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:
- se precisarmos mudar esse código temos agora um monte de lugares para mudar!
- é 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.
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:
Vamos entender o que está acontecendo, começando pelos nomes:
- O
converte_milhas_para_km
é o nome da nossa função em Python. Sempre que formos criar uma função em Python utilizamos a palavradef
seguida do nome que queremos dar à função. - 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. - As linhas 2 e 3 são chamadas de corpo ou bloco da função.
- 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ômetrosdistancia_km
precisamos devolver o valor calculado. Note que para devolver o valor precisamos colocar a palavrareturn
seguido pelo valor retornado. - 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
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
?
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
.
- Trocamos
nome_da_funcao
pelo nome que queremos dar a ela. No nosso caso, usaremosgraus_para_radianos
como nome. - Trocamos
argumento
porgraus
, que é a entrada da nossa função. - 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ávelresultado
com o valor calculado pela nossa função. - 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
Você deverá estar vendo código parecido com o abaixo. Alguns pontos de atenção:
- 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 quandograus_para_radianos
for chamada - a definição da função (linhas 3-5) deve estar antes das linhas de
print
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
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:
- primeiro computamos o resultado de
graus_para_radianos(30)
- esse valor é passado para
math.cos
- 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:
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
Falando um pouco mais sobre argumentos de uma função#
Nos exemplos até o momento as funções recebem 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.
Exercise 10
Exercise 11