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").

Você vai aprender
  • 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 sep e end juntos, e por que a ordem entre eles não importa.
  • Os erros reais: sep com 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çãoO que éValor de sempre (padrão)
sepO texto colocado entre um valor e outro" ", um espaço
endO 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.

O separador só vai entre os valores

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:

  1. print("Bom dia", end="") mostra Bom dia e, no fim, nada (texto vazio). Não pula a linha.
  2. print("Ana") continua na mesma linha: sai Bom diaAna, tudo grudado, porque nenhum dos dois print colocou espaço. Este tem o end padrão, então agora sim a linha pula.
  3. print("Bom dia", end=", ") mostra Bom dia seguido de vírgula e espaço, e fica na mesma linha.
  4. print("Ana", end="!\n") mostra Ana e termina com uma exclamação e a quebra de linha. Resultado da linha: Bom dia, Ana!.
  5. 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.

Termine a última 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 sep vai entre todos os valores. A Ana queria Total: 3 itens, mas saiu Total: 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 do Fim.

Funções têm aula própria, onde você vai criar as suas com argumentos nomeados: Valores Padrão e Argumentos Nomeados.

O 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é
FormaQuando 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á prontoQuando 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

Separador que não é texto
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.

Separador sem aspas
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="-".

A opção antes dos valores
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="-").

Nome da opção digitado errado
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="-".

A mesma opção duas vezes
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ó.

Esperar o 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

EscritaO 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
MensagemCausa provável
TypeError: sep must be None or a string, not intSeparador 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 argumentsep/end escrito antes dos valores
TypeError: print() got an unexpected keyword argument 'spe'Nome da opção digitado errado
SyntaxError: keyword argument repeated: sepA mesma opção duas vezes
O prompt $ aparece grudado na saídaO último print tem end=""

Exercícios

1. Hora com dois-pontos

Complete para mostrar 14:30:

print(14, 30, =":")

2. Na mesma linha

Complete para que Olá e Ana saiam na mesma linha, como Olá Ana:

print("Olá", end=)
print("Ana")

3. Qual é a saída?

O que mostra print("a", "b", "c", sep="")?

Saída:

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. Com end="", o próximo print continua 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 sep e end é sempre um texto, entre aspas. Número dá TypeError; sem aspas, SyntaxError.
  • O sep entra entre todos os valores, e não aparece quando há um valor só.
  • Termine a última linha do programa: se o último print tiver end="", o prompt do terminal gruda na saída.