Trilha de aprendizado · Nível 4 · Tutorial 1

Definir funções com parâmetros e retorno

Crie funções que recebam dados, realizem uma operação específica e devolvam resultados para o restante do programa.

  • Nível: Iniciante
  • Duração: 20 min
  • 8 passos
Definir funções com parâmetros e retorno

O que você vai percorrer

  1. Definir não é executar Entenda como uma função é definida e por que seu corpo só roda quando ocorre uma chamada. 2 min
  2. Receber dados com parâmetros Aprenda a declarar parâmetros, fornecer argumentos e relacioná-los pela posição em cada chamada. 2 min
  3. 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
  4. 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
  5. Encerrar a chamada com return Acompanhe caminhos condicionais e identifique onde cada chamada termina e qual valor ela devolve. 3 min
  6. 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
  7. 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
  8. 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

O que você vai aprender

  • Definir e chamar uma função com parâmetros, distinguindo a definição da execução de seu corpo.
  • Usar return para devolver resultados e encerrar uma chamada, inclusive em caminhos condicionais.
  • Distinguir a exibição com print do retorno de um valor e reconhecer quando uma função retorna None.
  • Retornar resultados agrupados em uma tupla e aproveitá-los no código que chamou a função.

Antes de começar

  • Criar variáveis e reconhecer tipos básicos
  • Selecionar caminhos com if, elif e else
  • Agrupar e desempacotar valores com tuplas

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.

Uma operação com nome

Defina agora, execute depois

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.

Apenas a definição

Execute este código no Python 3. Nenhuma mensagem será exibida, pois ainda não há uma chamada.

python
def mostrar_boas_vindas():
    print("Boas-vindas!")

A chamada executa o corpo

Os parênteses fazem a diferença

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.

Definição e duas chamadas

A mensagem aparece duas vezes: uma para cada chamada.

python
def mostrar_boas_vindas():
    print("Boas-vindas!")

mostrar_boas_vindas()
mostrar_boas_vindas()

Fluxo da execução

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.

Diagrama em que o fluxo passa pela definição de uma função e só entra no corpo ao encontrar uma chamada posterior.

A definição disponibiliza o nome; a chamada executa o corpo.

Coloque os acontecimentos em ordem

Rastreie o script

Considere o código abaixo e ordene os acontecimentos:

def anunciar():
    print("Corpo executado")

print("Função definida")
anunciar()
print("Fim")
  1. A mensagem “Função definida” aparece.
  2. A mensagem “Corpo executado” aparece.
  3. O nome `anunciar` fica disponível.
  4. A chamada `anunciar()` executa o corpo.
  5. A mensagem “Fim” aparece.

Passo 2 de 8

Receber dados com parâmetros

Aprenda a declarar parâmetros, fornecer argumentos e relacioná-los pela posição em cada chamada.

Da chamada para os parâmetros

Nomes que recebem dados

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.

Dois parâmetros e dois argumentos

Ao executar a chamada, "Bia" corresponde a nome e "Recife" corresponde a cidade.

python
def apresentar(nome, cidade):
    print(f"{nome} mora em {cidade}.")

apresentar("Bia", "Recife")

Correspondência por posição

Diagrama ligando o primeiro argumento ao primeiro parâmetro e o segundo argumento ao segundo parâmetro.

Na chamada apresentar("Bia", "Recife"), "Bia" ocupa a posição de nome e "Recife" ocupa a posição de cidade.

Uma definição, diferentes dados

Reutilize a mesma operação

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.

Chamadas com argumentos diferentes

As três chamadas executam o mesmo corpo com dados diferentes.

python
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

Leia pelas posições

Em mostrar_pedido("caneta", 5), "caneta" corresponde a produto, enquanto 5 corresponde a quantidade.

Parâmetro ou argumento?

Associe os elementos

Relacione cada elemento à sua classificação ou correspondência correta.

Toque em um item e depois no par correspondente.

Complete a chamada

Forneça os dois argumentos

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

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.

O valor volta para quem chamou

Entregue o resultado com return

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.

Retornando uma área

Os argumentos 6 e 4 chegam à função. A expressão resulta em 24, que é devolvido e armazenado em area.

python
def calcular_area(base, altura):
    return base * altura

area = calcular_area(6, 4)
print(area)  # 24

Fluxo de entrada e retorno

O fluxo tem duas direções: os argumentos entram na função e o resultado retorna ao ponto da chamada.

