91 votes

Différence entre les "if" multiples et les "elif" ?

En python, y a-t-il une différence entre say :

if text == 'sometext':
    print(text)
if text == 'nottext':
    print("notanytext")

et

 if text == 'sometext':
        print(text)
 elif text == 'nottext':
        print("notanytext")

Je me demandais juste si les multiples if pourraient causer des problèmes indésirables et s'il serait préférable d'utiliser des elif s.

134voto

avasal Points 6800

Les ifs multiples signifient que votre code va vérifier toutes les conditions if, alors que dans le cas de elif, si une condition if est satisfaite, il ne vérifiera pas les autres conditions

58voto

user2333594 Points 511

Un autre moyen facile de voir la différence entre l'utilisation de if et elif est cet exemple ici :

def analyzeAge( age ):
   if age < 21:
       print "You are a child"
   if age >= 21: #Greater than or equal to
       print "You are an adult"
   else:   #Handle all cases where 'age' is negative 
       print "The age must be a positive integer!"

analyzeAge( 18 )  #Calling the function
>You are a child
>The age must be a positive integer!

Ici, vous pouvez voir que lorsque 18 est utilisé comme entrée, la réponse est (étonnamment) 2 phrases. C'est une erreur. La réponse ne devrait être que la première phrase.

C'est parce que les DEUX instructions if sont évaluées. L'ordinateur les voit comme deux instructions distinctes :

  • La première est vraie pour 18 et donc "Vous êtes un enfant" est imprimé.
  • La deuxième instruction if est fausse et donc la partie else est exécutée exécutée en imprimant "L'âge doit être un nombre entier positif".

El elif corrige ce problème et fait en sorte que les deux déclarations "si" ne fassent qu'une :

def analyzeAge( age ):
   if age < 21:
       print "You are a child"
   elif age > 21:
       print "You are an adult"
   else:   #Handle all cases where 'age' is negative 
       print "The age must be a positive integer!"

analyzeAge( 18 )  #Calling the function
>You are a child

Edit : correction de l'orthographe

12voto

yrekkehs Points 549
def multipleif(text):
    if text == 'sometext':
        print(text)
    if text == 'nottext':
        print("notanytext")

def eliftest(text):
    if text == 'sometext':
        print(text)
    elif text == 'nottext':
        print("notanytext")

text = "sometext"

timeit multipleif(text)
100000 loops, best of 3: 5.22 us per loop

timeit eliftest(text)
100000 loops, best of 3: 5.13 us per loop

Vous pouvez voir que elif est légèrement plus rapide. Cela serait plus apparent s'il y avait plus de ifs et plus d'elifs.

5voto

Mike Points 171

Voici une autre façon de voir les choses :

Disons que vous avez deux conditions spécifiques pour lesquelles une structure fourre-tout if/else ne suffira pas :

Exemple :

J'ai un plateau de morpion de 3 X 3 et je veux imprimer les coordonnées des deux diagonales et non le reste des carrés.

Tic-Tac-Toe Coordinate System

Je décide d'utiliser une structure if/elif à la place...

for row in range(3):
    for col in range(3):
        if row == col:
            print('diagonal1', '(%s, %s)' % (i, j))
        elif col == 2 - row:
            print('\t' * 6 + 'diagonal2', '(%s, %s)' % (i, j))

La sortie est :

diagonal1 (0, 0)
                        diagonal2 (0, 2)
diagonal1 (1, 1)
                        diagonal2 (2, 0)
diagonal1 (2, 2)

Mais attendez ! Je voulais inclure les trois coordonnées de la diagonale 2 puisque (1, 1) fait également partie de la diagonale 2.

Le "elif" a créé une dépendance avec le "if", de sorte que si le "if" original a été satisfait, le "elif" ne se déclenchera pas, même si la logique "elif" a également satisfait la condition.

Remplaçons le deuxième "elif" par un "if".

for row in range(3):
    for col in range(3):
        if row == col:
            print('diagonal1', '(%s, %s)' % (i, j))
        if col == 2 - row:
            print('\t' * 6 + 'diagonal2', '(%s, %s)' % (i, j))

J'obtiens maintenant le résultat que je voulais parce que les deux instructions "if" s'excluent mutuellement.

diagonal1 (0, 0)
                        diagonal2 (0, 2)
diagonal1 (1, 1)
                        diagonal2 (1, 1)
                        diagonal2 (2, 0)
diagonal1 (2, 2)

En fin de compte, c'est le fait de savoir quel type de résultat vous voulez obtenir qui déterminera le type de relation/structure conditionnelle que vous coderez.

3voto

farzad Points 4180

Dans votre exemple ci-dessus, il y a des différences, parce que votre deuxième code a indenté le elif il serait en fait à l'intérieur du si et est syntaxiquement et logiquement incorrect dans cet exemple.

Python utilise des indentations de ligne pour définir les blocs de code (la plupart des langages de type C utilisent {} pour enfermer un bloc de code, mais Python utilise les indentations de ligne), donc lorsque vous codez, vous devez prendre en compte les indentations sérieusement.

votre échantillon 1 :

if text == 'sometext':
    print(text)
elif text == 'nottext':
    print("notanytext")

les deux si y elif sont indentés de la même manière, ils sont donc liés à la même logique. votre deuxième exemple :

if text == 'sometext':
    print(text)
    elif text == 'nottext':
        print("notanytext")

elif est plus en retrait que si avant qu'un autre bloc ne l'englobe, de sorte qu'il est considéré comme se trouvant à l'intérieur du bloc si et puisque dans le bloc si il n'y a pas d'autre emboîtement si le elif est considéré comme une erreur de syntaxe par l'interpréteur Python.

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