Python: Juntar e Repetir Textos

Muitas vezes você tem um texto em pedaços: o nome numa variável, o sobrenome em outra; os itens da lista de compras um a um. Para montar a frase inteira, você precisa juntar os pedaços. E às vezes precisa repetir um texto, como a linha de tracinhos que enfeita o cardápio da padaria. O Python usa para isso os mesmos símbolos das contas, + e *, mais um método feito para listas, o join(). Esta aula mostra os três, e os erros que todo iniciante encontra no caminho, a começar pelo famoso "texto" + 5.

Você vai aprender
  • A emendar textos com + (a concatenação), sem esquecer o espaço.
  • A ir montando um texto aos poucos com +=.
  • A repetir um texto com *: "-" * 20.
  • A juntar uma lista de textos com um separador: ", ".join(compras).
  • Quando usar +, a vírgula do print ou uma f-string.
  • Os erros reais: "texto" + 5, 5 + "texto", "ha" * "3", texto menos texto e join() com números.

A ideia: emendar e carimbar

Juntar textos é como emendar pedaços de fita: você cola o fim de um no começo do outro, e o resultado é uma fita só, mais comprida. Repetir é como usar um carimbo: você carimba a mesma figura várias vezes, uma ao lado da outra. E o join() é como montar um colar de contas com um nó entre elas: as contas são os textos da lista, e o nó é o separador que você escolhe.

OperaçãoEscritaExemploResultado
Emendartexto + texto"Ana" + " Souza"'Ana Souza'
Repetirtexto * número"ha" * 3'hahaha'
Juntar uma listaseparador.join(lista)", ".join(["pão", "leite"])'pão, leite'

1. +: emendando textos

nome = "Ana"
sobrenome = "Souza"

print(nome + sobrenome)
print(nome + " " + sobrenome)

completo = nome + " " + sobrenome
print("Olá, " + completo + "!")
$ python3 juntar.py
AnaSouza
Ana Souza
Olá, Ana Souza!
nome + sobrenome
Com dois textos, o + não soma: ele emenda o segundo no fim do primeiro. É a concatenação (de "concatenar", encadear).
AnaSouza
Emendou exatamente o que tinha: nenhum espaço foi acrescentado. O Python não sabe que você queria um espaço.
nome + " " + sobrenome
O espaço é um texto também (" ", aspas com um espaço no meio). Emende-o entre os dois.
completo = …
O resultado é um texto novo, que você pode guardar numa variável e usar depois.

Repare no último print: o espaço depois da vírgula ficou dentro das aspas, em "Olá, ". É o jeito mais comum de não esquecer o espaço.

Montando aos poucos com +=

O += da aula Operadores de Atribuição funciona com textos também: recado += " pão" é o mesmo que recado = recado + " pão".

recado = "Comprar"
recado += " pão"
recado += " e leite"
print(recado)
$ python3 mais-igual.py
Comprar pão e leite

Lembre da aula Strings: textos são imutáveis. O += não "estica" o texto antigo; ele cria um texto novo, maior, e guarda de volta na mesma variável.

Missão: o programa mostra o nome todo grudado, BiaLima. Conserte para sair Bia Lima, com um espaço no meio.

nome = "Bia"
sobrenome = "Lima"
print(nome + sobrenome)
nome = "Bia"
sobrenome = "Lima"
print(nome + " " + sobrenome)

2. *: repetindo um texto

Um texto vezes um número inteiro dá o texto repetido aquele número de vezes:

print("-" * 20)
print("ha" * 3)
print(3 * "ab")
print("=" * 0)
print("Fim")
$ python3 repetir.py
--------------------
hahaha
ababab

Fim
  • "-" * 20: vinte tracinhos, uma linha de enfeite.
  • "ha" * 3: o texto inteiro se repete, hahaha.
  • 3 * "ab": a ordem não importa; número vezes texto também funciona.
  • "=" * 0: zero vezes dá o texto vazio, e por isso o print mostrou uma linha em branco. (Um número negativo também dá o texto vazio: "ab" * -3 é ''.)

