Funções

Teoria Completa

Utilidade das funções

Funções são blocos de código que você consegue salvar pra reutilizar. Quando você declara uma função, você tá salvando um “modelo” de código, que fica guardadinho esperando você precisar. Sempre que precisar, tu pode chamar a sua função que você já criou e aquele bloco de código vai ser executado pra você. É muito útil pra evitar códigos repetitivos. Sempre que você tiver um conjunto de códigos que servem pra uma tarefa específica, o ideal é você colocar dentro de uma função. Agora vem comigo que vou te mostrar como se cria uma função!

Estrutura geral de funções

Geralmente as funções têm essa cara

A palavra-chave “def” específica que o que vem a seguir é uma função, é uma representação interna de python e você precisa usar sempre que quiser criar uma função. Você pode lembrar que você precisa DEFinir uma função.

Em seguida, você põe um nome arbitrário pra sua função. Mas não esquece que bons nomes são importantes pra não confundir sua cabecinha durante a prova, ok?! Além disso, os parâmetros ali são uma sequência de variáveis pré-criadas, separadas por vírgulas, pra ser usada na função. As variáveis criadas como parâmetros podem ser definidas de fora da função. Uma função pode não tem nenhum parâmetro, mas mesmo assim você precisa colocar os parênteses vazios, okay?! Mas pra você entender melhor, nada melhor que criar uma função na prática daqui a pouquinho. Dá uma segurada aí!

Palavra-chave return

No corpo da função, você pode digitar qualquer sequência de código. Assim como você digitaria fora de funções. Lembre-se que funções guardam código pronto. Mas, somente dentro de funções você pode usar a palavra-chave return. Esse comando tem duas utilidades.

Primeiramente, ele define o fim da função. Quando o comando return for executado, a função acaba imediatamente, ok?!

Segundamente, esse comando devolve pro código que chamou a função o resultado da expressão que você colocar junto com o return. Você vai entender tudo agora no exemplo, eu juro.

Exemplo de função

Vamos criar uma função responsável por calcular a área de triângulos

Primeiro a gente disse que quer definir uma função, usando a palavra-chave “def”. Depois, criamos um nome arbitrário, mas repara que ele é bem autoexplicativo. Vamos precisar do nome pra chamar a função quando a gente quiser.

Em seguida, abrimos parênteses e criamos dentro duas variáveis. Essas variáveis são especiais, chamadas parâmetros, porque podem ser definidas externamente. Você vai entender melhor a utilidade delas nas próximas linhas do código.

Depois de definir o cabeçalho da função, colocamos “:” e partimos pro corpo da função, na linha seguinte. Repara que todo código que a gente quer que faça parte da função é colocado uma indentação a frente. Isto é, o corpo da função começa um pouco mais à direita que o cabeçalho. Esse espaçamento é dado apertando a tecla TAB, que fica embaixo do seu botão de aspas no teclado. Essa tecla se parece com isso:

Logo na primeira linha do corpo da função, nós usamos a palavra-chave “return”. Essa palavra-chave diz que a nossa função deve parar e retornar o valor da expressão que vem depois. Nesse caso, retorna o resultado da expressão “base * altura / 2”. Caso você não seja um ser humaninho bom de memória, é a fórmula da área do triângulo beleza?!

Olha o que a gente tá fazendo em baixo

Colei a mesma imagem aqui pra você não ter que ficar subindo toda hora

Criamos uma variável chamada “triangulo_1” e colocamos dentro dela o resultado de area_triangulo(4,6). Isso significa que o valor dentro de triangulo_1 vai ser o resultado da expressão no return da função, mas considerando base = 4 e altura = 6. Isso porque a gente passou, em ordem, esses valores dentro dos parênteses. As variáveis que recebem esses valores externos na função são chamados parâmetros, e os valores externos que a gente coloca dentro são chamados argumentos. Nesse caso, “base” e “altura” são os parâmetros e “4” e “6” são argumentos.

