2012-02-14 12 views
37

en Python, hay una diferencia entre decir:diferencia entre Múltiple Si de y Python de Elif

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

y

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

Sólo me preguntaba si varios IFS podrían causar problemas no deseados y si era mejor práctica para usar los elifs

Respuesta

56

múltiple si de significa que su código podría ir y comprobar todo el caso de condiciones, mientras que en caso de elif, si uno si la condición satisface no comprobaría otras condiciones ..

2

En el ejemplo anterior hay diferencias, porque su segundo código ha sangrado el elif, woul d estar realmente dentro del bloque if, y es sintáctica y lógicamente incorrecta en este ejemplo.

Python utiliza indenciones de línea para definir bloques de código (la mayoría de los C utilizan {} para encerrar un bloque de código, pero python usa indenciones de línea), así que cuando esté codificando, debe considerar las sangrías seriamente.

su muestra 1:

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

tanto si y elif están sangrados la misma, por lo que se relacionan con la misma lógica. su segundo ejemplo:

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

elif se sangra más de si, antes de que otro bloque que encierra, por lo que se considera dentro del bloque si. y dado que dentro del si no hay otro anidado si, el elif está siendo considerado como un error de sintaxis por el intérprete de Python.

+0

lo siento, los arreglé – Billjk

5
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 elif(text) 
100000 loops, best of 3: 5.13 us per loop 

Se puede ver que elif es un poco mas rapido Esto probablemente sería más evidente si hubiera más ifs y más elifs.

25

Otra manera fácil ver la diferencia entre el uso de if y Elif es este ejemplo aquí:

def analyzeAge(age): 
    if age < 21: 
     print "You are a child" 
    if 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 
>The age must be a positive integer! 

Aquí se puede ver que cuando se utiliza 18 como entrada la respuesta es (sorprendentemente) 2 frases . Eso está mal. Debería ser solo la primera oración.

Esto se debe a que AMBAS declaraciones se están evaluando. La computadora los ve como dos declaraciones separadas:

  • La primera es verdadera para 18 y entonces se imprime "Usted es un niño".
  • La segunda instrucción if es falsa y, por lo tanto, la parte else es impresión ejecutada "La antigüedad debe ser un entero positivo".

El elif reparar este problema y hace que los dos si 'Stick juntos' declaraciones como uno:

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 
1

Ésta es otra manera de pensar acerca de esto:

Digamos que usted tiene dos específicas condiciones que una estructura de catálogo if/else no será suficiente:

Ejemplo:

Tengo un tablero de 3 x 3 de tres en raya y quiero imprimir las coordenadas de ambas diagonales y no del resto de los cuadrados.

Tic-Tac-Toe Coordinate System

decido usar y si la estructura/elif lugar ...

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 salida es:

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

Pero espera! Quería incluir las tres coordenadas de diagonal2 ya que (1, 1) también forma parte de la diagonal 2.

El 'elif' causaba una dependencia con el 'si', de modo que si se satisfacía el 'si' original, 'elif' no se iniciará incluso si la lógica 'elif' también satisface la condición.

Cambiemos el segundo 'elif' por un 'if' en su lugar.

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

Ahora obtengo la salida que quería porque las dos declaraciones 'if' son mutuamente excluyentes.

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

sabiendo En última instancia qué tipo o dar como resultado que desea lograr determinará qué tipo de relación/estructura condicional que código.

Cuestiones relacionadas