
Passo 1 de 8
Definir não é executar
Entenda como uma função é definida e por que seu corpo só roda quando ocorre uma chamada.
Trilha de aprendizado · Nível 4 · Tutorial 1
Crie funções que recebam dados, realizem uma operação específica e devolvam resultados para o restante do programa.
Definir não é executar
Entenda como uma função é definida e por que seu corpo só roda quando ocorre uma chamada. 2 min
Receber dados com parâmetros
Aprenda a declarar parâmetros, fornecer argumentos e relacioná-los pela posição em cada chamada. 2 min
Devolver e aproveitar um resultado
Use return para devolver o resultado de uma função e empregue o valor da chamada em variáveis e novas expressões. 3 min
Imprimir não é retornar
Diferencie o texto exibido por print do valor entregue por return e reconheça quando uma chamada produz None. 3 min
Encerrar a chamada com return
Acompanhe caminhos condicionais e identifique onde cada chamada termina e qual valor ela devolve. 3 min
Retornar de dentro de um laço
Use return em uma busca para devolver o primeiro valor encontrado e encerrar a função no momento certo. 3 min
Devolver resultados em uma tupla
Aprenda a devolver dois resultados relacionados em uma única tupla e a distribuí-los para variáveis no código chamador. 2 min
Aplicação final: calcular o progresso de uma meta
Integre parâmetros, retornos condicionais, tuplas e desempacotamento em uma função completa executada no seu próprio computador. 3 min

Passo 1 de 8
Entenda como uma função é definida e por que seu corpo só roda quando ocorre uma chamada.
Uma função reúne uma operação sob um nome para que ela possa ser chamada novamente. A definição começa com def, seguida do nome, parênteses e dois-pontos. O corpo fica indentado.
Ao executar a instrução def, o Python disponibiliza o nome mostrar_boas_vindas para as linhas seguintes. Porém, isso ainda não executa o print que está no corpo.
Execute este código no Python 3. Nenhuma mensagem será exibida, pois ainda não há uma chamada.
def mostrar_boas_vindas():
print("Boas-vindas!")Depois da definição, escreva o nome da função seguido de parênteses para chamá-la. Cada chamada entra no corpo e executa suas instruções uma vez.
A mensagem aparece duas vezes: uma para cada chamada.
def mostrar_boas_vindas():
print("Boas-vindas!")
mostrar_boas_vindas()
mostrar_boas_vindas()O fluxo passa pela definição sem entrar no corpo. Somente ao chegar a uma chamada ele segue para o bloco indentado e depois continua no script.

A definição disponibiliza o nome; a chamada executa o corpo.
Considere o código abaixo e ordene os acontecimentos:
def anunciar():
print("Corpo executado")
print("Função definida")
anunciar()
print("Fim")
Passo 2 de 8
Aprenda a declarar parâmetros, fornecer argumentos e relacioná-los pela posição em cada chamada.
Na definição, os nomes entre parênteses são parâmetros. Na chamada, os valores ou expressões entre parênteses são argumentos.
Em chamadas posicionais simples, o primeiro argumento corresponde ao primeiro parâmetro, o segundo argumento ao segundo parâmetro, e assim por diante.
Ao executar a chamada, "Bia" corresponde a nome e "Recife" corresponde a cidade.
def apresentar(nome, cidade):
print(f"{nome} mora em {cidade}.")
apresentar("Bia", "Recife")
Na chamada apresentar("Bia", "Recife"), "Bia" ocupa a posição de nome e "Recife" ocupa a posição de cidade.
O corpo da função não precisa mudar para trabalhar com outros dados. Cada chamada fornece novos argumentos aos mesmos parâmetros.
Um argumento também pode ser uma expressão: ela é calculada, e seu resultado ocupa a posição correspondente.
As três chamadas executam o mesmo corpo com dados diferentes.
def mostrar_pedido(produto, quantidade):
print(f"Pedido: {quantidade} unidade(s) de {produto}")
mostrar_pedido("caderno", 2)
mostrar_pedido("caneta", 5)
mostrar_pedido("lápis", 1 + 2)Dica
Em mostrar_pedido("caneta", 5), "caneta" corresponde a produto, enquanto 5 corresponde a quantidade.
Relacione cada elemento à sua classificação ou correspondência correta.
Toque em um item e depois no par correspondente.
Considere a definição abaixo:
def exibir_pedido(produto, quantidade):
Complete com uma chamada que forneça "chá" para produto e 2 para quantidade. Digite a linha inteira.

