Exemplo de uso da instrução "continue" em Python?

177

A definição da continuedeclaração é:

A continueinstrução continua com a próxima iteração do loop.

Não consigo encontrar bons exemplos de código.

Alguém poderia sugerir alguns casos simples, quando continuenecessário?

JohnG
fonte

Respostas:

218

Aqui está um exemplo simples:

for letter in 'Django':    
    if letter == 'D':
        continue
    print("Current Letter: " + letter)

A saída será:

Current Letter: j
Current Letter: a
Current Letter: n
Current Letter: g
Current Letter: o

Ele continua na próxima iteração do loop.

Snehal Parmar
fonte
1
Eu estive pensando nos últimos três ou quatro dias, por que eu precisaria de uma declaração de 'continuar' e depois me deparo com este post que, por sua vez, me ajuda com algum controle de qualidade - muito obrigado!
Freddy
3
mesmo aqui, quando escrevemos script python (para tarefa cron) e iteramos em valores grandes e ocorre alguma exceção, a tarefa cron será interrompida e você só poderá saber que no dia seguinte isso ajuda bastante nesses casos, Sim podemos escrever o recurso enviar e-mail como exceção, mas ainda assim a execução será interrompida.
Snehal Parmar
2
Isto ilustra o que continuefaz, mas não excessivamente útil, quando você poderia fazerif letter != 'D': print 'Current Letter:', letter
Chris_Rands
Eu teria escolhido Pray / remove r ou Fast / remove s.
Benjamin Crouzier 7/01/19
102

Eu gosto de usar continue em loops, onde há muitas competições a serem cumpridas antes de você começar a trabalhar. Então, em vez de código como este:

for x, y in zip(a, b):
    if x > y:
        z = calculate_z(x, y)
        if y - z < x:
            y = min(y, z)
            if x ** 2 - y ** 2 > 0:
                lots()
                of()
                code()
                here()

Eu recebo código como este:

for x, y in zip(a, b):
    if x <= y:
        continue
    z = calculate_z(x, y)
    if y - z >= x:
        continue
    y = min(y, z)
    if x ** 2 - y ** 2 <= 0:
        continue
    lots()
    of()
    code()
    here()

Ao fazer isso dessa maneira, evito código profundamente aninhado. Além disso, é fácil otimizar o loop eliminando os casos que ocorrem com mais frequência primeiro, para que eu tenha que lidar apenas com os casos pouco frequentes, mas importantes (por exemplo, o divisor é 0) quando não há nenhum outro limitador de exibição.

Lauritz V. Thaulow
fonte
2
Portanto, "continue" é usado principalmente para facilitar a leitura, reduzindo o recuo. Gostaria de saber se "continuar" acrescenta algum poder expressivo.
JohnG
14
Usar continuedessa maneira é semelhante ao uso GOTO. No entanto, esta é a maneira correta de usar GOTO.
dotancohen
1
@JohnG Eu não acredito que haja qualquer uso de continue (ou quebre, nesse caso) que não possa ser reproduzido sem ele, embora não o tenha possa ser caro em tempo de execução.
Sparr
18

Geralmente, a situação em que continuar é necessária / útil é quando você deseja pular o código restante no loop e continuar a iteração.

Realmente não acredito que seja necessário, pois você sempre pode usar as instruções if para fornecer a mesma lógica, mas pode ser útil aumentar a legibilidade do código.

pcalcao
fonte
23
observe que usar em if <condition>: continuevez de if not <condition>: ...evitar um nível de indentação que seria necessário se fosse escrito sem ele.
Dan D.
1
Eu estava prestes a postar um qn semelhante ao JohnG, mas depois descobri que ele já havia perguntado o que eu queria saber. A leitura de todas as respostas aqui ajudou, mas ainda preciso ter certeza de uma coisa - então, sempre que usamos uma continuedeclaração, estamos basicamente pulando de uma seção de testes condicionais e permitindo que a iteração do loop continue. para a próxima iteração? Não está claro para mim como isso seria melhor do que usar else. É tudo uma questão de legibilidade aprimorada e desempenho em tempo de execução?
AKKO
"Não acredito que seja necessário" ... bem, os criadores de python pensaram o contrário.
Jean-François Fabre
12
import random  

for i in range(20):  
    x = random.randint(-5,5)  
    if x == 0: continue  
    print 1/x  

continue é uma declaração de controle extremamente importante. O código acima indica uma aplicação típica, onde o resultado de uma divisão por zero pode ser evitado. Eu o uso frequentemente quando preciso armazenar a saída de programas, mas não quero armazenar a saída se o programa falhar. Observe que, para testar o exemplo acima, substitua a última instrução por print 1 / float (x), ou você obterá zeros sempre que houver uma fração, pois randint retorna um número inteiro. Eu o omiti por clareza.

user1871712
fonte
10

