44 votes

si ou elif l'un ou l'autre est vrai alors faites quelque chose

Ceci est juste pour l'intérêt académique. Je rencontre souvent la situation suivante.

either_true = False
if x:
  ...do something1
  either_true = True
elif y:
  ...do something2
  either_true = True
if either_true:
  ..do something3

Y a-t-il une façon pythonique de le faire, ou en général une meilleure façon de programmer. En fait, do something3 ne s'exécute que si ou elif est vrai.

35voto

Frerich Raabe Points 23711

Vous pouvez également omettre le either_true complètement si doSomething3 est une seule ligne de code (par exemple, un appel de fonction) :

if x:
  ..do something 1
  ..do something 3
elif y:
  ..do something 2
  ..do something 3

Il maintient la belle propriété d'évaluer x et y au plus une fois (et y ne sera pas évalué si x est vrai).

31voto

Bakuriu Points 22607

Votre code est presque optimal, en ce qui concerne la répétition et l'évaluation du code. La seule chose à laquelle je pense pour éviter la répétition serait :

# be optimistic!
either_true = True
if x:
    do_something1
elif y:
    do_something2
else:
    either_true = False

if either_true:
    do_something3

Cela supprime une affectation, bien que le nombre total de lignes ne change pas.

L'avantage est que cela fonctionne avec n sans ajouter aucune autre affectation, alors que votre solution actuelle requiert une either_true = True pour chaque condition.

À mon avis, ils ont à peu près le même degré de lisibilité, mais le code ci-dessus sera meilleur avec plus de conditions.

De plus, il n'y a pas de méthode "pythonique" autre qu'une solution lisible qui évite la répétition du code et est optimale en termes d'efficacité, et je ne connais aucune sorte de "meilleure programmation" pour atteindre le même résultat.

19voto

ChrisProsser Points 3468

Je traiterais ce problème en utilisant des instructions if imbriquées, par exemple

if x or y:
    if x:
        ...do something1
    elif y:
        ...do something2
    ...do something3

Comme certains commentaires l'ont souligné, la meilleure solution dépendra de ce que sont x et y. Si votre objectif est la lisibilité et la concision du code, alors cette réponse ou les autres réponses données devraient convenir. Si, par contre, x et y sont des appels de fonction coûteux, il serait préférable de faire quelque chose qui ressemble plus à ce que vous avez fait pour éviter d'appeler la fonction deux fois.

7voto

Eric Points 36290

Vous pourriez en envelopper une partie dans une fonction :

def do_stuff():
    if x:
        ...do something1
        return True
    elif y:
        ...do something2
        return True
    else:
        return False

if do_stuff():
    ..do something3

Ou tout cela dans une fonction :

def do_stuff()
    if x:
        ...do something1
    elif y:
        ...do something2
    else:
        return

    ..do something3

6voto

Quentin Donnellan Points 342

Dans l'esprit d'offrir une solution complètement différente de celles déjà proposées, vous pourriez mettre en place une liste de dictionnaires structurés qui vous permet de mettre en place des cas multiples liés à vos "choses" prédéfinies.

cases = [
    {'condition' : x, 'action' : something1},
    {'condition' : not x and y, 'action' : something2},
    {'condition' : x or y, 'action' : something3},
]

for c in cases:
    if c['condition']: c['action']

En fait, j'aime beaucoup cette méthode (et je viens seulement de la découvrir en essayant de trouver une réponse unique à cette question, merci !) - Il est vraiment évident de savoir quel cas est lié à quelle action, et il est facile d'ajouter plusieurs cas supplémentaires sans ajouter d'autres instructions if/else.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X