web-dev-qa-db-fra.com

Différence entre plusieurs si et Elif?

En python, existe-t-il une différence entre, par exemple:

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

et

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

Je me demandais simplement si plusieurs ifs pouvaient causer des problèmes indésirables et s’il serait préférable d’utiliser Elifs.

49
Billjk

Plusieurs si signifie que votre code irait vérifier toutes les conditions de si, comme dans le cas d'Elif, si une condition satisfait, elle ne vérifierait pas d'autres conditions.

69
avasal

Un autre moyen simple 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 were '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!

Vous pouvez voir ici que lorsque 18 est utilisé comme entrée, la réponse est (étonnamment) 2 phrases. C'est faux. Ce ne devrait être que la première phrase.

C'est parce que les deux sont en cours d'évaluation. L'ordinateur les voit comme deux déclarations distinctes: 

  • Le premier est vrai pour 18 ans et ainsi "Vous êtes un enfant" est imprimé.
  • La deuxième instruction if est false et la partie else est donc Est exécuté avec l'impression "L'âge doit être un entier positif".

Le Elif résout ce problème et fait en sorte que les deux déclarations if «restent ensemble»:

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

analyzeAge( 18 )  #Calling the function
>You are a child
28
user2333594
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. Ce serait plus évident s'il y avait plus de ifs et plus d'élifs.

7
yrekkehs

Voici une autre façon de penser à cela:

Disons que vous avez deux conditions spécifiques qu'une structure fourre-tout si/autre ne suffira pas:

Exemple:

J'ai un tableau de 3 X 3 tic-tac-toe 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 et si/Elif structure à 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 diagonale2 car (1, 1) fait également partie de la diagonale 2.

"Elif" a provoqué une dépendance avec le "si", de sorte que si le "si" d'origine était satisfait, "Elif" ne sera pas initié, même si la logique "Elif" remplissait également la condition.

Modifions le second "Elif" en "if" à la place.

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))

Je reçois maintenant le résultat souhaité car 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, le type ou le résultat que vous souhaitez obtenir déterminera le type de relation/structure conditionnelle que vous codez.

2
Mike

Dans votre exemple ci-dessus, il y a des différences, car votre deuxième code a mis en retrait le Elif, il se trouverait en réalité dans le bloc if et est syntaxiquement et logiquement incorrect dans cet exemple. .

Python utilise des indentations de ligne pour définir des blocs de code (la plupart des langages similaires à C utilisent {} pour entourer un bloc de code, mais python utilise des indentations de ligne). Par conséquent, lorsque vous codez, vous devez sérieusement considérer les indentions.

votre échantillon 1:

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

les deux if et 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 indenté de plus de if, avant qu'un autre bloc ne l'enveloppe, il est donc considéré à l'intérieur du bloc si. et comme à l'intérieur du if il n'y a pas d'autre if imbriqué, le Elif est considéré comme une erreur de syntaxe par Python interprète.

2
farzad

Elifest juste une manière élégante d'exprimer else: if,

Plusieurs if exécutent plusieurs branches après le test, alors que les elifs sont mutuellement exclusifs, exécutent une branche après le test.

Prenons les exemples de user2333594

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

pourrait être reformulé comme suit:

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

L'autre exemple pourrait être:

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

Voici comment je décompose les instructions de flux de contrôle:


# if: unaffected by preceding control statements
def if_example():
    if True:
        print('hey')
    if True:
        print('hi')  # will execute *even* if previous statements execute

imprimera hey et hi


# Elif: affected by preceding control statements
def Elif_example():
    if False:
        print('hey')
    Elif True:
        print('hi')  # will execute *only* if previous statement *do not*

affichera hi seulement car l'instruction précédente évaluée à False


# else: affected by preceding control statements
def else_example():
    if False:
        print('hey')
    Elif False:
        print('hi')
    else:
        print('hello')  # will execute *only* if *all* previous statements *do not*

va imprimer hello parce que toutes les instructions précédentes n'ont pas été exécutées

0
Zach Valenta

Lorsque vous utilisez plusieurs variables if, votre code retourne dans chaque instruction if pour vérifier si l'expression convient à votre condition . .Mais l'utilisation de Elif met fin au processus lorsque l'expression convient à l'un de vos problèmes.

0
Harish RS