Algumas pessoas comentaram sobre legibilidade, dizendo: "Oh, isso não ajuda muito a legibilidade, quem se importa?"

Suponha que você precise de uma verificação antes do código principal:

if precondition_fails(message): continue

''' main code here '''

Observe que você pode fazer isso depois que o código principal foi gravado sem alterá-lo. Se você difere o código, somente a linha adicionada com "continuar" será destacada, pois não há alterações de espaçamento no código principal.

Imagine se você tiver que fazer um pequeno código de produção, que acaba adicionando uma linha com continue. É fácil ver que essa é a única alteração quando você revisa o código. Se você começar a agrupar o código principal em if / else, o diff destacará o código recuado, a menos que você ignore as alterações de espaçamento, o que é perigoso principalmente no Python. Acho que, a menos que você esteja na situação em que precisa implantar código em pouco tempo, talvez não aprecie isso completamente.

CS
fonte
5
def filter_out_colors(elements):
  colors = ['red', 'green']
  result = []
  for element in elements:
    if element in colors:
       continue # skip the element
    # You can do whatever here
    result.append(element)
  return result

  >>> filter_out_colors(['lemon', 'orange', 'red', 'pear'])
  ['lemon', 'orange', 'pear']
ILYA Khlopotov
fonte
4
Mas o que a continuedeclaração adiciona aqui? Poderia ser eliminado usando element not in colors, e o código seria igualmente legível.
ekhumoro
4

Digamos que queremos imprimir todos os números que não sejam múltiplos de 3 e 5

for x in range(0, 101):
    if x % 3 ==0 or x % 5 == 0:
        continue
        #no more code is executed, we go to the next number 
    print x
ytpillai
fonte
Você também poderia usar apenas if x %3 == 0 or x % 5 == 0:, pass, else:,print x
Wildcard
A maneira correta é usar o operador continuar ou não. Por que usar desnecessariamente o passe?
ytpillai
Eu gosto mais do seu jeito (daí o voto positivo). Eu vim a esta página tentando descobrir se há alguma necessidade de uso continue. Minha conclusão é que nunca há uma necessidade , mas em alguns casos (como este) o código é mais legível usando continue. É um exemplo muito bom.
Wildcard
3

Não é absolutamente necessário, pois pode ser feito com IFs, mas é mais legível e também mais barato em tempo de execução.

Eu o uso para pular uma iteração em um loop se os dados não atenderem a alguns requisitos:

# List of times at which git commits were done.
# Formatted in hour, minutes in tuples.
# Note the last one has some fantasy.
commit_times = [(8,20), (9,30), (11, 45), (15, 50), (17, 45), (27, 132)]

for time in commit_times:
    hour = time[0]
    minutes = time[1]

    # If the hour is not between 0 and 24
    # and the minutes not between 0 and 59 then we know something is wrong.
    # Then we don't want to use this value,
    # we skip directly to the next iteration in the loop.
    if not (0 <= hour <= 24 and 0 <= minutes <= 59):
        continue

    # From here you know the time format in the tuples is reliable.
    # Apply some logic based on time.
    print("Someone commited at {h}:{m}".format(h=hour, m=minutes))

Resultado:

Someone commited at 8:20
Someone commited at 9:30
Someone commited at 11:45
Someone commited at 15:50
Someone commited at 17:45

Como você pode ver, o valor errado não chegou depois da continuedeclaração.

Bastian
fonte
ifsó pode fazer o que continuefaz se todo o código estiver contido em um bloco. continueignora o código que está fora do ifbloco.
bryc
por que a hora inclui 24 horas e o minuto 60 é exclusivo?
Patrick Artner
nenhum motivo especial, apenas um exemplo, fique à vontade para editar
Bastian
1

Por exemplo, se você deseja fazer coisas diferentes, dependendo do valor de uma variável:

my_var = 1
for items in range(0,100):
    if my_var < 10:
        continue
    elif my_var == 10:
        print("hit")
    elif my_var > 10:
        print("passed")
    my_var = my_var + 1

No exemplo acima, se eu usar breako intérprete, pulará o loop. Mas com continueele apenas pula as instruções if-elif e vai diretamente para o próximo item do loop.

jonathan.hepp
fonte
3
seu exemplo nunca imprimirá nada, pois a primeira condição é sempre verdadeira. assumindo um valor inicial para my_varde 0.
Dan D.
Simplesmente adaptei um exemplo de um antigo código meu. O valor original da var não é 0 e a parte crescente foi adicionada por conveniência, pois seu local original não estava lá. Como é um exemplo e seu valor realmente não importa, acho que está tudo bem.
jonathan.hepp
9
Não está bem. Não é um bom anúncio para usar continue.
precisa
3
E o primeiro elifdeve ser um if. O código simplesmente não parece que você sabe o que está fazendo.
precisa
este é um péssimo exemplo
patrick
0

continue simplesmente pula o restante do código no loop até a próxima iteração

Yanfeng Liu
fonte