Em baixo a gente fez a mesma coisa pra uma outra variável, mas usando valores de base e altura diferentes. O resultado depois de executar esse programa é assim:

Viu, a gente conseguiu reaproveitar o código responsável por calcular a área do triângulo e usar em dois lugares diferentes, sem muito esforço. Ok, eu assumo, calcular a área do triângulo era uma tarefa simples, mas você pode usar a técnica das funções pra fazer reaproveitamento de código. Todo código que se repete de forma igual ou parecida deve ser colocado dentro de uma função, ok?!

Escopo de funções

Cada função tem seu corpo, e esse corpo é privado. Não é possível acessar o código escrito dentro de uma função externamente. Isso significa que toda variável que você criar dentro de uma função só existe dentro dela, sendo impossível acessar de outros lugares. Olha, outro exemplo:

Se liga que essa função não tem a palavra-chave “return”. Não é obrigatório usar, mas aí sua função não retorna nada. Logo, você não pode fazer variável = função(). Repara que eu chamei a função pelo nome, sem passar nenhum parâmetro, e não coloquei dentro de nenhuma variável.

Variáveis globais

Quando a gente cria variáveis dentro das funções, é impossível acessar de fora delas. Mas o oposto também é parecido! Normalmente, a gente apenas consegue ler variáveis globais de dentro de função, mas não consegue alterar elas! Olha:

Viu? A gente consegue ler o valor das variáveis de fora das funções, mas a gente NÃO consegue escrever nelas. Mas existe uma forma da gente conseguir permissão pra alterar essas variáveis, e a gente pede essa permissão com a palavra-chave “global”.

Mas saca que a gente tá alterando a variável global, hein!! Olha só:

O resultado do último print vai ser 246!!

Funções built-in

Você aprendeu a criar funções agora, mas a verdade é que você já vem usando funções há muito tempo. Todos aqueles comando, print(), input(), int(), etc, são todos funções! Essas funções já vieram prontas, programadas pelos criadores de Python. Elas são chamadas built-in porque já vem dentro de Python, sacou?!

Beleza, que venham os exercícios!! Valeuuu

Expandir

Exercício Resolvido #1

PUC-Rio

Faça uma função que receba uma lista de números armazenados de forma crescente, e dois valores ( limite inferior e limite superior), e exiba a sublista cujos elementos são maiores ou iguais ao limite inferior e menores ou iguais ao limite superior.

Exemplo:

lista inicial=[12,14,15,16,18,20,24,26,28,32,34,38]

limite inferior=13

limite superior = 26

lista exibida: [14,15,16,18,20,24,26]

MOSTRAR SOLUÇÃO COMPLETA

Passo 1

Fala aí! É muito bom quando o enunciado fornece dados de teste! Hahah primeiramente, vamos escrever nossos dados de teste no nosso programa.

Agora, precisamos escrever uma função que receba esses dados e exiba [14,15,16,18,20,24,26]. Beleza, vamos lá! Pra criar uma função, usamos a palavra-chave def, damos um nome pra nossa função e depois os parâmetros, entre parênteses.

Passo 2

Pra isso, vamos criar uma nova lista e adicionar nela os elementos que satisfazem a condição.

Aqui a gente criou uma outra lista com nome de sublista, e fizemos o cabeçalho do nosso loop. Esse loop vai percorrer cada item da lista que a gente recebeu. No fim, precisamos exibir a lista resultante, então eu já até coloquei o print(sublista) ali.

Passo 3

Pra gente checar se o item tá entre os limites menor e maior, recebido como parâmetro, vamos usar um if.

Se liga que a gente usou “maior ou igual” e “menor ou igual”. Isso é porque no enunciado a resultante incluiu o 26. Se liga que se a gente quisesse todos os elementos menores, o 26 não viria junto. Esse dado foi uma dica que o enuncado deu. Agora, vamos escrever o código que acrescenta itens na sublista.