Um uso bonito: a Ana faz o cabeçalho do cardápio da padaria com uma linha do tamanho exato do título, usando o len():

titulo = "PADARIA DO BAIRRO"
linha = "=" * len(titulo)

print(linha)
print(titulo)
print(linha)
print("Pão francês" + "." * 10 + "R$ 0,80")
$ python3 cardapio.py
=================
PADARIA DO BAIRRO
=================
Pão francês..........R$ 0,80

O título tem 17 caracteres (contando os espaços), então a linha tem 17 sinais de igual. Se a Ana mudar o título, a linha acompanha sozinha. Na última linha, + e * trabalham juntos: o * vai primeiro (é mais forte, como você viu em Precedência) e fabrica os dez pontinhos; depois os + emendam tudo.


3. join(): juntando uma lista com um separador

Quando os pedaços estão numa lista (aula Listas), emendar um por um com + dá trabalho. O join() (em inglês, "juntar") faz isso de uma vez, pondo um separador entre os itens:

compras = ["pão", "leite", "café"]

print(", ".join(compras))
print(" - ".join(compras))
print("".join(compras))
print(" e ".join(["Ana", "Bia"]))
print("-".join("2026"))
", "
O separador: o texto que vai entre os itens. Ele vem primeiro, antes do ponto. Parece estranho, mas lê-se assim: "vírgula-e-espaço, junte esta lista".
.join
O método que junta. Um método é uma função que pertence a um valor e se escreve com ponto, como texto.lower() (aula Métodos de Texto).
(compras)
A lista de textos que vai ser juntada.
$ python3 join.py
pão, leite, café
pão - leite - café
pãoleitecafé
Ana e Bia
2-0-2-6
  • O separador vai só entre os itens: não sobra vírgula no fim, nem no começo. Com +, você teria de cuidar disso na mão.
  • O separador pode ser qualquer texto, até o vazio (""), que cola tudo.
  • O join() aceita também um texto no lugar da lista: aí cada caractere vira um item. "-".join("2026") pôs um tracinho entre os algarismos.

Missão: o programa emenda os itens um por um, com +. Reescreva o print usando ", ".join(compras), para a mesma saída: Comprar: arroz, feijão, farinha.

compras = ["arroz", "feijão", "farinha"]
print("Comprar: " + compras[0] + ", " + compras[1])
compras = ["arroz", "feijão", "farinha"]
print("Comprar: " + ", ".join(compras))

Repare que o código inicial ainda esqueceu a farinha. Com o join(), não tem como esquecer: ele junta a lista inteira, seja qual for o tamanho.


4. E quando um dos pedaços é um número?

O + só emenda texto com texto. Se um dos pedaços for um número, há três saídas:

quantidade = 3
print("Pães:", quantidade)
print("Pães: " + str(quantidade))
print(f"Pães: {quantidade}")
$ python3 virgula.py
Pães: 3
Pães: 3
Pães: 3
print("Pães:", quantidade)
A vírgula separa os valores do print, que mostra cada um e põe um espaço entre eles (aula As Opções sep e end). Não é concatenação: o print aceita números à vontade.
"Pães: " + str(quantidade)
O str() transforma o número 3 no texto "3", e aí o + funciona. O espaço tem de estar dentro das aspas.
f"Pães: {quantidade}"
Uma f-string: o f antes das aspas permite escrever variáveis entre chaves, dentro do texto. É o jeito preferido para montar frases, com aula própria: f-strings.

5. Textos colados sem nada no meio

Uma curiosidade, para você não se assustar quando encontrar: dois textos escritos lado a lado, sem +, também são emendados.

mensagem = "Olá, " "Ana"
print(mensagem)
$ python3 colados.py
Olá, Ana

Isso só funciona com textos escritos ali mesmo, entre aspas; com variáveis, não. Serve para quebrar um texto muito comprido em vários pedaços (dentro de parênteses, em várias linhas). No dia a dia, prefira o +, que deixa a intenção clara.


Formas diferentes de montar o mesmo texto

