Python break e continue

Os laços que você escreveu até aqui vão do começo ao fim: o for passa por todos os itens, o while repete até a condição ficar falsa. Mas às vezes você quer mudar o rumo no meio de uma volta. Achou o que procurava? Não precisa olhar o resto: break ("quebrar"), e o laço acaba ali. Esse item não interessa? Pule para o próximo: continue ("continuar"), e o laço vai direto para a volta seguinte.

Você vai aprender
  • A sair de um laço com break: parar a busca quando achar o que procura.
  • A usar while True com break: repetir até o usuário digitar fim.
  • A dar um número limitado de tentativas (a senha com 3 chances).
  • A pular uma volta com continue: ignorar letras, valores negativos, múltiplos de 3.
  • A armadilha do continue no while, que trava o programa.
  • Os erros reais: 'break' outside loop, 'continue' not properly in loop e o break no lugar errado.

Todos os programas desta aula rodaram no Python 3.14 da máquina da Ana (usuária ana, computador notebook), com python3 arquivo.py.


A ideia: a chave na gaveta e as frutas machucadas

A Ana procura a chave do portão numa cômoda de cinco gavetas. Ela abre a primeira: nada. A segunda: nada. A terceira: achou. Ela abre a quarta e a quinta? Claro que não: ela para de procurar. Esse "pare agora" é o break.

Depois, ela vai à feira escolher laranjas, uma por uma. Quando pega uma machucada, ela não desiste da feira: só deixa aquela de lado e pega a próxima. Esse "pule esta e siga" é o continue.

ComandoO que fazNo dia a dia
breakSai do laço na hora; o programa segue na primeira linha depois do laçoAchei a chave: paro de abrir gavetas
continueAbandona só esta volta e vai para a próximaLaranja machucada: deixo de lado e pego a próxima

Os dois só fazem sentido dentro de um laço (for ou while), e quase sempre aparecem dentro de um if: "se achei, pare"; "se está machucada, pule".


1. break: parar a busca quando achar

A Ana confere a lista de convidados da festa, procurando a Carla:

convidados = ["Ana", "Bruno", "Carla", "Davi", "Elisa"]
procurado = "Carla"
for nome in convidados:
    print(f"Conferindo {nome}...")
    if nome == procurado:
        print(f"Achei a {procurado}!")
        break
print("Fim da busca.")
$ python3 convidados.py
Conferindo Ana...
Conferindo Bruno...
Conferindo Carla...
Achei a Carla!
Fim da busca.
for nome in convidados:
Passa pelos nomes, um de cada vez (veja for).
if nome == procurado:
Em cada volta, pergunta: é a Carla?
print(f"Achei a {procurado}!")
Se for, avisa…
break
…e sai do laço na mesma hora. Ele está 8 espaços para dentro: faz parte do if, então só roda quando acha. O break fica sozinho na linha, sem parênteses nem dois-pontos.
print("Fim da busca.")
A primeira linha depois do laço: é para cá que o break pula.

Davi e Elisa nem foram conferidos. Compare com o mesmo programa sem o break:

$ python3 sem_break.py
Conferindo Ana...
Conferindo Bruno...
Conferindo Carla...
Achei a Carla!
Conferindo Davi...
Conferindo Elisa...
Fim da busca.

Sem o break, o laço achou a Carla e continuou olhando o resto da lista à toa. Numa lista de cinco nomes, tanto faz; numa lista de um milhão, parar cedo economiza muito trabalho.

Passo a passo

Voltanomenome == procurado?O que acontece
1ª"Ana"FalseMostra Conferindo Ana... e segue
2ª"Bruno"FalseMostra Conferindo Bruno... e segue
3ª"Carla"TrueMostra Conferindo Carla... e Achei a Carla!; o break encerra o laço
———Pula para Fim da busca.; Davi e Elisa ficam sem conferir

Missão: o programa procura o primeiro preço acima de R$ 50 na lista, mas continua olhando depois de achar. Ponha um break no lugar certo para ele parar no 72 (o Olhando 15 não deve aparecer).

precos = [12, 38, 72, 15, 90]
for preco in precos:
    print(f"Olhando {preco}")
    if preco > 50:
        print(f"Achei o {preco}!")