Pronto! Nessa função, será exibida a lista dentro dos limites recebidos como parâmetro. Pra gente testar, vamos chamar a função com os parâmetros de teste no fim do programa.

Viu?! Quando executar, o resultado vai ser igualzinho ao do professor. Mas se liga que o enunciado pediu só a função, não pediu os dados de teste e nem o teste. Por isso, vamos deixar no código só a função.

Pronto! Agora sim a gente concluiu o exercício! Até mais, cara!

Resposta

Exercício Resolvido #2

UFRN- 2019

Python é uma linguagem de programação de alto nível, interpretada, orientada a objetos, funcional, de tipagem dinâmica e forte. Levando isso em conta, analise o código em Python abaixo. 

Nesse caso, ao executar o programa, o valor impresso será?

MOSTRAR SOLUÇÃO COMPLETA

Passo 1

Fala aí! Esse exercício não requer que a gente escreva, mas sim que a gente pense sobre o funcionamento das funções. O resultado de uma função é dado pelo valor junto a palavra-chave “return”. Por isso, é possível notar que a função e() do enunciado retorna o quadrado do valor que a gente passar como parâmetro. Porém, quando e(b) é, o valor retornado não está sendo salvo em nenhuma variável, e nem sendo usado pra nada! O ponto é que a função NÃO modifica a variável “a”. Por isso, o resultado de print(e(a)) é 100 (o quadrado de a = 10).

Resposta

100

Exercício Resolvido #3

Unicamp, 2016

Escreva uma funcão reps em Python que recebe uma lista e retorna uma outra lista contendo apenas os elementos que aparecem duas ou mais vezes na lista de entrada.

Exemplo:

MOSTRAR SOLUÇÃO COMPLETA

Passo 1

Beleza, o professor MANDOU a gente fazer uma função chamada reps que RETORNA (e não exibe) uma lista que só tenha os números repetidos na primeira. Vamos começar criando a função.

Agora, precisamos pensar sobre como descobrir se um item se repete ou não. Ok, existe uma função nativa de Python que faz isso, mas com certeza seu professor não quer que você use, ok?! A ideia é usar repetições... Então, vamo lá! Vamos começar criando a lista que a gente vai retornar depois.

Passo 2

Beleza, agora precisamos lidar com a lógica de pegar duplicatas. Uma ideia é a gente iterar por toda lista que recebemos. Quando a gente usa a função index() pra perguntar o índice de um elemento em uma lista, recebemos sua primeira aparição. A gente pode usar isso! Caso o index atual seja diferente da primeira aparição, então é uma duplicata.

E se item for uma duplicata, então a gente adiciona ele na lista de duplicados!

Passo 3

Parece tudo lindo, mas esse código ainda tem um problema. Se existir um mais de uma repetição, ele vai adicionar duas vezes à lista de retorno, e isso não é o que a gente quer.

O ideal é que a gente não tenha itens repetidos na resposta. Pra isso, a gente precisa checar se o item já existe na lista duplicados antes de adicionar!

Agora sim, deu bom! Vamos testar com os dados que o professor passou.

Passo 4

Ops! Apesar da lógica estar funcionando, o resultado não está igual ao do professor. No exemplo, a lista retornada está ordenada. Ele não diz que temos que ordenar também, mas é sempre bom deixar igualzinho! Pra isso, vamos retornar a versão sorted() da nossa lista.

Agora sim! Ficou perfeito!! Mas a gente não pode esquecer de tirar do código o que não foi pedido. O enunciado pede a função, então vamos deixar só a função.

Prontinho! Essa é a nossa resposta. Te espero no próximo exercício!

Resposta

Exercício Resolvido #4

PUC-Rio

Faça uma função que receba uma lista e exiba os elementos da última metade na frente dos elementos da primeira metade.

MOSTRAR SOLUÇÃO COMPLETA