FormaExemploQuando usar
+nome + " " + sobrenomePara emendar poucos textos
+=recado += " pão"Para ir montando aos poucos
Vírgula do printprint("Pães:", 3)Só para mostrar na tela, com números no meio
f-stringf"Olá, {nome}!"Para montar frases com variáveis (o mais usado)
*"-" * 20Para repetir
join()", ".join(compras)Para juntar uma lista, com separador

Quando dá errado

Texto mais número: can only concatenate str

É o erro mais famoso de quem está começando. No modo interativo:

$ 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.
>>> "texto" + 5
Traceback (most recent call last):
  File "<python-input-0>", line 1, in <module>
    "texto" + 5
    ~~~~~~~~^~~
TypeError: can only concatenate str (not "int") to str
>>> "texto" + str(5)
'texto5'
>>> exit()

E num programa de verdade, com a idade numa variável:

idade = 30
print("A Ana tem " + idade + " anos")
$ python3 texto-mais-numero.py
Traceback (most recent call last):
  File "/home/ana/texto-mais-numero.py", line 2, in <module>
    print("A Ana tem " + idade + " anos")
          ~~~~~~~~~~~~~^~~~~~~
TypeError: can only concatenate str (not "int") to str
File "/home/ana/texto-mais-numero.py", line 2
O erro está na linha 2.
~~~~~~~~~~~~~^~~~~~~
O ^ aponta o primeiro +, e os ~ sublinham os dois lados dele: o texto "A Ana tem " e a variável idade. O segundo + nem chegou a ser feito.
TypeError:
"Erro de tipo".
can only concatenate str (not "int") to str
"Só dá para concatenar str (não int) a um str." Ao texto, você só pode emendar outro texto, e idade é o número 30.

Por que o Python não converte sozinho? Porque ele não adivinha. "5" + 5 deveria dar "55" ou 10? Em vez de chutar, ele pede que você diga. Como consertar: "A Ana tem " + str(idade) + " anos", ou melhor, f"A Ana tem {idade} anos".

Número mais texto: a mensagem muda
idade = 30
print(idade + " anos")
$ python3 numero-mais-texto.py
Traceback (most recent call last):
  File "/home/ana/numero-mais-texto.py", line 2, in <module>
    print(idade + " anos")
          ~~~~~~^~~~~~~~~
TypeError: unsupported operand type(s) for +: 'int' and 'str'

Com o número na frente, a mensagem é outra: unsupported operand type(s) for +: 'int' and 'str', "tipos de operando não aceitos pelo +: int e str". O Python tentou uma soma (o lado esquerdo é um número) e não sabe somar um número com um texto. O conserto é o mesmo: str(idade) + " anos".

Texto vezes texto, ou vezes um número quebrado
vezes = "3"
print("ha" * vezes)
$ python3 vezes-texto.py
Traceback (most recent call last):
  File "/home/ana/vezes-texto.py", line 2, in <module>
    print("ha" * vezes)
          ~~~~~^~~~~~~
TypeError: can't multiply sequence by non-int of type 'str'

can't multiply sequence by non-int of type 'str': "não dá para multiplicar uma sequência por algo que não é int, do tipo str". Para o Python, um texto é uma sequência (de caracteres), e uma sequência só se multiplica por um número inteiro. O "3" é texto. Com um número com casas decimais acontece o mesmo:

print("-" * 2.5)
$ python3 vezes-float.py
Traceback (most recent call last):
  File "/home/ana/vezes-float.py", line 1, in <module>
    print("-" * 2.5)
          ~~~~^~~~~
TypeError: can't multiply sequence by non-int of type 'float'

Não existe "dois tracinhos e meio". Como consertar: use um int: "ha" * int(vezes), ou "-" * 2.

Texto menos texto

Se + emenda, será que - "desemenda"?

print("pão e leite" - " e leite")
$ python3 menos.py
Traceback (most recent call last):
  File "/home/ana/menos.py", line 1, in <module>
    print("pão e leite" - " e leite")
          ~~~~~~~~~~~~~~^~~~~~~~~~~~
