Que tipo de método existe para sair prematuramente de uma if
cláusula?
Há momentos em que estou escrevendo código e quero colocar uma break
instrução dentro de uma if
cláusula, apenas para lembrar que eles só podem ser usados para loops.
Vamos tomar o seguinte código como exemplo:
if some_condition:
...
if condition_a:
# do something
# and then exit the outer if block
...
if condition_b:
# do something
# and then exit the outer if block
# more code here
Posso pensar em uma maneira de fazer isso: supondo que os casos de saída ocorram dentro de instruções if aninhadas, envolva o código restante em um grande bloco else. Exemplo:
if some_condition:
...
if condition_a:
# do something
# and then exit the outer if block
else:
...
if condition_b:
# do something
# and then exit the outer if block
else:
# more code here
O problema com isso é que mais locais de saída significam mais código aninhado / indentado.
Como alternativa, eu poderia escrever meu código para que as if
cláusulas fossem as menores possíveis e não exigissem quaisquer saídas.
Alguém conhece uma maneira boa / melhor de sair de uma if
cláusula?
Se houver alguma cláusula else-if e else associada, eu acho que sair iria ignorá-la.
fonte
elif
?if a: #stuff; #stuff_inbetween; if b: #stuff;
o código intermediário depende,not a
mas não dependeb
.elif
stackoverflow.com/a/2069680/7045119Respostas:
(Este método funciona para
if
s, vários loops aninhados e outras construções que você não pode usarbreak
facilmente.)Envolva o código em sua própria função. Em vez de
break
, usereturn
.Exemplo:
fonte
(Não use isso, por favor.)
fonte
goto
.fonte
while True:
. Apenas certifique-se de colocar umabreak
declaração no final! Para línguas com a construção do-while, é mais idomaticamente fazer:do { code that can conditionally break out } while (false);
Você pode emular a funcionalidade de goto com exceções:
Isenção de responsabilidade: apenas quero chamar sua atenção para a possibilidade de fazer as coisas dessa maneira, embora de forma alguma endosso isso como razoável em circunstâncias normais. Como mencionei em um comentário sobre a questão, estruturar o código de modo a evitar as condicionais bizantinas em primeiro lugar é de longe preferível. :-)
fonte
Talvez isto?
fonte
elif
ficou meio vazia enquanto eu escrevia isso. Embora eu ache que isso não funcionaria em uma situação em que desejo que o código seja executado entre as instruções if aninhadas.Para o que foi realmente perguntado, minha abordagem é colocar esses
if
s dentro de um loop de um loopTeste-o:
fonte
for _ in range(1):
vez dewhile True:
. (1) Comunique melhor sua intenção de um único loop de iteração e (2) nenhuma instrução de última interrupção para sair do loop (pode ser removido acidentalmente mais tarde)De um modo geral, não. Se você está aninhando "se" e rompendo com eles, está fazendo errado.
No entanto, se você deve:
Observe que as funções não PRECISAM ser declaradas na instrução if, elas podem ser declaradas antecipadamente;) Esta seria uma escolha melhor, pois evitará a necessidade de refatorar um if / then feio posteriormente.
fonte
if condition_a
eif condition_b
aninhado dentro de umif some_condition
. Eu quero ser capaz de sair doif some_condition
.Efetivamente, o que você está descrevendo são instruções goto, que geralmente são bastante deslocadas. Seu segundo exemplo é muito mais fácil de entender.
No entanto, mais limpo ainda seria:
fonte
Há outra maneira que não depende da definição de funções (porque às vezes é menos legível para pequenos trechos de código), não usa um loop while externo extra (que pode precisar de uma apreciação especial nos comentários para ser compreensível à primeira vista) , não usa goto (...) e o mais importante, permite que você mantenha seu nível de indentação para o externo, caso não precise iniciar o aninhamento.
Sim, isso também precisa de uma segunda olhada para legibilidade, no entanto, se os trechos de código forem pequenos, isso não exige o rastreamento de nenhum loop while que nunca se repita e depois de entender para que servem os ifs intermediários, é facilmente legível, tudo em um lugar e com o mesmo recuo.
E deve ser muito eficiente.
fonte
Então, aqui eu entendo que você está tentando sair do bloco de código if externo
Uma maneira de sair disso é que você pode testar se há uma condição falsa no bloco if externo, que então sairá implicitamente do bloco de código, você então usa um bloco else para aninhar os outros ifs para fazer algo
fonte
A única coisa que poderia aplicar isso sem métodos adicionais é
elif
como o exemplo a seguirfonte
Esta é outra maneira de lidar com isso. Ele usa um único item para loop que permite que você use apenas continue. Ele evita a necessidade desnecessária de funções extras sem motivo. E, adicionalmente, elimina possíveis loops while infinitos.
fonte
usar
return
na condição if retornará você da função, para que você possa usar return para interromper a condição if.fonte