Passo 1

Beleza, vamos criar nossa função. Nesse caso o enunciado não especificou o nome, então podemos dar qualquer nome pra nossa função.

Já se liga que o enunciado diz “EXIBA”, e não “retorne”. Quando é pra exibir, usamos print. Quando é pra retornar, “return”. Nesse caso, sabemos que vamos fazer uma nova lista e exibi-la no final. Vamos começar fazendo a parte que a gente já sabe.

Show! Agora só precisamos pensar numa lógica que faça o que o enunciado pede.

Passo 2

Pô, a gente precisa pegar a lista da metade em diante e concatenar com a primeira metade. A primeira coisa que precisamos saber pra isso é: QUAL É A METADEEE?

Bom, a metade é ½ do tamanho da lista, e o tamanho a gente pode descobrir com a função len().

Cara, repara que eu usei “//” (divisão inteira) em vez de “/” (divisão normal). Isso porque a gente vai usar índices e não existe índice fracionário. Se o número de elementos na lista for par, não existe um número exatamente no centro. Por isso, temos que arredondar a metade usando o operador de divisão inteira.

Passo 3

Beleza, agora a gente já tem o índice da metade da lista. Vamos fazer a nossa concatenação!

E pronto! A gente uniu a lista da metade até o fim com a mesma lista do início até a metade, exatamente como pediu o enunciado.

Assim, acabamos de matar a questão. Infelizmente o enunciado não nos deu dados de teste, mas a gente pode inventar uns dados pra testar.

Depois de testar, vimos que tudo funcionou na moral! Então, vamos tirar os testes que a gente fez e finalizar a questão.

Resposta

Exercício Resolvido #5

Elaboração Própria

Crie uma função que permita contar o número de vezes que aparece uma letra em uma string.

MOSTRAR SOLUÇÃO COMPLETA

Passo 1

Fala, povo lindo! Se liga, a questão a gente criar uma função que conta quantas vezes uma determinada letra aparece em uma determinada string. Mas como vamos fazer isso?!

Bom, a nossa função precisa de duas informações pra funcionar: a letra e a string! Então, esses vão ser nossos parâmetros (caso tu não lembre, os parâmetros são as informações externas que uma função pode receber). Se liga em como vai ser a cara da nossa função:

Mas não esquece que o nome é arbitrário, jae? Eu que escolhi, e poderia ser qualquer nome! O ideal, no entanto, é usar nomes bem autoexplicativos, ok?! Belezaaa! Já temos a estrutura da nossa função, e precisamos só digitar o código dela. Bom, como podemos calcular o número de vezes que uma letra aparece na string?

Vamos ter que checar letra por letra. E, pra isso, bora usar o laço de repetição for!

Passo 2

Vamos criar uma estrutura de repetição que nos possibilite verificar cada uma das letras da string separadamente.

Olha esse for! Desse jeito, o código dentro do escopo do for vai ser executado pra cada uma das letras da string, e a letra vai estar dentro da variável “item” (nome que a gente escolheu, poderia ser qualquer outro nome). Bom, agora, a gente precisa saber se esse item é igual a letra que a gente recebeu como parâmetro.

Pronto! Dentro do escopo do if, a letra atual do loop é igual a letra que recebemos como parâmetro, então temos que contar pra resposta final. MAS COMO A GENTE FAZ PRA CONTAR?

Ah, a gente pode criar uma variável antes do loop e, a cada vez que encontrarmos um item igual a letra recebida, a gente soma 1!

Sacou? A gente inicializa a variável com 0 e, a cada ocorrência a gente soma 1 nela. No fim do loop for a gente vai ter a quantidade de aparições da letra na string. Aí a gente só precisa retornar esse resultado. Pra retornar a resposta, a gente usa a palavra-chave return.

Prontinho, irmão! Só falta dar aquela testadinha de leve pra ver se a gente fez tudo certo.