Passo 3 de 8
Use return para devolver o resultado de uma função e empregue o valor da chamada em variáveis e novas expressões.
Dentro da função, return avalia uma expressão e entrega o valor obtido ao ponto em que a função foi chamada. Assim, a chamada passa a representar esse valor no restante do código.
Os argumentos 6 e 4 chegam à função. A expressão resulta em 24, que é devolvido e armazenado em area.
def calcular_area(base, altura):
return base * altura
area = calcular_area(6, 4)
print(area) # 24O fluxo tem duas direções: os argumentos entram na função e o resultado retorna ao ponto da chamada.

A chamada envia os argumentos e recebe de volta o valor produzido pela expressão do return.
Uma chamada com resultado pode aparecer onde um valor seria aceito. Você pode armazená-la em uma variável ou usá-la diretamente em outro cálculo.
Cada chamada de dobrar(9) vale 18. Na segunda expressão, esse valor participa da soma.
def dobrar(numero):
return numero * 2
resultado = dobrar(9)
com_bonus = dobrar(9) + 3
print(resultado) # 18
print(com_bonus) # 21Exemplo
Para acompanhar uma expressão, substitua mentalmente a chamada pelo valor retornado: dobrar(9) + 3 torna-se 18 + 3, cujo resultado é 21.
Complete a lacuna com a palavra-chave que devolve o resultado:
def calcular_total(quantidade, preco):
_____ quantidade * preco
Considere a função anterior completa. Qual valor fica em final?
final = calcular_total(3, 8) + 1

Passo 4 de 8
Diferencie o texto exibido por print do valor entregue por return e reconheça quando uma chamada produz None.
print apresenta informação na tela. Já return entrega um valor ao ponto do programa que fez a chamada.
Uma função que apenas imprime pode produzir uma saída visível e, ainda assim, não entregar esse valor para a atribuição.
Ao executar o script, observe separadamente a saída de dentro da função e o valor armazenado em resultado.
def mostrar_dobro(numero):
print(numero * 2)
resultado = mostrar_dobro(6)
print(resultado)
# Saída:
# 12
# None
print envia informação para a tela; return envia um valor de volta ao ponto da chamada.
Quando a função usa return, a chamada passa a valer o resultado devolvido. O código que fez a chamada pode armazená-lo e depois exibi-lo com print.
Agora resultado recebe o número 12. O print que apresenta esse número está fora da função.
def calcular_dobro(numero):
return numero * 2
resultado = calcular_dobro(6)
print(resultado)
# Saída:
# 12Dica
Ao ler uma chamada, verifique separadamente: “O que aparece na tela?” e “Qual valor a chamada entrega?”. As respostas podem ser diferentes.
Se a execução chega ao fim da função sem encontrar return, a chamada retorna implicitamente None. Escrever return sem uma expressão também encerra a chamada retornando None.
As duas chamadas produzem None, embora somente a primeira função apresente uma mensagem.
def avisar():
print("Processamento concluído")
def encerrar():
return
resultado_aviso = avisar()
resultado_encerramento = encerrar()
print(resultado_aviso)
print(resultado_encerramento)
# Saída:
# Processamento concluído
# None
# NoneDica
None indica que a chamada não entregou outro valor. Ele não substitui nem captura aquilo que print apresentou na tela.
Considere o script:
def mostrar_total(preco, frete):
print(preco + frete)
total = mostrar_total(30, 7)
print(total)Quais são, na ordem, as duas linhas exibidas? Qual valor fica armazenado em total? Explique por quê.
Escreva pelo menos 40 caracteres (0/40).

Passo 5 de 8
Acompanhe caminhos condicionais e identifique onde cada chamada termina e qual valor ela devolve.
Quando um caminho executa return, a chamada termina imediatamente. Nenhuma instrução posterior do corpo é executada nessa chamada. O valor retornado ocupa o lugar da chamada, e o programa continua no código chamador.
Com pontos igual a 12, a condição é verdadeira. A função devolve a mensagem imediatamente, sem executar o print que vem depois do bloco condicional.
def verificar_meta(pontos):
if pontos >= 10:
return "Meta atingida"
print("A meta ainda não foi atingida")
return "Continue"
situacao = verificar_meta(12)
print(situacao)O losango representa a condição. Ao alcançar um ponto de retorno, o fluxo sai da função e volta diretamente ao local da chamada.

