Eu queria saber se existem maneiras internas de continuar a próxima iteração no loop externo em python. Por exemplo, considere o código:
for ii in range(200):
for jj in range(200, 400):
...block0...
if something:
continue
...block1...
Eu quero que essa instrução continue saia do loop jj e vá para o próximo item no loop ii. Eu posso implementar essa lógica de alguma outra maneira (definindo uma variável flag), mas existe uma maneira fácil de fazer isso ou é como pedir demais?
Respostas:
Em geral, quando você tem vários níveis de loop e
break
não funciona para você (porque deseja continuar com um dos loops superiores, não aquele logo acima do atual), você pode executar um dos seguintes procedimentosRefatorar os loops dos quais você deseja escapar para uma função
A desvantagem é que você pode precisar passar para essa nova função algumas variáveis, que estavam anteriormente no escopo. Você pode apenas passá-los como parâmetros, transformá-los em variáveis de instância em um objeto (crie um novo objeto apenas para esta função, se isso fizer sentido) ou variáveis globais, singletons, o que for (ehm, ehm).
Ou você pode definir
inner
como uma função aninhada e permitir apenas capturar o que precisa (pode ser mais lento?)Use exceções
Filosoficamente, é para isso que servem as exceções, interrompendo o fluxo do programa através dos blocos de construção da programação estruturada (se, por, enquanto) quando necessário.
A vantagem é que você não precisa dividir o único pedaço de código em várias partes. Isso é bom se for algum tipo de cálculo que você está projetando enquanto o escreve em Python. A introdução de abstrações nesse ponto inicial pode atrasá-lo.
O lado ruim dessa abordagem é que os autores de intérpretes / compiladores geralmente assumem que as exceções são excepcionais e as otimizam de acordo.
Crie uma classe de exceção especial para isso, para não correr o risco de silenciar acidentalmente alguma outra exceção.
Algo completamente diferente
Estou certo de que ainda existem outras soluções.
fonte
Break
interromperá o loop interno e o bloco1 não será executado (ele será executado apenas se o loop interno for encerrado normalmente).fonte
for...else
geralmente é uma construção útil, embora possa ser confusa. Lembre-se de queelse
significa "sem interrupção" neste contexto.Em outros idiomas, você pode rotular o loop e interromper o loop rotulado. A Proposta de Aprimoramento do Python (PEP) 3136 sugeriu adicioná-los ao Python, mas Guido o rejeitou :
Portanto, se é isso que você estava esperando, você está sem sorte, mas olhe para uma das outras respostas, pois há boas opções lá.
fonte
for-else
é mais complicado, mais difícil de ler e provavelmente mais abusado (se não um erro total) do que os loops nomeados. Eu acho que eu teria usado uma palavra-chave diferente do queelse
- talvez algo comoresume
teria sido bom? Vocêbreak
no loop eresume
é logo depois?Eu acho que você poderia fazer algo assim:
fonte
for
,else
antes (e eu acho que mesmo a maioria das pessoas que têm não me lembro fora do topo da sua cabeça como ele funciona).Eu acho que uma das maneiras mais fáceis de conseguir isso é substituir a declaração "continue" por "break", ou seja,
Por exemplo, aqui está o código fácil para ver exatamente como isso acontece:
fonte
Outra maneira de lidar com esse tipo de problema é usar Exception ().
Por exemplo:
resultado:
Supondo que queremos pular para o loop n externo a partir do loop m se m = 3:
resultado:
Link de referência: http://www.programming-idioms.org/idiom/42/continue-outer-loop/1264/python
fonte
Queremos encontrar algo e parar a iteração interna. Eu uso um sistema de bandeira.
fonte
False:continue
coisa é ... formatação incomum. Como costuma ser o caso em sistemas "naturais" onde exponencial é a norma, você só precisa ter sorte algumas vezes no SO para acumular uma quantidade significativa de pontos de reputação. De qualquer forma, minhas "melhores" respostas são geralmente as menos populares.Eu apenas fiz algo assim. Minha solução para isso foi substituir o interior do loop por uma compreensão da lista.
onde op é algum operador booleano que atua em uma combinação de ii e jj. No meu caso, se alguma das operações retornou verdadeira, eu terminei.
Isso realmente não é tão diferente de quebrar o código em uma função, mas pensei que era interessante usar o operador "any" para fazer um OR lógico em uma lista de booleanos e fazer a lógica em uma única linha. Também evita a chamada de função.
fonte