print("Fim.")
precos = [12, 38, 72, 15, 90]
for preco in precos:
    print(f"Olhando {preco}")
    if preco > 50:
        print(f"Achei o {preco}!")
        break
print("Fim.")

2. while True com break: até digitar "fim"

Na aula while, você viu que while True: é um laço que, sozinho, nunca termina: a condição True é sempre verdadeira. Com um break lá dentro, ele vira um laço que termina quando você decidir, no ponto exato do bloco que você escolher. A Ana anota a lista de compras até digitar fim:

while True:
    produto = input("Produto (ou fim): ")
    if produto == "fim":
        break
    print(f"Anotado: {produto}")
print("Lista fechada.")
$ python3 lista_fim.py
Produto (ou fim): pão
Anotado: pão
Produto (ou fim): leite
Anotado: leite
Produto (ou fim): fim
Lista fechada.

A ordem das linhas dentro do bloco é o que faz isso funcionar: lê, testa e só depois usa. Quando a Ana digitou fim, o break saiu do laço antes do print, e por isso não apareceu Anotado: fim.

Um número limitado de tentativas

Também dá para usar break num for com range(). O programa da padaria dá à Ana 3 chances de acertar a senha:

for tentativa in range(1, 4):
    senha = input(f"Senha (tentativa {tentativa} de 3): ")
    if senha == "pao123":
        print("Bem-vinda, Ana!")
        break
    print("Senha errada.")
print("Fim do programa.")

Acertando na segunda tentativa, o break encerra o laço, e a terceira pergunta nem aparece:

$ python3 senha.py
Senha (tentativa 1 de 3): pao12
Senha errada.
Senha (tentativa 2 de 3): pao123
Bem-vinda, Ana!
Fim do programa.

Errando as três, o for termina sozinho, porque o range acabou:

$ python3 senha.py
Senha (tentativa 1 de 3): abc
Senha errada.
Senha (tentativa 2 de 3): 123
Senha errada.
Senha (tentativa 3 de 3): pao
Senha errada.
Fim do programa.

Repare que nos dois casos o programa termina com o mesmo Fim do programa.. Seria bom avisar "acesso bloqueado" quando as três tentativas falham, mas como saber, depois do laço, se ele terminou pelo break ou porque as tentativas acabaram? O Python tem uma ferramenta exatamente para isso, e ela é a próxima aula: else nos Laços.


3. continue: pular uma volta

O continue não sai do laço: ele abandona a volta atual e passa para a próxima. Tudo o que estiver abaixo dele no bloco é pulado só desta vez. Um exemplo pequeno, tirando os a de banana:

for letra in "banana":
    if letra == "a":
        continue
    print(letra, end="")
print()
$ python3 sem_a.py
bnn

Nas voltas em que a letra é a, o continue pula o print, e o laço vai para a próxima letra. Nas outras, o print roda normalmente. Sobraram b, n, n.

Ignorando valores que não servem

Uma lista de valores do caixa veio com alguns números negativos (estornos que a Ana quer deixar de fora da conta). O continue pula esses:

valores = [12, -5, 30, -2, 8]
total = 0
for valor in valores:
    if valor < 0:
        print(f"Pulando {valor}")
        continue
    total += valor
    print(f"Somei {valor}, total = {total}")
print(f"Total: {total}")
$ python3 positivos.py
Somei 12, total = 12
Pulando -5
Somei 30, total = 42
Pulando -2
Somei 8, total = 50
Total: 50
if valor < 0:
O teste do item "ruim".
continue
Para os negativos: pula o resto do bloco (o total += valor e o print de baixo) e vai para o próximo valor.
total += valor
Só chega aqui quem passou pelo teste: os valores de 0 para cima.

Esse jeito de escrever se chama cláusula de guarda: os casos que não interessam são despachados logo no começo do bloco, e o resto do código cuida só do caso normal, sem precisar ficar mais indentado.

Missão: mostre os números de 1 a 10, um por linha, pulando os múltiplos de 3 (3, 6 e 9). Use continue. Dica: numero % 3 == 0 é True quando o resto da divisão por 3 é zero (veja Operadores Aritméticos).

for numero in range(1, 11):
    print(numero)
