Quelles sortes de méthodes existent pour sortir prématurément d'une if
clause?
Il y a des moments où j'écris du code et que je veux mettre une break
instruction à l'intérieur d'une if
clause, seulement pour me rappeler que ceux-ci ne peuvent être utilisés que pour les boucles.
Prenons le code suivant comme exemple:
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
Je peux penser à une façon de faire cela: en supposant que les cas de sortie se produisent dans des instructions if imbriquées, enveloppez le code restant dans un gros bloc else. Exemple:
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
Le problème avec ceci est que plus d'emplacements de sortie signifie plus de code d'imbrication / indenté.
Alternativement, je pourrais écrire mon code pour que les if
clauses soient aussi petites que possible et ne nécessitent aucune sortie.
Quelqu'un connaît-il une bonne / meilleure façon de sortir d'une if
clause?
S'il y a des clauses else-if et else associées, je suppose que quitter les ignorerait.
la source
elif
?if a: #stuff; #stuff_inbetween; if b: #stuff;
le code intermédiaire dépend denot a
mais ne dépend pas deb
.elif
stackoverflow.com/a/2069680/7045119Réponses:
(Cette méthode fonctionne pour les
if
s, plusieurs boucles imbriquées et d'autres constructions que vous ne pouvez pasbreak
facilement.)Enveloppez le code dans sa propre fonction. Au lieu de
break
, utilisezreturn
.Exemple:
la source
(Ne l'utilisez pas vraiment, s'il vous plaît.)
la source
goto
.la source
while True:
. Assurez-vous simplement de mettre unebreak
déclaration à la fin! Pour les langages avec la construction do-while, il est plus idomatique de faire:do { code that can conditionally break out } while (false);
Vous pouvez émuler les fonctionnalités de goto avec des exceptions:
Clause de non-responsabilité: Je veux seulement attirer votre attention sur la possibilité de faire les choses de cette manière, alors que je ne le considère en aucun cas comme raisonnable dans des circonstances normales. Comme je l'ai mentionné dans un commentaire sur la question, structurer le code de manière à éviter les conditionnelles byzantines en premier lieu est de loin préférable. :-)
la source
Peut être ça?
la source
elif
pendant que j'écrivais ceci. Bien que je pense que cela ne fonctionnerait pas dans une situation où je veux que le code s'exécute entre les instructions if imbriquées.Pour ce qui a été réellement demandé, mon approche est de mettre ces
if
s dans une boucle en une seule boucleEssaye-le:
la source
for _ in range(1):
au lieu dewhile True:
. (1) Mieux communiquer votre intention d'une boucle d'itération unique et (2) pas de dernière instruction break pour quitter la boucle (pourrait être supprimée par accident plus tard)En général, ne le faites pas. Si vous imbriquez des «si» et que vous vous en débarrassez, vous le faites mal.
Cependant, si vous devez:
Notez que les fonctions NE DOIVENT pas être déclarées dans l'instruction if, elles peuvent être déclarées à l'avance;) Ce serait un meilleur choix, car cela évitera d'avoir à refactoriser un si / puis laid plus tard.
la source
if condition_a
etif condition_b
imbriqué dans un fichierif some_condition
. Je veux pouvoir sortir duif some_condition
.En fait, ce que vous décrivez sont des déclarations goto, qui sont généralement assez fortement analysées. Votre deuxième exemple est beaucoup plus facile à comprendre.
Cependant, plus propre serait toujours:
la source
Il existe un autre moyen qui ne repose pas sur la définition de fonctions (car parfois c'est moins lisible pour les petits extraits de code), n'utilise pas une boucle while externe supplémentaire (qui peut nécessiter une appréciation particulière dans les commentaires pour être même compréhensible à première vue) , n'utilise pas goto (...) et surtout vous permet de garder votre niveau d'indentation pour l'extérieur si c'est le cas, vous n'avez pas à commencer à imbriquer des choses.
Oui, cela nécessite également un deuxième regard pour la lisibilité, cependant, si les extraits de code sont petits, cela ne nécessite pas de suivre des boucles while qui ne se répéteront jamais et après avoir compris à quoi servent les ifs intermédiaires, il est facilement lisible, tout en un endroit et avec la même indentation.
Et cela devrait être assez efficace.
la source
Alors là, je comprends que vous essayez de sortir du bloc de code externe si
Une façon de s'en sortir est que vous pouvez tester une condition fausse dans le bloc if externe, qui sortira ensuite implicitement du bloc de code, vous utiliserez ensuite un bloc else pour imbriquer les autres ifs pour faire quelque chose
la source
La seule chose qui appliquerait cela sans méthodes supplémentaires est
elif
l'exemple suivantla source
Voici une autre façon de gérer cela. Il utilise un seul élément pour la boucle qui vous permet d'utiliser simplement continuer. Cela évite le besoin inutile d'avoir des fonctions supplémentaires sans raison. Et élimine en outre les boucles while potentielles infinies.
la source
utiliser
return
dans la condition if vous fera sortir de la fonction, de sorte que vous puissiez utiliser return pour rompre la condition if.la source