Cada chamada percorre somente um caminho. Um return executado encerra esse percurso e devolve o controle ao código chamador.
Um return colocado depois de uma condição atende ao caminho que não retornou antes. Assim, os caminhos relevantes podem terminar com resultados previstos. Se algum caminho chegar ao fim do corpo sem executar return com valor, o resultado será None.
Para valores positivos ou negativos, a chamada termina dentro de uma condição. Se nenhuma condição for verdadeira, a execução chega ao retorno final.
def classificar_saldo(saldo):
if saldo > 0:
return "positivo"
if saldo < 0:
return "negativo"
return "zero"
print(classificar_saldo(8))
print(classificar_saldo(-3))
print(classificar_saldo(0))Dica
Comece pelo argumento recebido, avalie as condições na ordem e pare assim que encontrar um return executado. Não percorra linhas de outros caminhos.
Na chamada avaliar(7), o texto fim da função será exibido.
def avaliar(numero):
if numero > 5:
return "alto"
print("fim da função")
return "baixo"
resultado = avaliar(7)
print(resultado)Complete a última linha para que classificar_saldo(0) devolva o texto zero em vez de None.
def classificar_saldo(saldo):
if saldo > 0:
return "positivo"
if saldo < 0:
return "negativo"
______
Passo 6 de 8
Use return em uma busca para devolver o primeiro valor encontrado e encerrar a função no momento certo.
Em uma busca, return pode ficar dentro do for. Quando um valor atende à condição, ele é devolvido imediatamente: o laço para e a chamada inteira termina. Por isso, apenas o primeiro valor adequado é retornado.
A função examina os valores na ordem da lista.
def primeiro_acima(valores, limite):
for valor in valores:
if valor > limite:
return valor
return None
resultado = primeiro_acima([4, 12, 15], 10)
print(resultado) # 12O return None deve ficar depois do laço. Esse ponto só é alcançado quando nenhum item provocou o retorno anterior. Se a lista estiver vazia, o corpo do for nem será executado e a função também chegará diretamente a return None.
Nos dois casos, a busca termina sem encontrar um valor acima do limite.
print(primeiro_acima([2, 5, 8], 10)) # None
print(primeiro_acima([], 10)) # NoneAtenção
Colocar return None dentro do laço faria a função encerrar após o primeiro valor que não atende à condição. Em [4, 12, 15], ela devolveria None ao examinar 4 e nunca chegaria ao 12.
Dentro de um laço, return encerra a função e entrega um resultado ao código chamador. Já break interrompe apenas o laço; a execução pode continuar nas instruções seguintes da mesma função.
Esta versão guarda o valor, interrompe o laço e só depois retorna.
def primeiro_acima_com_break(valores, limite):
encontrado = None
for valor in valores:
if valor > limite:
encontrado = valor
break
return encontrado
print(primeiro_acima_com_break([4, 12, 15], 10)) # 12Compare até onde cada instrução conduz o fluxo de execução.

return vai diretamente ao código chamador; break continua depois do laço.
O que primeiro_acima([4, 12, 15], 10) retorna?
Uma instrução break executada dentro de um for sempre encerra a função inteira.
Onde deve ficar return None para representar corretamente uma busca sem resultado, inclusive em uma lista vazia?

