Python sep e end
Na aula print() você viu duas coisas que o print faz sozinho: põe um espaço entre os valores separados por vírgula e, no fim, pula para a linha de baixo. Quase sempre é isso que você quer. Mas às vezes a Ana precisa de uma lista separada por vírgulas, de uma data com barras, ou de duas mensagens na mesma linha. Para isso, o print tem duas opções: sep (de separator, "separador") e end (em inglês, "fim").
- A trocar o espaço entre os valores com
sep: vírgulas, barras, nada, ou uma linha para cada valor. - A trocar o pulo de linha do fim com
end: continuar na mesma linha ou terminar com outra coisa. - O que são argumentos nomeados (
nome=valor) e onde eles entram nos parênteses. - A usar
sepeendjuntos, e por que a ordem entre eles não importa. - Os erros reais:
sepcom número, sem aspas, no lugar errado, com o nome errado ou repetido.
Os programas desta aula foram rodados com o Python 3.14 na máquina fictícia da Ana (usuária ana, computador notebook), com python3 arquivo.py. Você pode repetir cada um nas caixas "Experimente".
A ideia: o que vai entre as contas de um colar, e o fecho
Imagine que a Ana está montando um colar de contas. Entre uma conta e outra ela pode pôr um nó, uma bolinha dourada ou nada. E, no fim do colar, vai um fecho.
No print, as contas são os valores que você escreve entre os parênteses. O que vai entre eles é o sep; o que vai depois do último é o end. Se você não disser nada, o Python usa os de sempre:
| Opção | O que é | Valor de sempre (padrão) |
|---|---|---|
sep | O texto colocado entre um valor e outro | " ", um espaço |
end | O texto colocado depois do último valor | "\n", a quebra de linha |
Esse "\n" é o jeito de escrever, dentro de um texto, o "pule para a linha de baixo": uma barra invertida e a letra n (de newline, "linha nova"). Ele tem aula própria, Caracteres de Escape; aqui, basta saber que ele é a quebra de linha.
Ou seja: um print comum já usa sep e end, só que com os valores padrão. As duas linhas abaixo fazem exatamente a mesma coisa:
print("a", "b")
print("a", "b", sep=" ", end="\n")
$ python3 padrao.py a b a b
1. sep: o que vai entre os valores
A Ana tem três itens na lista de compras. Veja o mesmo print com separadores diferentes:
print("arroz", "feijão", "café")
print("arroz", "feijão", "café", sep=", ")
print("arroz", "feijão", "café", sep=" | ")
print("arroz", "feijão", "café", sep="")
print(18, 10, 2026, sep="/")
$ python3 sep.py arroz feijão café arroz, feijão, café arroz | feijão | café arrozfeijãocafé 18/10/2026
- "arroz", "feijão", "café"
- Os valores, separados por vírgula, como na aula anterior.
- ,
- Mais uma vírgula, separando os valores da opção.
- sep
- O nome da opção: "separador".
- =
- "Recebe": o separador vai ser o que vem a seguir. Aqui, sem espaços em volta do
=, que é o costume nos argumentos nomeados. - ", "
- O novo separador, sempre um texto, entre aspas. Pode ter um caractere, vários, ou nenhum (
"").
Repare na linha 4: com sep="" (aspas sem nada dentro, o texto vazio), os valores saíram grudados. E na linha 5: os valores podem ser números, mas o separador é um texto ("/"). Foi assim que três números viraram uma data.
Ele não aparece antes do primeiro nem depois do último. Por isso sep=", " deu arroz, feijão, café, sem vírgula sobrando no fim. Com um valor só, não existe "entre", e o sep simplesmente não aparece.
Um valor por linha
O separador pode ser a própria quebra de linha. Aí cada valor sai na sua linha, com um print só:
print("arroz", "feijão", "café", sep="\n")
$ python3 sep-linha.py arroz feijão café
Missão: a Ana quer anotar a data da feira. O programa mostra 18 10 2026. Use sep para que ele mostre 18/10/2026, sem mudar os três números.
print(18, 10, 2026)
print(18, 10, 2026, sep="/")
2. end: o que vai no fim
O end é o que o print escreve depois do último valor. O padrão é "\n", e é por isso que cada print termina numa linha nova. Troque o end, e o próximo print continua de onde o anterior parou:
print("Bom dia", end="")
print("Ana")
print("Bom dia", end=", ")
print("Ana", end="!\n")
print("Tchau")
$ python3 end.py Bom diaAna Bom dia, Ana! Tchau
Vamos seguir o programa linha por linha:
print("Bom dia", end="")mostraBom diae, no fim, nada (texto vazio). Não pula a linha.print("Ana")continua na mesma linha: saiBom diaAna, tudo grudado, porque nenhum dos doisprintcolocou espaço. Este tem oendpadrão, então agora sim a linha pula.print("Bom dia", end=", ")mostraBom diaseguido de vírgula e espaço, e fica na mesma linha.print("Ana", end="!\n")mostraAnae termina com uma exclamação e a quebra de linha. Resultado da linha:Bom dia, Ana!.print("Tchau")começa na linha nova.
Um "carregando" na mesma linha
Um uso comum do end="" é ir montando uma linha aos pedaços:
print("Carregando", end="")
print(".", end="")
print(".", end="")
print(".", end="")
print(" pronto!")
$ python3 carregando.py Carregando... pronto!
Cinco print, uma linha só. Quando você conhecer as repetições com for, vai poder escrever os pontinhos com um laço, em vez de repetir a linha.
Se o último print do programa tiver end="", a linha nunca é terminada, e o terminal escreve o prompt grudado nela:
print("Pedido anotado", end="")
$ python3 sem-quebra.py Pedido anotadoana@notebook:~$ «o prompt da Ana ficou colado na saída
Não é erro, mas fica feio. Garanta que o último print pule a linha (com o end padrão ou terminando em "\n").
Missão: hoje os pontinhos estão saindo um em cada linha. Use end para que tudo apareça numa linha só: Carregando... pronto!
print("Carregando")
print(".")
print(".")
print(".")
print(" pronto!")
print("Carregando", end="")
print(".", end="")
print(".", end="")
print(".", end="")
print(" pronto!")
3. Argumentos nomeados: nome=valor
Tudo o que você entrega a uma função dentro dos parênteses se chama argumento. Até a aula passada, os argumentos do print eram só os valores a mostrar, um depois do outro. O Python sabe o que fazer com eles pela posição: são os argumentos posicionais.
sep e end são diferentes: eles vão com o nome na frente, sep=", ". São os argumentos nomeados (ou "de palavra-chave"). Duas regras valem para eles:
- Vêm depois dos valores a mostrar. Primeiro o que mostrar, depois as opções.
- Entre eles, a ordem não importa: como cada um tem nome, o Python sabe quem é quem.
print("pão", "leite", "ovos", sep=", ", end=".\n")
print("pão", "leite", "ovos", end=".\n", sep=", ")
print("Total", 3, "itens", sep=": ", end="\n\n")
print("Fim")
$ python3 juntos.py pão, leite, ovos. pão, leite, ovos. Total: 3: itens Fim
As duas primeiras linhas saíram iguais, mesmo com sep e end trocados de lugar. A terceira mostra duas coisas:
- O
sepvai entre todos os valores. A Ana queriaTotal: 3 itens, mas saiuTotal: 3: itens, com o": "também entre o 3 e o "itens". O separador não escolhe onde entrar. end="\n\n"são duas quebras de linha: uma termina a linha, a outra deixa uma linha em branco antes doFim.
Funções têm aula própria, onde você vai criar as suas com argumentos nomeados: Valores Padrão e Argumentos Nomeados.
print tem mais duas opções
Na documentação do Python, o print aparece assim: print(*objects, sep=' ', end='\n', file=None, flush=False). O *objects são os valores (quantos você quiser); sep e end, os desta aula. file (escrever num arquivo em vez da tela) e flush (mostrar na hora, sem esperar) ficam para mais adiante; você não vai precisar deles por enquanto.
Formas diferentes de mostrar a mesma linha
As quatro linhas abaixo mostram arroz, feijão, café:
print("arroz", "feijão", "café", sep=", ")
print("arroz, feijão, café")
print("arroz" + ", " + "feijão" + ", " + "café")
print("arroz, ", end="")
print("feijão, ", end="")
print("café")
$ python3 formas.py arroz, feijão, café arroz, feijão, café arroz, feijão, café arroz, feijão, café
| Forma | Quando usar |
|---|---|
sep=", " | Quando os valores já estão separados (vários números, várias variáveis) e você quer o mesmo separador entre todos |
| Um texto só, já pronto | Quando a frase é fixa. É o mais simples de ler |
Juntar com + | Só com textos. Fica comprido e é fácil esquecer um espaço; evite para frases longas |
Vários print com end="" | Quando a linha é montada aos pedaços, um de cada vez (como o "carregando") |
Para frases com valores no meio, como Total: 3 itens, o melhor caminho vai ser a f-string, que você vai conhecer mais adiante.
Quando dá errado
print("pão", "leite", sep=0)
$ python3 sep-numero.py
Traceback (most recent call last):
File "/home/ana/sep-numero.py", line 1, in <module>
print("pão", "leite", sep=0)
~~~~~^^^^^^^^^^^^^^^^^^^^^^^
TypeError: sep must be None or a string, not int
TypeError, "erro de tipo": "sep tem de ser None ou uma string (texto), e não int (número inteiro)". Os valores mostrados podem ser números, mas o separador não. (O None, "nada", quer dizer "use o padrão"; ele tem aula própria, O Valor None.) Como consertar: entre aspas, sep="0". O mesmo vale para o end.
print("pão", "leite", sep=-)
$ python3 sep-sem-aspas.py
File "/home/ana/sep-sem-aspas.py", line 1
print("pão", "leite", sep=-)
^
SyntaxError: invalid syntax
"Sintaxe inválida". Sem aspas, o - é o sinal de menos, e o Python esperava um número depois dele; encontrou o ), que o ^ aponta. A mensagem é genérica, mas o ^ mostra onde o Python se perdeu: olhe logo antes dele. Como consertar: sep="-".
print(sep="-", "pão", "leite")
$ python3 sep-antes.py
File "/home/ana/sep-antes.py", line 1
print(sep="-", "pão", "leite")
^
SyntaxError: positional argument follows keyword argument
"Argumento posicional depois de argumento nomeado". Os valores a mostrar (posicionais) têm de vir antes das opções com nome. Como consertar: print("pão", "leite", sep="-").
print("pão", "leite", spe="-")
$ python3 spe.py
Traceback (most recent call last):
File "/home/ana/spe.py", line 1, in <module>
print("pão", "leite", spe="-")
~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^
TypeError: print() got an unexpected keyword argument 'spe'
"print() recebeu um argumento nomeado inesperado: spe". O print só conhece sep, end, file e flush; qualquer outro nome dá esse erro. Aqui o Python não deu a dica "Did you mean", então confira a escrita letra por letra. Como consertar: sep="-".
print("pão", "leite", sep="-", sep="+")
$ python3 sep-dupla.py
File "/home/ana/sep-dupla.py", line 1
print("pão", "leite", sep="-", sep="+")
^^^^^^^
SyntaxError: keyword argument repeated: sep
"Argumento nomeado repetido: sep". Cada opção só pode aparecer uma vez por print. Como consertar: fique com um só.
sep com um valor só
print("pão", sep="-")
print("pão-leite")
$ python3 sep-um.py pão pão-leite
Sem erro, mas o - não apareceu na primeira linha. Com um valor só, não há "entre" para o separador ocupar. Se você queria um traço no fim, a opção certa é o end: print("pão", end="-\n").
Missão: a Ana queria ver pão - leite - ovos, mas o programa não roda. Leia a mensagem e conserte.
print(sep=" - ", "pão", "leite", "ovos")
print("pão", "leite", "ovos", sep=" - ")
Referência rápida
| Escrita | O que mostra |
|---|---|
print("a", "b", "c") | a b c (padrão: sep=" ", end="\n") |
print("a", "b", "c", sep=", ") | a, b, c |
print("a", "b", "c", sep="") | abc (sem separador) |
print(18, 10, 2026, sep="/") | 18/10/2026 |
print("a", "b", sep="\n") | Um valor em cada linha |
print("a", end="") | a e não pula a linha: o próximo print continua ao lado |
print("a", end="!\n") | a! e pula a linha |
print("a", end="\n\n") | a e uma linha em branco depois |
print(…, sep=…, end=…) | Os dois juntos, em qualquer ordem, sempre depois dos valores |
| Mensagem | Causa provável |
|---|---|
TypeError: sep must be None or a string, not int | Separador sem aspas que é um número: use sep="0" |
SyntaxError: invalid syntax (com o ^ logo depois do sep=) | Separador sem aspas |
SyntaxError: positional argument follows keyword argument | sep/end escrito antes dos valores |
TypeError: print() got an unexpected keyword argument 'spe' | Nome da opção digitado errado |
SyntaxError: keyword argument repeated: sep | A mesma opção duas vezes |
O prompt $ aparece grudado na saída | O último print tem end="" |
Exercícios
1. Hora com dois-pontos
Complete para mostrar 14:30:
2. Na mesma linha
Complete para que Olá e Ana saiam na mesma linha, como Olá Ana:
print("Ana")
3. Qual é a saída?
O que mostra print("a", "b", "c", sep="")?
4. O que mostra print("Total", 5, sep=": ", end="!\n")?
5. Qual destas linhas dá erro?
6. Qual é o valor padrão do end?
Missão final: a etiqueta da feira
Missão: monte a etiqueta Feira: tomate, alface, cenoura., com o ponto final no fim. Mantenha o primeiro print e use end nele para continuar na mesma linha; no segundo, use sep para as vírgulas e end para o ponto final.
print("Feira:")
print("tomate", "alface", "cenoura")
print("Feira:", end=" ")
print("tomate", "alface", "cenoura", sep=", ", end=".\n")
Resumo
sepé o texto que vai entre os valores; o padrão é um espaço.sep=""gruda tudo;sep="\n"põe um valor por linha.endé o texto que vai depois do último valor; o padrão é"\n", a quebra de linha. Comend="", o próximoprintcontinua na mesma linha.- Os dois são argumentos nomeados (
nome=valor): vêm depois dos valores, e a ordem entre eles não importa. - O valor de
sepeendé sempre um texto, entre aspas. Número dáTypeError; sem aspas,SyntaxError. - O
sepentra entre todos os valores, e não aparece quando há um valor só. - Termine a última linha do programa: se o último
printtiverend="", o prompt do terminal gruda na saída.