¿Cuál es la sintaxis correcta para 'else if'?

284

Soy un nuevo programador de Python que está dando el salto de 2.6.4 a 3.1.1. Todo ha ido bien hasta que intenté usar la declaración 'else if'. El intérprete me da un error de sintaxis después del 'if' en 'else if' por una razón que parece que no puedo entender.

def function(a):
    if a == '1':
        print ('1a')
    else if a == '2'
        print ('2a')
    else print ('3a')

function(input('input:'))

Probablemente me estoy perdiendo algo muy simple; Sin embargo, no he podido encontrar la respuesta por mi cuenta.

Paul Turner
fuente
3
No creo que esto funcione en 2.6.4.
WRAR
De hecho, este elemento de la sintaxis y semántica de Python no cambió entre estas versiones. Posiblemente nunca en absoluto.
Mike Graham
Puede comenzar con un buen tutorial sobre if / else en python: dreamsyssoft.com/python-scripting-tutorial/ifelse-tutorial.php
Triton Man

Respuestas:

444

En python "else if" se deletrea "elif".
Además, necesita dos puntos después de elify el else.

Respuesta simple a una pregunta simple. Tuve el mismo problema cuando comencé (en las últimas semanas).

Entonces su código debería leer:

def function(a):
    if a == '1':
        print('1a')
    elif a == '2':
        print('2a')
    else:
        print('3a')

function(input('input:'))
Lyndon White
fuente
11
no te preocupes, todos tenemos que aprender alguna vez. Me parece extraño que Python ponga tal elphisise en la capacidad de lectura y luego vaya y use elkif en lugar de otro. Sugiero mantener abierto el manual de la API de Python en todo momento: docs.python.org/3.1 los enlaces importantes son Tutorial: docs.python.org/3.1/tutorial/index.html Referencia del idioma: docs.python.org/3.1/reference /index.html Referencia de la biblioteca: docs.python.org/3.1/library/index.html
Lyndon White
1
Perl usa la misma palabra clave, y la razón para ello era evitar accidentes en los que olvida terminar de escribir una declaración else anterior y comienza a escribir otra declaración if. Aparentemente, ese era un problema común al escribir código C.
Nate Glenn el
1
@NateGlenn Perl utiliza en realidad elsif, supongo Python tenía que ser un personaje más eficiente. "Elif" parece haberse originado con el preprocesador C, que se usaba #elifmucho antes de Python AFAICT. Obviamente, en ese contexto, tener una directiva de token único es valioso, ya que analizar #else if <code>vs #else <code that could theoretically even be an if statement>habría complicado una sintaxis que pretendía ser simple.
FeRD
13
def function(a):
    if a == '1':
        print ('1a')
    elif a == '2':
        print ('2a')
    else:
        print ('3a')
Tom
fuente
10

desde tiempos antiguos, la sintaxis correcta para if/else ifen Python es elif. Por cierto, puedes usar el diccionario si tienes mucho if/else.eg

d={"1":"1a","2":"2a"}
if not a in d: print("3a")
else: print (d[a])

Para msw, ejemplo de ejecución de funciones usando el diccionario.

def print_one(arg=None):
    print "one"

def print_two(num):
    print "two %s" % num

execfunctions = { 1 : (print_one, ['**arg'] ) , 2 : (print_two , ['**arg'] )}
try:
    execfunctions[1][0]()
except KeyError,e:
    print "Invalid option: ",e

try:
    execfunctions[2][0]("test")
except KeyError,e:
    print "Invalid option: ",e
else:
    sys.exit()
ghostdog74
fuente
1
Puedes, pero por favor no hagas esto. Un diccionario no es un buen reemplazo para un elif.
S.Lott
@ s.lott, el caso de OP es simple. Si tiene que verificar muchos valores de a, un diccionario es más ordenado. es posible que tenga la costumbre de no usarlo, pero lo he estado usando y me gusta este enfoque mejor que codificar muchos si / de lo contrario. diablos, incluso uso el diccionario para ejecutar funciones.
ghostdog74
1
@ghostdog: Yo sé que usted puede usar los diccionarios para ejecutar funciones, pero los sustos idea me como GOTOS computadas o las cuerdas pegando juntos y Tcl execing ellos. ¿Es esta una buena práctica? ¿Puedes nombrar un ejemplo?
msw
@msw: Es una muy buena práctica. Ejemplo: está leyendo una secuencia XML no para un simple ejercicio de raspado, sino uno en el que necesita realizar un procesamiento diferente para diferentes etiquetas de elementos, por ejemplo, un archivo de hoja de cálculo de Excel 2007 es un zip de múltiples documentos XML, algunos muy complejos. Tiene un método separado para cada etiqueta. Envías a través de un diccionario. Nada de lo que tener miedo. Si el método de manejo <foo>es do_foo, incluso puede construir el dict sobre la marcha cuando se inicia la aplicación.
John Machin
1
Tenga en cuenta que el diccionario tiene un .getmétodo que le permite especificar un valor predeterminado. Su primer ejemplo se puede escribir comoprint d.get(a, "3a")
codeape
4

Aquí hay una pequeña refactorización de su función (no usa "else" o "elif"):

def function(a):
    if a not in (1, 2):
        a = 3
    print(str(a) + "a")

@ ghostdog74: Python 3 requiere paréntesis para "imprimir".

Winston C. Yang
fuente
python 3 reemplazó la declaración de impresión de python 2 con una función, por lo tanto, los paréntesis requeridos, y si lo desea, también podría usar sys.stdout.write
Dan D.
2
debería ser ('1', '2'), la
operación
2
def function(a):
    if a == '1':
        print ('1a')
    else if a == '2'
        print ('2a')
    else print ('3a')

Debe corregirse a:

def function(a):
    if a == '1':
        print('1a')
    elif a == '2':
        print('2a')
    else:
        print('3a')

Como puede ver, de lo contrario, si se cambia a elif, debería haber dos puntos después de '2' y, de lo contrario, debería haber una nueva línea después de la instrucción else, y cierre el espacio entre print y los paréntesis.

MilkyWay90
fuente