Unterschied zwischen mehreren if's und elif's?

76

Gibt es in Python einen Unterschied zwischen:

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

und

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

Ich frage mich nur, ob mehrere ifs unerwünschte Probleme verursachen könnten und ob es besser wäre, elifs zu verwenden .

Billjk
quelle

Antworten:

104

Mehrere ifs bedeuten, dass Ihr Code alle if-Bedingungen überprüft, wobei, wie im Fall von elif, wenn eine if-Bedingung erfüllt ist, andere Bedingungen nicht überprüft werden.

avasal
quelle
44

Ein anderer einfacher Weg, um den Unterschied zwischen der Verwendung von if und elif zu erkennen, ist dieses Beispiel hier:

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!

Hier können Sie sehen, dass wenn 18 als Eingabe verwendet wird, die Antwort (überraschenderweise) 2 Sätze ist. Das ist falsch. Es sollte nur der erste Satz sein.

Das liegt daran, dass BEIDE Aussagen ausgewertet werden. Der Computer sieht sie als zwei separate Anweisungen:

  • Der erste gilt für 18 und so wird "Du bist ein Kind" gedruckt.
  • Die zweite if-Anweisung ist falsch und daher wird der else-Teil ausgeführt, indem "Das Alter muss eine positive Ganzzahl sein" gedruckt wird.

Der Elif behebt dies und lässt die beiden if-Anweisungen als eine zusammenhalten:

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

Bearbeiten: Rechtschreibung korrigiert

user2333594
quelle
10
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

Sie können sehen, dass elif etwas schneller ist. Dies wäre offensichtlicher, wenn es mehr Wenn und mehr Elfen gäbe.

Yrekkehs
quelle
5

Hier ist eine andere Art, darüber nachzudenken:

Angenommen, Sie haben zwei spezifische Bedingungen, unter denen eine if / else-Catchall-Struktur nicht ausreicht:

Beispiel:

Ich habe ein 3 x 3 Tic-Tac-Toe-Brett und möchte die Koordinaten beider Diagonalen und nicht der restlichen Quadrate drucken.

Tic-Tac-Toe-Koordinatensystem

Ich entscheide mich stattdessen für und if / elif Struktur zu verwenden ...

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

Die Ausgabe ist:

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

Aber warte! Ich wollte alle drei Koordinaten von diagonal2 einbeziehen, da (1, 1) auch Teil von diagonal 2 ist.

Das 'elif' verursachte eine Abhängigkeit vom 'if', so dass, wenn das ursprüngliche 'if' erfüllt war, das 'elif' nicht initiiert wird, selbst wenn die 'elif'-Logik die Bedingung ebenfalls erfüllt.

Lassen Sie uns stattdessen das zweite 'elif' in ein 'if' ändern.

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

Ich erhalte jetzt die Ausgabe, die ich wollte, weil sich die beiden 'if'-Anweisungen gegenseitig ausschließen.

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

Wenn Sie letztendlich wissen, welche Art oder welches Ergebnis Sie erzielen möchten, bestimmen Sie, welche Art von bedingter Beziehung / Struktur Sie codieren.

Mike
quelle
2

In Ihrem obigen Beispiel gibt es Unterschiede, da Ihr zweiter Code das elif eingerückt hat , sich tatsächlich im if- Block befindet und in diesem Beispiel syntaktisch und logisch falsch ist.

Python verwendet Zeileneinrückungen, um Codeblöcke zu definieren (die meisten C-ähnlichen Sprachen verwenden {}, um einen Codeblock einzuschließen, Python verwendet jedoch Zeileneinrückungen). Wenn Sie also codieren, sollten Sie die Einrückungen ernsthaft berücksichtigen.

Ihre Probe 1:

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

Sowohl if als auch elif werden gleich eingerückt, sodass sie sich auf dieselbe Logik beziehen. Ihr zweites Beispiel:

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

elif wird mehr eingerückt als wenn , bevor ein anderer Block es einschließt , also wird es innerhalb des if- Blocks betrachtet. und da innerhalb des if kein anderes verschachteltes if vorhanden ist , wird das elif vom Python-Interpreter als Syntaxfehler betrachtet.

Farzad
quelle
1

elifist nur eine ausgefallene Art auszudrücken else: if,

Mehrere ifs führen nach dem Testen mehrere Zweige aus, während sich die elifs gegenseitig ausschließen. Führen Sie nach dem Testen akut einen Zweig aus.

Nehmen Sie die Beispiele von 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!"

könnte umformuliert werden als:

    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!"

Das andere Beispiel könnte sein:

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!"
Infinitesimalrechnung
quelle
1

Wenn Sie mehrere verwenden if, wird Ihr Code in jeder ifAnweisung zurückgehen, um zu überprüfen, ob der Ausdruck Ihrer Bedingung entspricht. Manchmal gibt es Fälle, in denen viele Ergebnisse für einen einzelnen Ausdruck gesendet werden, die Sie nicht einmal erwarten werden. Die Verwendung von elifbeendet den Prozess jedoch, wenn der Ausdruck einer Ihrer Bedingungen entspricht.

Harish RS
quelle
0

So zerlege ich Kontrollflussanweisungen:


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

druckt heyundhi


# 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*

wird hi nur gedruckt , weil die vorhergehende Anweisung ausgewertet wurdeFalse


# 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*

wird gedruckt, helloweil alle vorhergehenden Anweisungen nicht ausgeführt werden konnten

Zach Valenta
quelle
0

Im Falle von:

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

Alle ifAnweisungen auf derselben Einrückungsstufe werden ausgeführt, auch wenn nur die erste ifAnweisung vorhanden ist True.

Im Falle von:

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

Wenn eine ifAnweisung ist True, werden die vorhergehenden Anweisungen weggelassen / nicht ausgeführt.

Crispin Sujith
quelle