Python return

Até aqui, as funções da Ana mostravam coisas na tela com print. Mas muitas vezes você não quer ver o resultado: quer usá-lo. Somar o total de duas notas, guardar o preço com desconto numa variável, comparar a média com 7. Para isso, a função precisa devolver o resultado para quem a chamou. É o trabalho do return (em inglês, "devolver", "retornar").

Você vai aprender
  • A devolver um valor com return e a usar esse valor fora da função.
  • A diferença entre print e return, a confusão número 1 de quem está começando.
  • Por que uma função sem return devolve None.
  • Que o return encerra a função na hora, e como usar isso com if.
  • A devolver vários valores de uma vez.
  • Os erros reais: NoneType numa conta, return fora da função, return dentro do laço.

A ideia: falar a resposta × entregar a resposta

A Ana pede ao sobrinho: "faz a conta de quanto deu o pão e o leite". Ele pode responder de dois jeitos:

  • Falar em voz alta: "Deu treze e cinquenta!". A Ana ouve, mas a resposta sumiu no ar. Se ela quiser somar o valor com a conta do gás, vai ter de pedir de novo.
  • Escrever num papel e entregar na mão dela: agora a Ana tem o número. Pode guardá-lo, somá-lo com outro, comparar, anotar no caderno.

O print é falar em voz alta: mostra na tela, para uma pessoa ler, e acabou. O return é entregar o papel: o valor volta para o programa, no lugar onde a função foi chamada, e o programa faz com ele o que quiser.


1. A primeira função com return

def dobro(numero):
    return numero * 2


resultado = dobro(5)
print(resultado)
$ python3 dobro.py
10
return
"Devolva". A palavra-chave que termina a função e manda um valor de volta.
numero * 2
O valor devolvido. O Python faz a conta primeiro e devolve o resultado.
resultado = dobro(5)
A chamada dobro(5) vira o valor devolvido, 10. É como se a linha fosse resultado = 10.
print(resultado)
Quem mostra na tela é o programa principal, aqui fora, porque ele quis.

A frase mais importante desta aula: a chamada de uma função vira o valor que ela devolve. Por isso dá para usar a chamada em qualquer lugar onde caberia um valor:

def dobro(numero):
    return numero * 2


print(dobro(5) + 1)
print(dobro(dobro(3)))
print(f"O dobro de 7 é {dobro(7)}.")
if dobro(4) > 6:
    print("Passou de 6")
$ python3 usar_valor.py
11
12
O dobro de 7 é 14.
Passou de 6
  • dobro(5) + 1: a chamada vira 10, e 10 + 1 dá 11.
  • dobro(dobro(3)): primeiro a de dentro, dobro(3), vira 6; depois dobro(6) vira 12.
  • Numa f-string e num if, a chamada também vira o valor: 14, e 8 > 6.

2. print × return: a confusão número 1

As duas funções abaixo parecem fazer a mesma coisa. Não fazem:

def soma_com_print(a, b):
    print(a + b)


def soma_com_return(a, b):
    return a + b


x = soma_com_print(2, 3)
y = soma_com_return(2, 3)
print("x vale", x)
print("y vale", y)
$ python3 print_x_return.py
5                                                  « o print de dentro da soma_com_print
x vale None
y vale 5
  1. x = soma_com_print(2, 3): a função mostrou 5 na tela, mas não devolveu nada. Então x recebeu None, o "nada" do Python (aula O Valor None).
  2. y = soma_com_return(2, 3): a função não mostrou nada, mas devolveu 5. y guardou o 5.
print(valor)return valor
O que fazMostra o valor na telaDevolve o valor para quem chamou
Para quemPara a pessoa que está olhando a telaPara o programa, que pode guardar e usar
A chamada vira…NoneO valor devolvido
A função continua depois?Sim, segue para a próxima linhaNão, termina ali
ComparaçãoFalar a resposta em voz altaEntregar a resposta escrita num papel

Por que o modo interativo confunde

No modo interativo (>>>, aula O Modo Interativo), as duas funções parecem iguais:

$ python3
Python 3.14.4 (main, Aug 20 2026, 10:41:58) [GCC 15.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> def soma_com_print(a, b):
...     print(a + b)
...
>>> def soma_com_return(a, b):
...     return a + b
...
>>> soma_com_print(2, 3)
5
>>> soma_com_return(2, 3)
5                                                  « quem mostrou foi o >>>, não a função
>>> x = soma_com_print(2, 3)
5
>>> x                                              « x é None: o >>> não mostra nada
>>> print(x)
None
>>> exit()

O >>> mostra sozinho o valor de cada coisa que você digita, então o 5 devolvido pelo return aparece na tela. Já num arquivo .py, ninguém mostra nada por você:

def soma_com_return(a, b):
    return a + b


soma_com_return(2, 3)
$ python3 so_chamar.py
$                                                  « nenhuma saída: o 5 foi devolvido e jogado fora

A função calculou 5 e devolveu, mas ninguém guardou nem mostrou o valor. Ele foi descartado. Num programa, use o valor devolvido: guarde numa variável, ou passe para o print.

Missão: a Ana quer somar a área de dois cômodos, mas o programa dá erro. Rode, veja a mensagem e faça a função area devolver o resultado em vez de mostrá-lo.

def area(largura, altura):
    print(largura * altura)


total = area(3, 4) + area(2, 5)
print(f"Área total: {total} m²")
def area(largura, altura):
    return largura * altura


total = area(3, 4) + area(2, 5)
print(f"Área total: {total} m²")

3. Sem return, a função devolve None

Toda função devolve alguma coisa. Quando o corpo acaba sem passar por um return, o Python devolve None sozinho. As funções das aulas anteriores, que só tinham print, devolviam None o tempo todo, e ninguém percebia:

def saudar(nome):
    print(f"Bom dia, {nome}!")


resposta = saudar("Ana")
print(resposta)
print(type(resposta))
$ python3 none.py
Bom dia, Ana!
None
<class 'NoneType'>

Isso é normal e está certo para funções cujo trabalho é fazer algo (mostrar uma mensagem, gravar um arquivo), e não calcular algo. O problema é quando você esperava um valor e esqueceu o return; veja em Quando dá errado.


4. O return encerra a função

Quando o Python executa um return, a função acaba naquele momento. O que vier depois, dentro dela, não roda:

def dobro(numero):
    return numero * 2
    print("Esta linha nunca aparece")


print(dobro(5))
$ python3 depois_return.py
10

Vários return com if

Isso é útil com o if: cada caminho devolve uma resposta diferente.

def situacao(nota):
    if nota >= 7:
        return "Aprovada"
    return "Recuperação"


print(situacao(8.5))
print(situacao(6))
$ python3 situacao.py
Aprovada
Recuperação

Com nota 8.5, a condição é verdadeira: o primeiro return devolve "Aprovada" e a função acaba ali, sem chegar ao segundo. Com nota 6, a condição é falsa, o Python pula o bloco do if e encontra o segundo return. Repare que nem foi preciso um else: se chegou à última linha, é porque o if não devolveu nada antes.

return sozinho: "pode parar"

Um return sem valor também encerra a função, e devolve None. Serve para sair mais cedo:

def avisar_estoque(quantidade):
    if quantidade > 0:
        return
    print("Atenção: acabou o estoque!")


avisar_estoque(5)
avisar_estoque(0)
print(avisar_estoque(5))
$ python3 return_vazio.py
Atenção: acabou o estoque!
None

Com 5 unidades, a função sai no return e não avisa nada. Com 0, ela segue até o aviso. E o print da última linha mostra o que o return sozinho devolveu: None.


5. Devolvendo vários valores

Às vezes a função calcula mais de uma coisa. Escreva os valores separados por vírgula depois do return:

def resumo(notas):
    total = sum(notas)
    media = total / len(notas)
    return total, media


soma, media = resumo([8, 9, 7, 10])
print(f"Soma: {soma}")
print(f"Média: {media}")
print(resumo([8, 9, 7, 10]))
$ python3 varios.py
Soma: 34
Média: 8.5
(34, 8.5)
sum(notas) e len(notas)
A soma dos itens da lista e a quantidade de itens (aula Funções Embutidas).
return total, media
Devolve os dois valores juntos, num pacote só.
soma, media = resumo(…)
Abre o pacote: o primeiro valor vai para soma, o segundo para media, como na aula Atribuição Múltipla.
(34, 8.5)
Sem abrir o pacote, você vê o que ele é: uma tupla, uma sequência entre parênteses (aula Tuplas). Na verdade, o return sempre devolve um valor só; com a vírgula, esse valor é uma tupla com dois itens.

Formas diferentes de entregar o resultado

A mesma conta, a média de duas notas, pode ser entregue de três jeitos:

# 1. A função mostra
def media_mostrar(a, b):
    print((a + b) / 2)


# 2. A função devolve, e quem chamou mostra
def media(a, b):
    return (a + b) / 2


# 3. A função devolve um texto pronto
def media_texto(a, b):
    return f"Média: {(a + b) / 2}"


media_mostrar(8, 9)
print(media(8, 9))
print(media_texto(8, 9))
$ python3 formas.py
8.5
8.5
Média: 8.5
FormaQuando usar
A função mostra (print dentro)Quando o trabalho da função é mostrar algo (um cabeçalho, um menu). O resultado não pode ser reaproveitado
A função devolve o número (return)Quase sempre, para cálculos. Quem chama decide: mostrar, guardar, somar, comparar. É a mais flexível
A função devolve um texto prontoQuando o texto formatado é usado em vários lugares (tela, arquivo). Mas o número fica "preso" no texto: não dá mais para fazer conta com ele
Uma regra que ajuda

Funções que calculam devolvem; quem mostra é o programa principal. Assim, a mesma função media serve para mostrar na tela, para gravar num arquivo e para decidir se o aluno passou.


Quando dá errado

print no lugar de return: NoneType na conta
def soma_com_print(a, b):
    print(a + b)


total = soma_com_print(2, 3) + 1
print(total)
$ python3 print_conta.py
5
Traceback (most recent call last):
  File "/home/ana/print_conta.py", line 5, in <module>
    total = soma_com_print(2, 3) + 1
            ~~~~~~~~~~~~~~~~~~~~~^~~
TypeError: unsupported operand type(s) for +: 'NoneType' and 'int'

Linha por linha:

5
O print de dentro da função funcionou: ela mostrou a soma.
line 5
O erro foi na linha da conta.
~~~~~~~~~~~~~~~~~~~~~^~~
Os ~ marcam os dois lados da conta (a chamada e o 1), e o ^ aponta o operador +, onde a coisa quebrou.
TypeError: unsupported operand type(s) for +: 'NoneType' and 'int'
"Tipos não suportados para o +: NoneType e int". O lado esquerdo era None (do tipo NoneType), porque a função não devolveu nada, e não dá para somar "nada" com 1.

Sempre que aparecer NoneType numa mensagem de erro, desconfie de uma função sem return. Como consertar: troque o print(a + b) por return a + b.

Esqueceu o return: aparece None
def media(nota1, nota2):
    resultado = (nota1 + nota2) / 2


m = media(8, 9)
print(f"Média: {m}")
$ python3 esqueceu.py
Média: None

Sem erro, mas a média saiu None. A função calculou 8.5 e guardou na variável resultado, que só existe dentro dela (aula Escopo). Como não há return, o valor se perdeu quando a função terminou, e ela devolveu None. Como consertar: acrescente return resultado no fim do corpo (ou escreva direto return (nota1 + nota2) / 2).

return dentro do laço: a função para cedo demais
def somar(numeros):
    total = 0
    for n in numeros:
        total = total + n
        return total


print(somar([5, 10, 20]))
$ python3 return_no_for.py
5

A soma deveria dar 35, mas deu 5. O return ficou recuado demais, dentro do for. Na primeira volta, o laço somou o 5 e já encontrou o return, que encerrou a função na hora; o 10 e o 20 nem foram vistos. Como consertar: tire 4 espaços do return, para que ele fique no nível do for e só rode depois que o laço terminar.

return fora de uma função
preco = 10
return preco * 2
$ python3 fora_funcao.py
  File "/home/ana/fora_funcao.py", line 2
    return preco * 2
    ^^^^^^^^^^^^^^^^
SyntaxError: 'return' outside function

"'return' fora de função". O return devolve um valor para quem chamou a função; no programa principal, não há ninguém para receber. Como consertar: fora de funções, use print para mostrar ou uma variável para guardar. (Para terminar o programa inteiro antes da hora existe o sys.exit(), aula Os Módulos os e sys.)

Abrir o pacote com o número errado de variáveis
def resumo(notas):
    total = sum(notas)
    media = total / len(notas)
    return total, media


soma, media, maior = resumo([8, 9, 7, 10])
$ python3 desempacotar.py
Traceback (most recent call last):
  File "/home/ana/desempacotar.py", line 7, in <module>
    soma, media, maior = resumo([8, 9, 7, 10])
    ^^^^^^^^^^^^^^^^^^
ValueError: not enough values to unpack (expected 3, got 2)

"Valores insuficientes para desempacotar (esperava 3, recebeu 2)". A função devolve dois valores, e a linha tentou distribuí-los em três variáveis. Como consertar: use tantas variáveis quantos forem os valores do return: soma, media = resumo(…).


Referência rápida

EscritaO que faz
return valorEncerra a função e devolve o valor para quem chamou
x = f()Guarda o valor devolvido
print(f())Mostra o valor devolvido
f() sozinho, num arquivoO valor devolvido é jogado fora
Sem return, ou return sozinhoA função devolve None
return a, bDevolve uma tupla com dois valores; abra com x, y = f()
Vários return com ifCada caminho devolve uma resposta; o primeiro que rodar encerra a função
SintomaCausa provável
None onde devia aparecer um valorFaltou o return (ou a função usa print)
TypeError: … 'NoneType' …Uma função sem return foi usada numa conta
Resultado parcial, só o primeiro itemreturn recuado para dentro do laço
SyntaxError: 'return' outside functionreturn no programa principal
ValueError: not enough values to unpackMais variáveis do que valores devolvidos

Exercícios

1. Devolvendo o triplo

Complete a palavra que devolve o valor:

def triplo(n):
     n * 3

2. O valor da chamada

Com a função do exercício 1, quanto vale triplo(2) + triplo(1)?

3. Uma função tem só print(a * b) no corpo. O que a variável r guarda depois de r = f(2, 3)?

4. O que acontece com as linhas que estão depois de um return, no mesmo bloco?

5. Um programa num arquivo .py tem só uma função com return 42 e, embaixo, a chamada resposta(). O que aparece na tela?

Missão final: o desconto da padaria

Missão: escreva o corpo da função com_desconto: ela recebe o preço e a porcentagem de desconto e devolve o preço já com o desconto (preço menos preço × porcentagem / 100). O resto do programa já está pronto e usa o valor devolvido. O bolo de R$ 40 com 10% deve sair por R$ 36.00.

def com_desconto(preco, porcentagem):
    pass  # troque o pass pela conta, com return


bolo = com_desconto(40, 10)
torta = com_desconto(60, 25)
print(f"Bolo: R$ {bolo:.2f}")
print(f"Torta: R$ {torta:.2f}")
print(f"Os dois: R$ {bolo + torta:.2f}")
def com_desconto(preco, porcentagem):
    return preco - preco * porcentagem / 100


bolo = com_desconto(40, 10)
torta = com_desconto(60, 25)
print(f"Bolo: R$ {bolo:.2f}")
print(f"Torta: R$ {torta:.2f}")
print(f"Os dois: R$ {bolo + torta:.2f}")

Rode o código inicial antes de mexer: com o pass, a função devolve None, e o Python reclama TypeError: unsupported format string passed to NoneType.__format__ ("formatação não suportada para NoneType"): o :.2f não sabe mostrar None com 2 casas. De novo o NoneType denunciando um return que falta.


Resumo

  • return valor encerra a função e devolve o valor; a chamada vira esse valor e pode ser guardada, somada, comparada.
  • print mostra para a pessoa; return entrega para o programa. Função que calcula, devolve.
  • O >>> mostra sozinho o valor devolvido; num arquivo, ninguém mostra: use print(f()) ou guarde numa variável.
  • Sem return, a função devolve None. NoneType num erro quase sempre é um return esquecido.
  • Depois do return, nada mais roda na função. Vários return com if dão uma resposta por caminho.
  • return a, b devolve vários valores (uma tupla), que você abre com x, y = f().