TypeError: unsupported operand type(s) for -: 'str' and 'str'

Não: os textos só aceitam + e *. / e - dão esse TypeError. Como consertar: para tirar um pedaço do texto, use o replace() (aula Métodos de Texto) ou uma fatia (aula Índices e Fatias).

join() com uma lista de números
notas = [7, 9, 10]
print(", ".join(notas))
$ python3 join-numeros.py
Traceback (most recent call last):
  File "/home/ana/join-numeros.py", line 2, in <module>
    print(", ".join(notas))
          ~~~~~~~~~^^^^^^^
TypeError: sequence item 0: expected str instance, int found

sequence item 0: expected str instance, int found: "item 0 da sequência: esperava um str, encontrou um int". O join() só junta textos, e já o primeiro item (o de índice 0, o 7) é um número. Como consertar: guarde os itens como texto (["7", "9", "10"]). Para converter uma lista de números inteira de uma vez, você vai aprender ferramentas próprias em List Comprehension e map() e filter().

notas = ["7", "9", "10"]
print(", ".join(notas))
$ python3 join-certo.py
7, 9, 10

Missão: o programa dá TypeError. Conserte a linha do print para mostrar A Ana tem 30 anos (com str(), com vírgulas ou com uma f-string: qualquer um vale).

idade = 30
print("A Ana tem " + idade + " anos")
idade = 30
print("A Ana tem " + str(idade) + " anos")

Referência rápida

EscritaO que fazExemplo → resultado
a + bEmenda dois textos"Ana" + "Souza" → 'AnaSouza'
a += bEmenda e guarda de volta em arecado += " pão"
texto * nRepete n vezes (n inteiro)"ha" * 3 → 'hahaha'
texto * 0Texto vazio''
sep.join(lista)Junta os textos da lista, com sep entre eles", ".join(["a", "b"]) → 'a, b'
str(n)Transforma um número em texto, para emendar"Pães: " + str(3) → 'Pães: 3'
SintomaCausa provável
TypeError: can only concatenate str (not "int") to strTexto + número: use str() ou uma f-string
TypeError: unsupported operand type(s) for +: 'int' and 'str'Número + texto
TypeError: can't multiply sequence by non-int of type 'str'Texto vezes texto: converta com int()
TypeError: can't multiply sequence by non-int of type 'float'Texto vezes número quebrado
TypeError: unsupported operand type(s) for -: 'str' and 'str'Textos não têm subtração: use replace() ou fatias
TypeError: sequence item 0: expected str instance, int foundjoin() com números na lista
Palavras grudadas: AnaSouzaFaltou emendar o espaço " "

Exercícios

1. Com espaço

Complete para mostrar Ana Souza:

print("Ana" + + "Souza")

2. A linha de enfeite

Complete para mostrar 15 asteriscos (***************):

print("*" 15)

3. O separador

Complete para mostrar pão; leite; café:

print(.join(["pão", "leite", "café"]))

4. Quanto vale ("ab" + "c") * 2?

5. E sem os parênteses, "ab" + "c" * 2?

6. Com total = 25, qual linha dá TypeError?

Missão final: a etiqueta da padaria

Missão: a Ana quer uma etiqueta com o nome do bolo entre duas linhas de 10 asteriscos. Ela digitou os asteriscos na mão e errou a conta. Troque as duas linhas de asteriscos por "*" * 10.

print("********")
print("Bolo de fubá")
print("************")
print("*" * 10)
print("Bolo de fubá")
print("*" * 10)

Resumo

  • Entre textos, + emenda (concatena) e não põe espaço nenhum: o espaço você emenda junto (" ").
  • += vai montando o texto aos poucos (criando um texto novo a cada vez).
  • texto * n repete o texto n vezes; n tem de ser inteiro. Zero ou negativo dá o texto vazio.
  • separador.join(lista) junta uma lista de textos, com o separador só entre eles.
  • "texto" + 5 dá TypeError: can only concatenate str (not "int") to str: converta com str() ou use uma f-string.
  • Textos não têm - nem /; para tirar pedaços, existem o replace() e as fatias.