Diagrama com os valores 6 e 4 entrando em uma função de multiplicação e o resultado 24 voltando ao ponto da chamada.

A chamada envia os argumentos e recebe de volta o valor produzido pela expressão do return.

A chamada participa de expressões

Use o valor devolvido

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.

Atribuição e cálculo posterior

Cada chamada de dobrar(9) vale 18. Na segunda expressão, esse valor participa da soma.

python
def dobrar(numero):
    return numero * 2

resultado = dobrar(9)
com_bonus = dobrar(9) + 3

print(resultado)  # 18
print(com_bonus)  # 21

Exemplo

Substitua mentalmente a chamada

Para acompanhar uma expressão, substitua mentalmente a chamada pelo valor retornado: dobrar(9) + 3 torna-se 18 + 3, cujo resultado é 21.

Pratique o fluxo do resultado

Complete a função

Complete a lacuna com a palavra-chave que devolve o resultado:

def calcular_total(quantidade, preco):

_____ quantidade * preco

Determine o valor da expressão

Considere a função anterior completa. Qual valor fica em final?

final = calcular_total(3, 8) + 1

Passo 4 de 8

Imprimir não é retornar

Diferencie o texto exibido por print do valor entregue por return e reconheça quando uma chamada produz None.

Dois destinos diferentes

O que aparece não é o que retorna

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.

A função exibe 12, mas não o devolve

Ao executar o script, observe separadamente a saída de dentro da função e o valor armazenado em resultado.

python
def mostrar_dobro(numero):
    print(numero * 2)

resultado = mostrar_dobro(6)
print(resultado)

# Saída:
# 12
# None

Saída na tela e valor retornado

Comparação em duas rotas: print conduz o resultado até uma tela, enquanto return conduz o resultado de volta até uma variável.

print envia informação para a tela; return envia um valor de volta ao ponto da chamada.

Retornar primeiro, exibir depois

O código chamador decide como usar o valor

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.

O valor é devolvido e aproveitado

Agora resultado recebe o número 12. O print que apresenta esse número está fora da função.

python
def calcular_dobro(numero):
    return numero * 2

resultado = calcular_dobro(6)
print(resultado)

# Saída:
# 12

Dica

Faça duas perguntas

Ao ler uma chamada, verifique separadamente: “O que aparece na tela?” e “Qual valor a chamada entrega?”. As respostas podem ser diferentes.

Quando o resultado é None

Ausência de um valor retornado

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.

None implícito e explícito

As duas chamadas produzem None, embora somente a primeira função apresente uma mensagem.

python
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
# None

Dica

None não é o texto impresso

None indica que a chamada não entregou outro valor. Ele não substitui nem captura aquilo que print apresentou na tela.

Preveja saída e resultado

Analise sem executar primeiro

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

Encerrar a chamada com return

Acompanhe caminhos condicionais e identifique onde cada chamada termina e qual valor ela devolve.

O ponto final de uma chamada

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.

Um caminho que termina cedo

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.

python
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)

Fluxo da chamada

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.

Fluxograma com uma chamada entrando em uma função, uma condição dividindo o fluxo e cada retorno levando de volta ao código chamador.

Cada chamada percorre somente um caminho. Um return executado encerra esse percurso e devolve o controle ao código chamador.

Um resultado para cada caminho

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.

Retorno condicional e retorno final

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.

python
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

Rastreie uma chamada por vez

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.

Preveja a execução

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 o caminho ausente

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

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.

Encontrou? Retorne imediatamente

Uma busca com saída antecipada

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.

Buscar o primeiro valor acima do limite

A função examina os valores na ordem da lista.

python
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)  # 12

A ausência só é conhecida no final

Examine todos antes de concluir

O 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.

Casos sem resultado

Nos dois casos, a busca termina sem encontrar um valor acima do limite.

python
print(primeiro_acima([2, 5, 8], 10))  # None
print(primeiro_acima([], 10))         # None

Atenção

Não desista no primeiro item

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.

return e break têm alcances diferentes

Encerrar a função ou somente o laço

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.

A continuação depois de break

Esta versão guarda o valor, interrompe o laço e só depois retorna.

python
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))  # 12

Dois caminhos de saída

Compare até onde cada instrução conduz o fluxo de execução.

Comparação em duas colunas: return sai do laço e da função em direção ao código chamador; break sai apenas do laço e segue para a próxima instrução da função.

