Python, ¿por qué elif la palabra clave?

Acabo de comenzar la progtwigción en Python, y me pregunto sobre la palabra clave elif .

Otros lenguajes de progtwigción que he usado antes de usar else if . ¿Alguien tiene una idea de por qué los desarrolladores de Python agregaron la palabra clave elif adicional?

Por qué no:

 if a: print("a") else if b: print("b") else: print("c") 

Lo más probable es que sea el azúcar sintáctico. Como el Wend de Visual Basic.

Por lo que sé, está ahí para evitar el sangrado excesivo. Usted podría escribir

 if x < 0: print 'Negative' else: if x == 0: print 'Zero' else: print 'Positive' 

pero

 if x < 0: print 'Negative' elif x == 0: print 'Zero' else: print 'Positive' 

es mucho más agradable


Gracias a ign por la referencia de los documentos :

La palabra clave elif es la abreviatura de 'else if', y es útil para evitar una sangría excesiva.

Los lenguajes con syntax tipo C se pueden obtener de else if sin necesidad de implementarlo.

La razón es que en esa syntax las estructuras de control simplemente operan en la siguiente statement, que puede ser una instrucción compuesta entre llaves si es necesario (por ejemplo, { x += 1; y += 1 } ).

Esto significa que una vez que haya implementado, if else , else if no, se salga de la gramática del lenguaje de forma natural y gratuita, sin ningún esfuerzo adicional de implementación. Para ver por qué, eche un vistazo a esto:

 if (condition) { if_body(); } else if (another_condition) { else_if_body(); } else { else_body(); } 

Esto se ve como un if con un else if y un else adjunto, cada uno aplicado a una statement compuesta. Pero en realidad no lo es. Esto es en realidad dos declaraciones if separadas, cada una con exactamente un caso else ; la segunda instrucción if está dentro del cuerpo de la else de la instrucción if .

else if { ... } realmente se analiza como else aplicado a la siguiente statement, que es una sentencia if (aplicada a la sentencia compuesta { else_if_body(); } . Luego la final else une a la inmediatamente anterior if , que es la segundo.

Aquí está lo mismo escrito más en línea con cómo se analiza 1 :

 if (condition) { if_body(); } else { if (another_condition) { else_if_body(); } else { else_body(); } } 

¡Pero resulta que si el lenguaje se implementara directamente en else if como una opción de primera clase para las sentencias if , se comportaría exactamente igual que la segunda sentencia if independiente dentro de la else de la primera! Así que no hay necesidad de molestarse en implementar else if es que lo hacen; Los implementadores de lenguaje obtienen else if de forma gratuita con este estilo de syntax, una vez que se han implementado en el if else .

La syntax de Python no permite este regalo de promoción.

Los progtwigdores de la syntax de estilo C pueden pensar en términos de else if , aunque el lenguaje solo lo tenga con cero o en otra else , pero solo porque pueden escribir código como mi primer ejemplo que está formateado de una forma que se ve diferente a Un lector humano que lo hace al comstackdor.

Python, OTOH, utiliza la sangría para indicar la estructura del bloque, lo que obliga a la estructura del bloque a verse igual en un lector humano que en el intérprete 2 . Una vez que tenga la syntax del estilo Python y, if else manera, los progtwigdores aún podrían escribir código que se comporte de manera idéntica a else si, colocando una segunda sentencia if dentro de else de first. Pero eso se ve así:

 if condition: if_body() else: if another_condition: else_if_body() else: else_body() 

Esto se ve feo, y es mucho más complejo pensar en términos de una cadena else-if una vez que obtenga más de 1 o 2 else-ifs. Por lo tanto, vale la pena agregar una función de lenguaje explícito para recuperar la capacidad de pensar en términos de else-if. Aunque técnicamente hace que el lenguaje sea más complejo, en realidad hace que el pensamiento en términos del lenguaje sea más simple, por lo que es una buena complejidad; con una cadena de nesteds construida manualmente, if el lector tiene que leer todo el código manualmente y verificar que todo lo else excepto el último, contiene exactamente una sentencia if y nada más, para concluir que toda la secuencia es equivalente a una cadena lineal de condiciones verificadas en orden, con algo de código para ejecutar para la primera verificación que tenga éxito.

Por lo que entonces. Hemos visto que los lenguajes con syntax tipo C podrían ir con else if , porque lo obtienen de forma gratuita. Esa es la razón por la que eso existe. Los lenguajes con syntax similar a Python tienen que hacer algo explícitamente para obtener una construcción que se pueda usar como un if-if. ¿Por qué eligieron elif ? Es arbitrario Tendrías que preguntar a las personas que tomaron la decisión.

Sin embargo, Python no inventó elif , existía en otros idiomas mucho antes de que Python existiera. Así que supongo que cuando tenían que implementar una construcción explícita else-if, simplemente escogían una con la que los progtwigdores ya estaban familiarizados.


1 Técnicamente, esta es la forma en que las personas que REALMENTE toman en serio el uso de llaves con estructuras de control deben escribir su código. 😉

2 Ciertamente, puede construir ejemplos contrarios a esto, pero es la idea general de la syntax basada en sangría.

Para evitar corsé ^ H ^ H ^ H ^ H ^ Helse si guerra.

En C / C ++, donde tiene otra else if , puede estructurar su código en muchos estilos diferentes:

 if (...) { ... } else if (...) { ... } if (...) { ... } else if (...) { ... } if (...) { ... } else if (...) { ... } // and so on 

al tener un elif cambio, tal guerra nunca ocurriría ya que solo hay una forma de escribir un elif . Además, elif es mucho más corto que else if .

Esa es la forma como es. Javascript usa else if , php usa elseif , perl usa elsif , el preprocesador C y python usan elif . Ninguno de ellos está equivocado, simplemente eligen una syntax ligeramente diferente para hacer lo mismo. :RE

Los encuentro útiles para ayudar a diferenciar los “else-if” de la “final else”.

Elif es un tipo de reemplazo para el interruptor en otros idiomas pero con más poder.

por ejemplo en C escribes

 interruptor (número) {
  caso 1:
    doA ()
    descanso;
  caso 2:
    doB ()
    descanso;
  caso N:
    don()
    descanso;
  defecto:
    hacer algo más()
    descanso;
 }

en Python escribes

 si número == 1: doA ()
 número de elif == 2: doB ()
 número de elif == N: doC ()
 else: doSomethingElse ()

Como ve, elif es más poderoso ya que puede poner declaraciones más complejas que en un conmutador, además de evitar el anidamiento de las declaraciones if/else

Python hereda esto de Perl, donde se llama elsif .

En el caso de Python, else if como dos construcciones separadas, como en lenguajes tipo C, sería bastante feo, ya que tendrías que tener else: if: con dos niveles de sangría.

Es discutible si la combinación especial de las dos palabras clave juntas sería mejor (por lo tanto, hacer lo else if una sola construcción, como la de not in operador).

PL / SQL también tiene elsif , y el preprocesador C lo ha escrito elif .