Passo 7 de 8
Aprenda a devolver dois resultados relacionados em uma única tupla e a distribuí-los para variáveis no código chamador.
Uma função pode agrupar dois resultados em uma tupla. Para isso, escreva os valores separados por vírgula depois de return.
Embora existam dois elementos, a chamada devolve um único objeto: a tupla que contém ambos.
A função calcula horas completas e minutos restantes.
def converter_minutos(total_minutos):
horas = total_minutos // 60
minutos = total_minutos % 60
return horas, minutos
resultado = converter_minutos(135)
print(resultado) # (2, 15)
Os dois valores saem agrupados em uma tupla; não são dois retornos executados separadamente.
Você pode armazenar a tupla completa em uma variável ou desempacotar seus elementos diretamente.
No desempacotamento, a ordem deve corresponder ao return: o primeiro resultado vai para o primeiro nome, e o segundo vai para o segundo nome.
Compare o armazenamento da tupla completa com o desempacotamento direto.
# Armazena a tupla completa
resultado = converter_minutos(185)
print(resultado) # (3, 5)
# Desempacota diretamente
horas, minutos = converter_minutos(185)
print(horas) # 3
print(minutos) # 5Associe cada trecho ao que ele faz.
Toque em um item e depois no par correspondente.
Complete apenas a instrução return:
def converter_minutos(total_minutos):
horas = total_minutos // 60
minutos = total_minutos % 60
return ____Complete os destinos para que cada resultado seja armazenado separadamente:
____ = converter_minutos(250)Depois da chamada, os valores devem ser 4 horas e 10 minutos.

Passo 8 de 8
Integre parâmetros, retornos condicionais, tuplas e desempacotamento em uma função completa executada no seu próprio computador.
No seu editor, crie uma função chamada calcular_progresso com dois parâmetros: pontos e meta.
Considere que pontos sempre será um número inteiro não negativo e que meta sempre será um número inteiro positivo. Não é necessário validar as entradas.
A função deve devolver, nesta ordem:
Se os pontos forem iguais ou superiores à meta, devolva 0 e "Meta atingida". Caso contrário, devolva a diferença entre a meta e os pontos, junto de "Continue avançando".
Os dois argumentos entram na função. Depois da comparação, um único objeto — uma tupla com dois elementos — volta ao ponto da chamada e é distribuído para duas variáveis.

Mantenha a mesma ordem nos dois retornos: primeiro os pontos que faltam; depois, a mensagem.
Crie um arquivo Python, escreva a função e acrescente as três conferências abaixo. Use return dentro da função. Faça o desempacotamento e o print fora dela.
Execute o arquivo com Python 3 e compare exatamente os números e as mensagens exibidos.
Acrescente estas chamadas abaixo da sua definição. Elas verificam um valor abaixo, outro exatamente no limite e outro acima da meta.
faltam, situacao = calcular_progresso(70, 100)
print(faltam, situacao)
faltam, situacao = calcular_progresso(100, 100)
print(faltam, situacao)
faltam, situacao = calcular_progresso(120, 100)
print(faltam, situacao)Exemplo
A execução deve exibir:
30 Continue avançando
0 Meta atingida
0 Meta atingidaNos dois últimos casos, a quantidade que falta é 0: atingir ou ultrapassar a meta segue o mesmo caminho condicional.
Quais foram as três saídas observadas? Explique também por que a função usa return, enquanto o código após a chamada usa print.
Escreva pelo menos 80 caracteres (0/80).
Compare esta solução com a sua. Cada caminho devolve uma tupla na mesma ordem, permitindo o mesmo desempacotamento após qualquer chamada.
def calcular_progresso(pontos, meta):
if pontos >= meta:
return 0, "Meta atingida"
return meta - pontos, "Continue avançando"
faltam, situacao = calcular_progresso(70, 100)
print(faltam, situacao)
faltam, situacao = calcular_progresso(100, 100)
print(faltam, situacao)
faltam, situacao = calcular_progresso(120, 100)
print(faltam, situacao)Resumo
Nesta aplicação, a função recebe dados, escolhe um caminho e devolve resultados que o restante do programa pode aproveitar.
def define a função; o corpo é executado somente quando ocorre uma chamada.pontos e meta são parâmetros; 70 e 100, por exemplo, são argumentos de uma chamada.return encerra a chamada atual e devolve uma tupla com dois resultados na mesma ordem.faltam e situacao.print exibe os valores fora da função; ele não substitui return.None.Parabéns! Você concluiu: Definir funções com parâmetros e retorno
100 XP
Milhares de cursos online em vídeo, ebooks e áudiobooks.
Para testar seus conhecimentos no decorrer dos cursos online
Gerado diretamente na galeria de fotos do seu celular e enviado ao seu e-mail
Baixe nosso aplicativo pelo QR Code ou pelos links abaixo:.
+ de 10 milhões
de alunos
Certificado grátis e
válido em todo o Brasil
60 mil exercícios
gratuitos
4,8/5 classificação
nas lojas de apps
Cursos gratuitos em
vídeo, ebooks e audiobooks