for numero in range(1, 11):
    if numero % 3 == 0:
        continue
    print(numero)

4. continue no while: cuidado com o passo

No for, o continue é tranquilo: quem avança para o próximo item é o próprio for. No while, quem avança é você, com o passo (o numero += 1). Por isso o passo tem de vir antes do continue:

numero = 0
while numero < 10:
    numero += 1
    if numero % 3 == 0:
        continue
    print(numero, end=" ")
print()
$ python3 continue_while.py
1 2 4 5 7 8 10 

O numero += 1 é a primeira linha do bloco, então ele roda em toda volta, inclusive nas que o continue interrompe. A seção Quando dá errado mostra o que acontece quando o passo fica depois do continue.


Formas diferentes de fazer a mesma coisa

break e continue nunca são obrigatórios: sempre dá para escrever sem eles. A questão é qual versão fica mais fácil de ler.

continue × if ao contrário

A soma dos valores positivos, sem continue: em vez de "se for negativo, pule", escreva "se não for negativo, some":

valores = [12, -5, 30, -2, 8]
total = 0
for valor in valores:
    if valor >= 0:
        total += valor
print(f"Total: {total}")
$ python3 positivos_if.py
Total: 50

Com uma linha só para fazer, o if invertido é mais simples. O continue compensa quando o caso normal tem muitas linhas: sem ele, todas elas ficariam um nível mais para dentro.

while True + break × condição no while

A lista de compras, sem break, com a condição no próprio while:

produto = input("Produto (ou fim): ")
while produto != "fim":
    print(f"Anotado: {produto}")
    produto = input("Produto (ou fim): ")
print("Lista fechada.")
$ python3 while_cond.py
Produto (ou fim): pão
Anotado: pão
Produto (ou fim): leite
Anotado: leite
Produto (ou fim): fim
Lista fechada.

Mesmo resultado, mas o input aparece duas vezes (antes do laço e no fim do bloco). Com while True, ele aparece uma vez só.

SituaçãoQual usar
Procurar algo e parar quando acharfor com if … : break
Ler até o usuário digitar uma palavra de saídawhile True: com break (lê uma vez só) ou while resposta != "fim": (lê duas vezes)
Pular itens, com pouca coisa para fazer nos outrosif invertido, sem continue
Pular itens, com muitas linhas para os outrosif … : continue no começo do bloco (cláusula de guarda)
Saber, depois do laço, se ele saiu por breakelse no laço (aula else nos Laços)

Quando dá errado

break fora de um laço

Quem acabou de aprender o break às vezes tenta usá-lo para "sair do if":

nota = 7
if nota >= 6:
    print("Aprovada")
    break
$ python3 break_fora.py
  File "/home/ana/break_fora.py", line 4
    break
    ^^^^^
SyntaxError: 'break' outside loop

"Erro de sintaxe: break fora de um laço". O break sai de um for ou de um while; um if sozinho não é laço, e não há de onde sair. Como é erro de sintaxe, nem o Aprovada aparece: o programa não chega a rodar. Como consertar: tire o break. Um if termina sozinho, no fim do seu bloco.

continue fora de um laço
nota = 7
if nota >= 6:
    continue
print("Fim")
$ python3 continue_fora.py
  File "/home/ana/continue_fora.py", line 3
    continue
    ^^^^^^^^
SyntaxError: 'continue' not properly in loop

"continue não está propriamente dentro de um laço". Mesmo caso: não existe "próxima volta" fora de um laço. Como consertar: use o continue só dentro de um for ou while.

O break ficou fora do if

Uma diferença de indentação, e a busca para no primeiro nome:

convidados = ["Ana", "Bruno", "Carla", "Davi", "Elisa"]
procurado = "Carla"
for nome in convidados:
    print(f"Conferindo {nome}...")
    if nome == procurado:
        print(f"Achei a {procurado}!")
    break
print("Fim da busca.")
$ python3 break_cedo.py
Conferindo Ana...
Fim da busca.

Nenhuma mensagem de erro. O break está com 4 espaços, alinhado com o if: ele faz parte do for, mas não do if. Então roda em toda volta, já na primeira, achando ou não. Como consertar: indente o break com 8 espaços, junto do print do if.

