Módulo 13 - Funções

Mostrar ou retornar: print não é return

9 min de leitura · por Cesar Gargiulo, revisado pela equipe ValorFinal e GuardiaSec · Atualizado em 01/07/2026

O que você vai aprender

  • Distinguir mostrar na tela (print) de devolver valor (return).
  • Reconhecer o erro clássico: guardar o retorno de uma função que só imprime.
  • Diagnosticar o None inesperado que aparece no meio do programa.
  • Aplicar a regra prática: calcule com return, mostre com print no final.

Dois canais diferentes: os olhos e o código

Se este módulo tivesse uma aula para tatuar, seria esta. A confusão entre print e return é, com folga, o bug mais comum em código de quem está aprendendo funções, e ela nasce de uma ilusão compreensível: nos dois casos, o número aparece na tela, então parece que a função funcionou igual. Mas os canais são outros. O print joga o valor para fora do programa, na tela, onde só os seus olhos alcançam. O return mantém o valor dentro do programa, disponível para a próxima linha de código. Tela não é memória: o que foi impresso não volta.

print (mostra e pronto)

  • Escreve o valor na tela para uma pessoa ler
  • O programa não tem acesso ao que foi mostrado
  • A chamada da função vale None
  • Guardar em variável guarda None
  • Serve para exibir o resultado final ao usuário

return (entrega o valor)

  • Devolve o valor para o ponto da chamada
  • O valor segue vivo dentro do programa
  • A chamada da função vale o resultado
  • Guardar em variável guarda o resultado de verdade
  • Serve para cálculos que outras partes do código usam

Uma imagem ajuda a fixar: o print é o professor que resolve a conta na lousa; todo mundo vê o resultado, mas ninguém leva a lousa para casa. O return é o professor que entrega a resposta escrita na sua mão: agora ela é sua, e você faz o que quiser com ela. Quando o seu programa precisa USAR o resultado, e quase sempre precisa, só o return serve.

O erro clássico, em câmera lenta

Veja o erro acontecendo de verdade. A função dobro abaixo calcula certo, mas comete o pecado: imprime em vez de retornar. Quem escreveu quer usar o resultado numa conta depois, e é aí que o castelo cai.

def dobro(numero):
    print(numero * 2)

resultado = dobro(5)
print(resultado + 1)

# 10
# TypeError: unsupported operand type(s) for +: 'NoneType' and 'int'

O 10 apareceu, o que engana. Mas resultado guardou None, e None + 1 quebra o programa.

Reconstrua a cena: a chamada dobro(5) executou a função, o print interno mostrou 10 na tela e a função terminou sem return, devolvendo None. A variável resultado guardou esse None. Na linha seguinte, o programa tenta somar None + 1, e o Python interrompe com um TypeError citando NoneType. O detalhe cruel é que o 10 na tela dá a sensação de que tudo funcionou; o defeito só explode uma linha depois, longe da causa. Sempre que um NoneType surgir numa mensagem de erro sua, a primeira suspeita é esta: alguma função no caminho imprime em vez de retornar.

def dobro(numero):
    return numero * 2

resultado = dobro(5)
print(resultado + 1)
print(dobro(4) + dobro(3))

# 11
# 14

Com return, o valor volta vivo: dá para somar, combinar e encadear chamadas.

A correção é uma palavra: trocar print por return dentro da função. Agora resultado guarda 10 de verdade, a soma funciona e, de bônus, a última linha mostra o que só o return permite: usar duas chamadas dentro de uma expressão, dobro(4) + dobro(3). Tente fazer isso com a versão que só imprime e você colhe None + None.

A regra prática que resolve 90% dos casos

Fica então a regra de bolso deste curso, que vale para a prática do módulo e para o projeto final: calcule com return, mostre com print no final. As funções que fazem contas e tomam decisões devolvem valores com return e não imprimem nada; o programa principal recebe esses valores, e só ele decide o que mostrar ao usuário, com print, na hora de encerrar. Essa separação entre calcular e exibir deixa as funções reaproveitáveis: a mesma calcular_media serve num programa de terminal hoje e serviria num site amanhã, porque ela não está presa a nenhuma tela.

  • Função de cálculo ou decisão: usa return, não usa print.
  • Programa principal: chama as funções, guarda os retornos e mostra com print no final.
  • Função cujo único trabalho é exibir algo, como imprimir_cabecalho: aí sim o print mora dentro dela.
  • Viu None inesperado? Procure a função que imprime em vez de retornar.

Note que a regra tem a exceção honesta do terceiro item: funções de exibição existem e são legítimas, como a imprimir_cabecalho da aula 1. A diferença é intenção. Se o trabalho da função é produzir um valor, return. Se o trabalho é mostrar algo formatado, print. O que não pode é a função híbrida confusa, que calcula e imprime e não devolve, porque ela prende o resultado na tela. Na prática da última aula, você vai escrever três funções de cálculo puras e um programa principal que imprime: a regra aplicada de ponta a ponta.

Teste rápido

A função dobro(n) só executa print(n * 2), sem return. O que acontece com x = dobro(5) e depois print(x + 1)?

Perguntas frequentes

Se print e return confundem tanto, por que os dois existem?
Porque fazem trabalhos diferentes e necessários. O print é a ponte com o humano: sem ele, o usuário não vê nada. O return é a ponte entre as partes do programa: sem ele, as funções não cooperam. Um programa completo usa os dois, cada um no seu posto: return nas funções de cálculo, print na hora de exibir.
Uma função pode usar print e return ao mesmo tempo?
Pode, e às vezes é útil, como imprimir um aviso e ainda devolver o valor. Mas em código de iniciante essa mistura costuma ser sintoma de confusão, não de intenção. Enquanto o hábito não firma, prefira funções puras de cálculo (só return) e deixe os prints no programa principal.
Por que o erro do None aparece longe da linha errada?
Porque guardar None numa variável não é erro para o Python; usar o None numa conta é. Então a atribuição passa limpa e a explosão acontece linhas depois, onde a variável entra numa operação. Ao ver TypeError com NoneType, siga a variável para trás até achar a função que imprime em vez de retornar.
Como testo rápido se uma função retorna ou só imprime?
Embrulhe a chamada num print: print(minha_funcao(2)). Se aparecer o resultado e nada mais, ela retorna. Se aparecer o resultado numa linha e None na seguinte, ela imprime por dentro e devolve nada. Dez segundos de teste no Playground e a dúvida morre.
O print devolve alguma coisa?
Devolve None, sempre. O trabalho do print é escrever na tela, e a devolução dele é vazia por definição. É por isso que x = print('oi') deixa x valendo None: comportamento correto, ainda que surpreenda na primeira vez.
Essa separação entre calcular e mostrar importa fora do curso?
Importa, e muito. Separar o cálculo da exibição é um princípio de organização usado em software profissional: a mesma função de cálculo serve para terminal, site, aplicativo e teste automatizado, porque não depende de nenhuma tela. Você está aprendendo, em pequena escala, um hábito que escala junto com os seus programas.

Fontes

Seu progresso fica salvo neste aparelho. Assinantes sincronizam entre os aparelhos.