Passo 3

Pra testar, eu vou chamar essa função dentro de um print() do lado de fora da função.

Olha, contando ali, a string “responde aí” tem duas letras “e”. Vamo executar o programa pra ver se a função tá contando certo!

Opa! Contou certinho! Aeeee! Mas cara, não esquece que o enunciado pediu só a função. A gente digitou uns códigos depois pra fazer testes, mas depois que a gente testa, temos que apagar, jae? É isso aí, até a próxima, irmãozinho!

Resposta

Exercício Resolvido #6

UFRJ, Adaptado

Escreva uma função que, dado o valor da conta de um restaurante, calcule e exiba a gorjeta do garçom, considerando 10% do valor da conta.

MOSTRAR SOLUÇÃO COMPLETA

Passo 1

Fala aí, browww! O enunciado quer uma função que calcule e exiba 10% do valor da conta.

Mas cara, pra nossa função funcionar a gente precisa de uma informação externa: o valor da conta, pô! Então, esse vai ser nosso parâmetro!

O nome da função foi escolhido por mim mesmo. É completamente arbitrário e pode se chamar como você quiser, mas é boa ideia dar nomes intuitivos, jae?! Agora, precisamos calcular a gorjeta do garçom...

Passo 2

Cara, pra calcular a gorjeta a gente só precisa pegar 10% do valor da conta, e isso é a mesma coisa que multiplicar a conta por 0.1.

Bora escrever essa conta em Python então!

Pronto! Agora a gente só precisa exibir. Se liga que o enunciado não tá mandando a gente retornar o valor, e sim exibir. Então não vamos usar a palavra-chave return, e sim a função print().

Pronto! Desse jeito, a função vai calcular e exibir o valor da gorjeta, mas não vai exibir nada. Se liga também que a gente colocou ali uma formatação de string (usando % na string, dentro do print()). Se tu não tá ligado em formatação de string, eu recomendo que tu dê uma olhadinha no tópico de operações com string daqui da playlist. É rapidinho, papo reto!

Passo 3

Show! Agora, bora testar essa função. Pra isso, vou chamar a função depois.

Mas se liga que, como a função não retorna nada (não tem a palavra-chave return), a gente não pode colocar dentro de outra função ou dentro de nenhuma variável. A gente chama ela seco mesmo. Olha outras formas que estariam erradas:

Esses códigos só funcionariam se a função tivesse retorno. Como não tem, a gente não pode fazer isso, ok?! Tem que ser assim mesmo:

E o resultado disso, quando executamos, é o seguinte:

Aí sim, funcionou na moral!!

Não esquece que o enunciado pediu só a função, mano. Então a gente apaga os códigos de teste e entrega só a função, hein! Valeuuu

Resposta

Exercício Resolvido #7

Elaboração Própria

Crie uma função que receba duas palavras e retorne True caso a primeira palavra seja um prefixo da segunda. Exemplo: ’uf’ é prefixo de ’ufabc’. ’ufabc’ não é prefixo de ’uf’.

MOSTRAR SOLUÇÃO COMPLETA

Passo 1

Fala aí, maninho! A gente precisa saber se uma palavra é prefixo de outra, e pra isso a gente precisa checar se uma palavra é igual ao início de outra. E a gente sabe fazer isso?? Não!

Mentira, a gente sabe sim. Mas é importante tu sacar que pra fazer nossa função, a gente vai precisar de duas informações externas: a palavra e o sufixo. Aí a gente consegue conferir se realmente é sufixo ou não! Então, esses dois dados vão ser nossos parâmetros.

Eu escolhi um nome que eu achei legal, ok? Os nomes das funções são a gente mesmo que escolhe, mas é sempre uma boa ideia escolher nome autoexplicativos. Mas ok, agora a gente precisa fazer a verificação. Vamo lá!

Passo 2

