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.
- 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 doprintou uma f-string. - Os erros reais:
"texto" + 5,5 + "texto","ha" * "3", texto menos texto ejoin()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ção | Escrita | Exemplo | Resultado |
|---|---|---|---|
| Emendar | texto + texto | "Ana" + " Souza" | 'Ana Souza' |
| Repetir | texto * número | "ha" * 3 | 'hahaha' |
| Juntar uma lista | separador.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 oprintmostrou 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: oprintaceita 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
fantes 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
| Forma | Exemplo | Quando usar |
|---|---|---|
+ | nome + " " + sobrenome | Para emendar poucos textos |
+= | recado += " pão" | Para ir montando aos poucos |
Vírgula do print | print("Pães:", 3) | Só para mostrar na tela, com números no meio |
| f-string | f"Olá, {nome}!" | Para montar frases com variáveis (o mais usado) |
* | "-" * 20 | Para repetir |
join() | ", ".join(compras) | Para juntar uma lista, com separador |
Quando dá errado
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ávelidade. 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ãoint) a umstr." Ao texto, você só pode emendar outro texto, eidadeé 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".
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".
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.
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
| Escrita | O que faz | Exemplo → resultado |
|---|---|---|
a + b | Emenda dois textos | "Ana" + "Souza" → 'AnaSouza' |
a += b | Emenda e guarda de volta em a | recado += " pão" |
texto * n | Repete n vezes (n inteiro) | "ha" * 3 → 'hahaha' |
texto * 0 | Texto 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' |
| Sintoma | Causa provável |
|---|---|
TypeError: can only concatenate str (not "int") to str | Texto + 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 found | join() com números na lista |
Palavras grudadas: AnaSouza | Faltou emendar o espaço " " |
Exercícios
1. Com espaço
Complete para mostrar Ana Souza:
2. A linha de enfeite
Complete para mostrar 15 asteriscos (***************):
3. O separador
Complete para mostrar 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 * nrepete o textonvezes;ntem 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" + 5dáTypeError: can only concatenate str (not "int") to str: converta comstr()ou use uma f-string.- Textos não têm
-nem/; para tirar pedaços, existem oreplace()e as fatias.