return vai diretamente ao código chamador; break continua depois do laço.

Confira a busca

Qual valor é devolvido?

O que primeiro_acima([4, 12, 15], 10) retorna?

return ou break?

Uma instrução break executada dentro de um for sempre encerra a função inteira.

Onde devolver None?

Onde deve ficar return None para representar corretamente uma busca sem resultado, inclusive em uma lista vazia?

Passo 7 de 8

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.

Uma chamada, uma tupla

Dois resultados agrupados

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.

Converter minutos

A função calcula horas completas e minutos restantes.

python
def converter_minutos(total_minutos):
    horas = total_minutos // 60
    minutos = total_minutos % 60
    return horas, minutos

resultado = converter_minutos(135)
print(resultado)  # (2, 15)

Um retorno com dois elementos

Diagrama de uma função devolvendo um único recipiente com dois elementos, depois distribuídos para dois destinos.

Os dois valores saem agrupados em uma tupla; não são dois retornos executados separadamente.

Guardar ou desempacotar

Duas formas de receber o resultado

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.

Aproveitando o retorno

Compare o armazenamento da tupla completa com o desempacotamento direto.

python
# Armazena a tupla completa
resultado = converter_minutos(185)
print(resultado)  # (3, 5)

# Desempacota diretamente
horas, minutos = converter_minutos(185)
print(horas)     # 3
print(minutos)   # 5

Relacione cada forma de uso

Retorno e atribuição

Associe cada trecho ao que ele faz.

Toque em um item e depois no par correspondente.

Complete o retorno e o desempacotamento

Forme a tupla retornada

Complete apenas a instrução return:

def converter_minutos(total_minutos):
    horas = total_minutos // 60
    minutos = total_minutos % 60
    return ____

Desempacote na ordem correta

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

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.

O desafio final

Calcule o progresso

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:

  1. a quantidade de pontos que ainda faltam;
  2. uma mensagem de situação.

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".

Fluxo dos dados

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.

Diagrama mostrando dois valores entrando em uma função, uma decisão com dois caminhos e uma tupla de dois elementos sendo desempacotada em duas variáveis.

Mantenha a mesma ordem nos dois retornos: primeiro os pontos que faltam; depois, a mensagem.

Implemente e confira

Prática no seu computador

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.

Chamadas de conferência

Acrescente estas chamadas abaixo da sua definição. Elas verificam um valor abaixo, outro exatamente no limite e outro acima da meta.

python
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

Resultados esperados

A execução deve exibir:

30 Continue avançando
0 Meta atingida
0 Meta atingida

Nos dois últimos casos, a quantidade que falta é 0: atingir ou ultrapassar a meta segue o mesmo caminho condicional.

Relate o que aconteceu

Conferência manual

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).

Solução e síntese

Uma solução completa

Compare esta solução com a sua. Cada caminho devolve uma tupla na mesma ordem, permitindo o mesmo desempacotamento após qualquer chamada.

python
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

O que você integrou

Nesta aplicação, a função recebe dados, escolhe um caminho e devolve resultados que o restante do programa pode aproveitar.

  • A instrução 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.
  • Cada return encerra a chamada atual e devolve uma tupla com dois resultados na mesma ordem.
  • O desempacotamento associa os elementos retornados a faltam e situacao.
  • print exibe os valores fora da função; ele não substitui return.
  • Uma função que chega ao fim sem devolver um valor produz None.

Tutorial concluído

Parabéns! Você concluiu: Definir funções com parâmetros e retorno

Muito bem! Agora você consegue definir e chamar funções, devolver resultados com return, distinguir retorno de exibição e aproveitar valores agrupados em uma tupla.

100 XP

Baixe o Aplicativo agora para ter acesso a + de 5000 cursos gratuitos, exercícios, certificado e muito conteúdo sem pagar nada!

  • Cursos online 100% gratuitos do início ao fim

    Milhares de cursos online em vídeo, ebooks e áudiobooks.

  • Mais de 60 mil exercícios gratuitos

    Para testar seus conhecimentos no decorrer dos cursos online

  • Certificado Digital gratuito válido em todo o Brasil

    Gerado diretamente na galeria de fotos do seu celular e enviado ao seu e-mail

Aplicativo Cursa na tela de ebook, na tela de curso em vídeo e na tela de exercícios do curso, mais o certificado de conclusão de curso