continue antes do passo, no while: o programa trava
numero = 1
while numero <= 10:
    if numero % 3 == 0:
        continue
    print(numero)
    numero += 1
print("Fim!")
$ python3 continue_trava.py
1
2
^CTraceback (most recent call last):           « nada acontecia; a Ana apertou Ctrl+C
  File "/home/ana/continue_trava.py", line 4, in <module>
    continue
KeyboardInterrupt

$ echo $?
130

O programa mostrou 1 e 2 e ficou parado, sem mostrar mais nada e sem terminar. Quando o numero chegou a 3, o continue pulou o numero += 1. Na volta seguinte, o número ainda era 3, o continue pulou de novo, e assim para sempre: um laço infinito silencioso, porque o print também é pulado. Só o Ctrl+C o interrompeu (o KeyboardInterrupt está explicado na aula while). No editor do guia, você pararia com o botão ■ Parar; se não parar, o editor o encerra sozinho depois de 10 segundos, avisando que pode ser um laço infinito. A linha mostrada no traceback é onde o programa estava naquele instante; num laço tão curto, podia ser a 3 ou a 4. Como consertar: faça o passo antes do continue, como na seção 4, ou use um for com range, que avança sozinho.


Referência rápida

EscritaO que faz
breakSai do laço na hora; segue na primeira linha depois dele
continuePula o resto desta volta e vai para a próxima
if achou: breakBusca que para no primeiro que serve
while True: … if resposta == "fim": breakRepetir até o usuário mandar parar
for tentativa in range(3): … breakNo máximo 3 tentativas; sai antes se acertar
if ruim: continue no começo do blocoCláusula de guarda: ignora os itens que não servem
SintomaCausa provável
SyntaxError: 'break' outside loopbreak fora de for/while (por exemplo, só num if)
SyntaxError: 'continue' not properly in loopcontinue fora de for/while
O laço para logo na primeira voltaO break está fora do if (indentação)
O programa para de mostrar coisas e não terminacontinue antes do passo num while
A busca acha, mas continua olhando o restoFaltou o break

Exercícios

1. Qual palavra?

Complete com a palavra que sai do laço assim que o número 7 aparecer:

for n in [3, 7, 9]:
    if n == 7:
        

2. O que sobra?

O que este programa mostra (tudo junto, sem espaços)?

for letra in "python":
    if letra in "aeiouy":
        continue
    print(letra, end="")
print()
Mostra .

3. Qual é a diferença entre break e continue?

4. Quantas vezes aparece Oi? for i in range(10): /     if i == 3: /         break /     print("Oi")

5. Um programa com if e break, sem nenhum laço, dá SyntaxError: 'break' outside loop. Qual é o conserto?

Missão final: o caixa que ignora os estornos

Missão: o caixa lê valores até a Ana digitar fim (isso o break já resolve). Mas os valores negativos estão entrando na soma. A caixa vai "digitar" 10, -5, 20 e fim. Use continue no lugar do comentário para pular os negativos: o total deve dar 30.

total = 0
while True:
    texto = input("Valor (ou fim): ")
    if texto == "fim":
        break
    valor = int(texto)
    # pule os valores negativos aqui
    total += valor
print(f"Total: {total}")
total = 0
while True:
    texto = input("Valor (ou fim): ")
    if texto == "fim":
        break
    valor = int(texto)
    if valor < 0:
        continue
    total += valor
print(f"Total: {total}")

No lab, com as mesmas entradas digitadas no terminal:

$ python3 total_fim.py
Valor (ou fim): 10
Valor (ou fim): -5
Valor (ou fim): 20
Valor (ou fim): fim
Total: 30

Resumo

  • break sai do laço na hora; o programa segue na primeira linha depois dele. Use para parar uma busca quando achar.
  • continue abandona só a volta atual e passa para a próxima. Use para pular itens que não servem.
  • Os dois só funcionam dentro de for ou while; fora deles, dá SyntaxError. Quase sempre aparecem dentro de um if, e a indentação decide quando rodam.
  • while True: com break repete até você mandar parar, lendo a entrada uma vez só.
  • No while, faça o passo antes do continue, senão o laço trava.
  • Para saber, depois do laço, se ele saiu por break, existe o else nos Laços.