Cara, primeiro, bora pensar um pouco sobre uma palavra ser prefixo de outra. Olha essas duas palavras:

Sacou que uma é igual ao início da outra?

Show! A gente precisa fazer essa verificação, mas pra isso a gente precisa saber o tamanho do prefixo pra pegar fatia da palavra. Vai ficar mais claro na prática, se liga só:

Sacou? A gente pega a fatia do início da palavra, do mesmo tamanho do prefixo, e confere se eles são iguais. Se forem iguais, retornamos True, e False caso contrário. Mas calma… Tá funcionando, mas tem uma certa redundância nesse código!

Se liga que a expressão relacional (com o == ali no if) já retorna pra gente True ou False. A gente tá basicamente dizendo “se for True retorna True, e se for False então retorna False”. Cara, não parece redundante? A gente só precisa retornar o resultado da expressão relacional direto!

Se ligou? O resultado da função vai ser o resultado da expressão que passamos no return, e assim evitamos fazer um if desnecessariamente. Ok, agora só falta a gente testar!

Passo 3

Pra testar, eu vou chamar essa função dentro de um print() do lado de fora da função.

E agora bora executar pra ver. Olhando aqui, nos dois primeiros tem que dar True e False no último. Vamo ver...

E foi exatamente o que a função retornou!

Mas não esquece de apagar os códigos de teste antes de entregar o código, hein!

Valeu, maninhooo! Até a próxima questão!

Resposta

Exercício Resolvido #8

Elaboração Própria

Escreva uma função que aceita uma string como parâmetro e retorna um número inteiro. A função deve imprimir o resultado da substituição de todos os espaços do seu parâmetro pelo caractere ‘-’, e retorna o número de substituições feitas.

MOSTRAR SOLUÇÃO COMPLETA

Passo 1

E aí, seu doido! Cara, às vezes o enunciado manda exibir e às vezes manda retornar. Nessa questão tá mandando fazer os dois.

Mas relaxa, a gente vai conseguir! Se liga que nessa questão o enunciado já até diz quais são os parâmetros que vamos receber, então é de boa pra gente fazer a estrutura da nossa função! Só precisamos receber uma string.

Mas maninho, o nome da função e o nome dos parâmetros são completamente arbitrários, ok? A gente dá o nome que a gente quiser mesmo. É sempre bom escolher nomes autoexplicativos, mas se a tu quiser chamar a função de Enzo tu pode, jae?!

Beleza! A gente vai precisar checar todas as letras da string procurando por espaços. Pra isso, a gente vai precisar do laço for.

Passo 2

Se liga, bora criar um laço de repetição que nos permita verificar cada uma das letras da string se ela é igual a “ “ (espaço).

Pronto! Desse jeito, a variável “letra” vai variar pra todas as letras na variável “string”. Aí a gente pode verificar quantas vezes essa letra é um espaço.

Pronto! Dentro do escopo do if, a letra atual do loop é igual a espaço, então temos que contar pra resposta final. Mas como que faz pra contar?!

Pô, a gente pode criar uma variável e, a cada vez que for igual a espaço, a gente soma um!

Pronto! Se ligou? No final do loop a gente vai ter a quantidade de espaços dentro da variável “contador”. Mas isso ainda não é tudo que o enunciado pede. A gente ainda precisa exibir a variável substituindo esses espaços por ‘-’.

Passo 3

Mas calma, segura aí, olha a lógica que a gente pode seguir: criar uma variável string vazia, e a cada loop a gente concatena a letra atual do loop nessa variável, a menos que seja um espaço. Se for espaço, a gente concatena ‘-’. Sacou? Vamos aos códigos então!!

Viu? Levando em consideração que o for passa por uma letra de cada vez da string, se a gente adicionar a letra em “resultado” em todos os loops, no fim resultado vai ser igual a string. O que a gente tá fazendo é concatenar a letra só se ela for diferente de espaço, e concatenando “-” se for igual a espaço.