Módulo 12 - Trabalhando com textos

f-strings: mensagens formatadas do jeito moderno

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

O que você vai aprender

  • Montar mensagens com f-strings, inserindo variáveis dentro de chaves.
  • Colocar expressões e contas direto dentro das chaves.
  • Formatar números com duas casas decimais usando :.2f, o formato do dinheiro.
  • Comparar f-strings com concatenação por + e saber por que a f-string é o padrão.

A f-string em um minuto

Todo programa que você escreveu até aqui termina do mesmo jeito: mostrando um resultado para o usuário. E montar essa mensagem final juntando texto fixo com valores de variáveis é uma tarefa tão constante que o Python ganhou, na versão 3.6, uma ferramenta dedicada a ela. O nome oficial é literal de string formatada, mas o mundo inteiro chama de f-string, por causa da letra que a ativa: um f encostado antes das aspas de abertura.

nome = "Ana"
idade = 30

print(f"Olá, {nome}! Você tem {idade} anos.")
# Olá, Ana! Você tem 30 anos.

O f liga o modo formatado; cada par de chaves é substituído pelo valor da variável.

A leitura é natural: o texto fica inteiro, na ordem em que será exibido, e as chaves marcam os buracos que o Python preenche na hora. Repare num detalhe valioso do exemplo: idade é um número, do tipo int, e mesmo assim entrou na frase sem conversão nenhuma. A f-string transforma qualquer valor em texto automaticamente. Guarde essa cortesia, porque a última seção mostra quanto trabalho ela economiza.

Contas nas chaves e o formato do dinheiro

As chaves aceitam mais que nomes de variáveis: aceitam expressões completas. Uma conta, uma chamada de método, uma f-string consegue avaliar ali dentro e encaixar o resultado no texto. Isso dispensa variáveis intermediárias quando o cálculo é curto.

preco = 25.9
quantidade = 3
nome = "maria"

print(f"Total da compra: {preco * quantidade}")
# Total da compra: 77.69999999999999

print(f"Cliente: {nome.title()}")
# Cliente: Maria

Contas e métodos funcionam dentro das chaves. Mas olhe o total: aquele monte de noves pede socorro.

O total esquisito do exemplo não é defeito da f-string: é o comportamento dos números float que você conheceu no módulo 4, somado a uma exibição sem formato. Nenhum cliente aceita pagar R$ 77.69999999999999. A solução é o especificador de formato: dentro das chaves, depois da expressão, escreva dois-pontos e uma instrução de exibição. A instrução que você mais vai usar na vida é .2f, que significa número com exatamente duas casas decimais, o formato do dinheiro.

preco = 25.9
quantidade = 3
total = preco * quantidade

print(f"Total da compra: R$ {total:.2f}")
# Total da compra: R$ 77.70

print(f"Pi com 4 casas: {3.14159265:.4f}")
# Pi com 4 casas: 3.1416 (repare que ele arredonda, não corta)

O :.2f arredonda para duas casas e completa com zero quando falta dígito: 10.5 vira 10.50.

Uma nota de honestidade brasileira: o .2f usa ponto como separador decimal, no padrão americano, então o resultado sai 77.70 e não 77,70. Para o terminal dos exercícios deste curso, está ótimo. Quando quiser a vírgula, o truque simples é trocar depois de formatar: f"{total:.2f}".replace(".", ","), reaproveitando o método da aula passada. Existe um caminho mais formal, com configuração de localidade, mas ele fica para etapas futuras da trilha.

f-string contra concatenação: por que ela venceu

Você já sabe, desde o módulo 6, que o operador + junta strings: "bom" + " dia" resulta em "bom dia". Então seria justo perguntar por que não montar as mensagens assim. A resposta honesta é que dá para montar, o Python aceita, e muito código antigo faz exatamente isso. Mas compare as duas versões da mesma mensagem e tire a sua conclusão.

nome = "Ana"
idade = 30

# Com concatenação: str() obrigatório e espaços na mão
mensagem1 = "Olá, " + nome + "! Você tem " + str(idade) + " anos."

# Com f-string: o texto inteiro, legível, sem conversão
mensagem2 = f"Olá, {nome}! Você tem {idade} anos."

print(mensagem1 == mensagem2)  # True: o resultado é idêntico

As duas produzem a mesma string. A diferença está no caminho até ela.

Concatenação com +

  • Números precisam de str() na mão, senão dá TypeError
  • Espaços somem com facilidade nas emendas das aspas
  • A frase fica picotada, difícil de ler e de revisar
  • Formatar casas decimais exige ainda mais trabalho

f-string

  • Converte qualquer valor para texto sozinha
  • O texto fica inteiro, com os espaços visíveis no lugar
  • Lê-se como a frase final, com buracos marcados
  • O :.2f resolve as casas decimais ali mesmo

O erro mais comum da concatenação merece destaque: esquecer o str() em volta de um número. "Você tem " + idade explode com TypeError, porque o Python se recusa a somar texto com número, exatamente como você viu no módulo 5 ao converter entradas. A f-string elimina essa classe inteira de erro. Por isso a documentação oficial a apresenta como o primeiro recurso de formatação do tutorial, e por isso este curso a adota como padrão daqui até o projeto final. Conhecer o + para juntar strings continua útil, para ler código dos outros e para junções simples de dois pedaços; para mensagens, f-string sempre.

Teste rápido

Com valor = 9.5, o que print(f"R$ {valor:.2f}") mostra na tela?

Perguntas frequentes

O que acontece se eu esquecer o f antes das aspas?
A string vira texto comum e as chaves aparecem literalmente na tela: print("Olá, {nome}") mostra Olá, {nome}, com chaves e tudo. Não dá erro, o que torna o esquecimento traiçoeiro. Se a sua mensagem saiu com chaves cruas, o diagnóstico é quase sempre o f perdido.
E se eu precisar mostrar uma chave de verdade dentro de uma f-string?
Dobre a chave: f"O conjunto é {{1, 2}}" mostra O conjunto é {1, 2}. A chave dupla é o jeito de dizer ao Python que ali é caractere literal, não um buraco para preencher. É situação rara em programas básicos, mas a solução é boa de conhecer.
O que significa exatamente o .2f do formato?
O f indica formato de número de ponto flutuante (float) e o .2 pede duas casas depois do separador decimal. Trocando o número, muda a precisão: :.4f mostra quatro casas, :.0f mostra o número arredondado sem casas. A regra completa está na mini-linguagem de formato da documentação oficial, linkada nas fontes.
Dá para usar f-string com aspas simples ou triplas?
Dá com todas: f'texto', f"texto" e até f"""texto de várias linhas""" funcionam. O f se combina com qualquer estilo de aspas que você já usa. O cuidado é o de sempre com aspas: se o texto contém aspas duplas, delimite com simples, ou vice-versa.
f-string funciona em qualquer versão do Python?
Em qualquer Python a partir do 3.6, lançado em 2016. Como o curso usa Python 3.12 e nenhuma versão anterior ao 3.8 recebe suporte hoje, na prática você pode usar f-string em todo lugar. Se topar com material antigo usando .format() ou o operador %, são os antecessores: funcionam, mas a f-string os aposentou.
Posso chamar input() ou fazer coisas complexas dentro das chaves?
Tecnicamente pode, as chaves aceitam quase qualquer expressão. Mas legibilidade manda: chaves são para valores e contas curtas. Se a expressão está ficando comprida, calcule antes numa variável com nome claro e coloque só a variável na chave. Código bom se lê sem esforço.

Fontes

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