¿Diferencia entre múltiples if’s y elif’s?

En Python, hay una diferencia entre decir:

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

y

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

Solo me pregunto si el múltiplo if s podría causar problemas no deseados y si sería una mejor práctica usar elif s.

Múltiples if’s significa que su código irá y verificará todas las condiciones if, donde en el caso de elif, si una condición cumple, no verificará otras condiciones.

Otra forma fácil de 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: #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! 

Aquí puede ver que cuando se usa 18 como entrada, la respuesta es (sorprendentemente) 2 oraciones. Eso está mal. Solo debe ser la primera oración.

Eso es porque AMBOS si las declaraciones están siendo evaluadas. La computadora los ve como dos declaraciones separadas:

  • El primero es válido para 18 y por eso se imprime “Eres un niño”.
  • La segunda instrucción if es falsa y, por lo tanto, la otra parte se ejecuta imprimiendo “La edad debe ser un número entero positivo”.

El elif corrige esto y hace que las dos declaraciones if ‘se mantengan juntas’ como una:

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

Puedes ver que elif es un poco más rápido. Esto sería más evidente si hubiera más ifs y más elifs.

Aquí hay otra forma de pensar acerca de esto:

Supongamos que tiene dos condiciones específicas que no bastan con una estructura en caso de que if / else catchall:

Ejemplo:

Tengo una tabla 3 x 3 de tic-tac-toe y quiero imprimir las coordenadas de ambas diagonales y no el rest de los cuadrados.

Sistema de coordenadas Tic-Tac-Toe

Decido usar y if / elif estructura en su 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 es parte de la diagonal 2.

El ‘elif’ causó una dependencia con el ‘if’, de modo que si el ‘original’ if ‘fue satisfecho, el’ elif ‘no se iniciará incluso si la lógica’ elif ‘también cumple con la condición.

Cambiemos el segundo ‘elif’ a un ‘si’ 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’ se excluyen mutuamente.

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

En última instancia, saber qué tipo o resultado desea obtener determinará qué tipo de relación / estructura condicional codifica.

En su ejemplo anterior, hay diferencias, porque su segundo código ha sangrado el elif , en realidad estaría dentro del bloque if , y es un error sintáctico y lógico en este ejemplo.

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

su muestra 1:

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

Tanto if como elif están sangrados de la misma manera, por lo que están relacionados con la misma lógica. tu segundo ejemplo:

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

Elif se sangra más que si antes de que otro bloque lo encierre, por lo que se considera dentro del bloque if . y desde el interior del si no hay otro nested si , el elif está siendo considerado como un error de syntax por el intérprete de Python.

elif es solo una forma elegante de express else: if ,

Múltiples ifs ejecutan múltiples twigs después de la prueba, mientras que los elifs son mutuamente exclusivos, ejecutan una twig después de la prueba.

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

podría reformularse como:

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

El otro ejemplo podría ser:

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

Cuando use múltiples if , su código volverá a aparecer en cada sentencia if para verificar si la expresión se adapta a su condición. A veces, hay casos en los que se envían muchos resultados para una expresión única que ni siquiera esperarás. Pero el uso de elif termina el proceso cuando la expresión se adapta a cualquiera de sus condiciones.

Así es como desgloso los estados de flujo de control:


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

imprimirá hey y 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* 

imprimirá hi solo porque la instrucción anterior se evaluó como 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* 

imprimirá hello porque todas las instrucciones anteriores no se ejecutaron