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.
- A sair de um laço com
break: parar a busca quando achar o que procura. - A usar
while Truecombreak: repetir até o usuário digitarfim. - 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
continuenowhile, que trava o programa. - Os erros reais:
'break' outside loop,'continue' not properly in loope obreakno 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.
| Comando | O que faz | No dia a dia |
|---|---|---|
break | Sai do laço na hora; o programa segue na primeira linha depois do laço | Achei a chave: paro de abrir gavetas |
continue | Abandona só esta volta e vai para a próxima | Laranja 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. Obreakfica sozinho na linha, sem parênteses nem dois-pontos. - print("Fim da busca.")
- A primeira linha depois do laço: é para cá que o
breakpula.
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
| Volta | nome | nome == procurado? | O que acontece |
|---|---|---|---|
| 1ª | "Ana" | False | Mostra Conferindo Ana... e segue |
| 2ª | "Bruno" | False | Mostra Conferindo Bruno... e segue |
| 3ª | "Carla" | True | Mostra 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 += valore oprintde 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ção | Qual usar |
|---|---|
| Procurar algo e parar quando achar | for com if … : break |
| Ler até o usuário digitar uma palavra de saída | while True: com break (lê uma vez só) ou while resposta != "fim": (lê duas vezes) |
| Pular itens, com pouca coisa para fazer nos outros | if invertido, sem continue |
| Pular itens, com muitas linhas para os outros | if … : continue no começo do bloco (cláusula de guarda) |
Saber, depois do laço, se ele saiu por break | else 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.
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
| Escrita | O que faz |
|---|---|
break | Sai do laço na hora; segue na primeira linha depois dele |
continue | Pula o resto desta volta e vai para a próxima |
if achou: break | Busca que para no primeiro que serve |
while True: … if resposta == "fim": break | Repetir até o usuário mandar parar |
for tentativa in range(3): … break | No máximo 3 tentativas; sai antes se acertar |
if ruim: continue no começo do bloco | Cláusula de guarda: ignora os itens que não servem |
| Sintoma | Causa provável |
|---|---|
SyntaxError: 'break' outside loop | break fora de for/while (por exemplo, só num if) |
SyntaxError: 'continue' not properly in loop | continue fora de for/while |
| O laço para logo na primeira volta | O break está fora do if (indentação) |
| O programa para de mostrar coisas e não termina | continue antes do passo num while |
| A busca acha, mas continua olhando o resto | Faltou o break |
Exercícios
1. Qual palavra?
Complete com a palavra que sai do laço assim que o número 7 aparecer:
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()
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
breaksai do laço na hora; o programa segue na primeira linha depois dele. Use para parar uma busca quando achar.continueabandona só a volta atual e passa para a próxima. Use para pular itens que não servem.- Os dois só funcionam dentro de
forouwhile; fora deles, dáSyntaxError. Quase sempre aparecem dentro de umif, e a indentação decide quando rodam. while True:combreakrepete até você mandar parar, lendo a entrada uma vez só.- No
while, faça o passo antes docontinue, senão o laço trava. - Para saber, depois do laço, se ele saiu por
break, existe o else nos Laços.