Qual é a sintaxe correta para 'else if'?

284

Eu sou um novo programador Python que está dando o salto de 2.6.4 para 3.1.1. Tudo correu bem até eu tentar usar a declaração 'else if'. O intérprete me fornece um erro de sintaxe após o 'if' in 'else if' por um motivo que eu não consigo entender.

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

function(input('input:'))

Provavelmente estou sentindo falta de algo muito simples; no entanto, não consegui encontrar a resposta sozinho.

Paul Turner
fonte
3
Eu não acho que isso funcione no 2.6.4.
wRAR 7/03/10
De fato, esse elemento da sintaxe e da semântica do Python não mudou entre essas versões. Possivelmente nunca.
Mike Graham
Você pode começar com um bom tutorial sobre if / else em Python: dreamsyssoft.com/python-scripting-tutorial/ifelse-tutorial.php
Triton Man

Respostas:

444

Em python "else if" está escrito "elif".
Além disso, você precisa de dois pontos após o elife o else.

Resposta simples a uma pergunta simples. Eu tive o mesmo problema, quando comecei (nas últimas duas semanas).

Portanto, seu código deve ler:

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

function(input('input:'))
Lyndon White
fonte
11
não se preocupe, todos temos que aprender algum dia. Acho estranho que o python coloque esse elphisise na legibilidade e depois use elkif em vez disso. Sugiro manter o manual da API python sempre aberto: docs.python.org/3.1 os links importantes são Tutorial: docs.python.org/3.1/tutorial/index.html Referência de idioma: docs.python.org/3.1/reference /index.html Referência da
Lyndon White
1
O Perl usa a mesma palavra-chave, e a justificativa era para evitar acidentes nos quais você esquece de escrever uma instrução else anterior e começa a escrever outra instrução if. Aparentemente, esse era um problema comum ao escrever o código C.
Nate Glenn
1
@NateGlenn Perl realmente usa elsif, acho que o Python tinha que ser aquele personagem mais eficiente. "Elif" parece ter se originado com o pré-processador C, usado #elifmuito antes do Python AFAICT. Obviamente, nesse contexto, ter uma diretiva de token único é valioso, pois a análise #else if <code>vs. #else <code that could theoretically even be an if statement>complicaria uma sintaxe que se destinava a ser muito simples.
FeRD
20

Você quer dizer elif?

Nick Presta
fonte
13
def function(a):
    if a == '1':
        print ('1a')
    elif a == '2':
        print ('2a')
    else:
        print ('3a')
Tom
fonte
10

desde os tempos antigos, a sintaxe correta para o if/else ifPython é elif. A propósito, você pode usar o dicionário se você tem um monte de if/else.eg

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

Para msw, exemplo de execução de funções usando o dicionário.

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
fonte
1
Você pode, mas por favor não faça isso. Um dicionário não é um bom substituto para um elif.
31510 S.Lott
@ s.lott, o caso do OP é simples. Se ele tiver que verificar muitos valores de a, um dicionário será melhor. você pode criar o hábito de não usá-lo, mas eu o uso e gosto dessa abordagem melhor do que codificar muitos if / else. Parreira, eu até uso o dicionário para executar funções.
ghostdog74
1
@ghostdog: Eu sei que você pode usar dicionários para executar funções, mas a idéia me assusta como gotos computados ou colando cordas Tcl juntas e execing. Esta é uma boa prática? Você pode citar um exemplo?
msw
@ msw: É uma prática muito boa. Exemplo: você está lendo um fluxo XML, não para um exercício simples de raspagem, mas para um processo em que é necessário fazer um processamento diferente para diferentes tags de elementos, por exemplo, um arquivo de planilha do Excel 2007 é um zip de vários documentos XML, alguns muito complexos. Você tem um método separado para cada tag. Você envia através de um dicionário. Nada para se assustar. Se o método de manipulação <foo>for do_foo, você pode criar o dict em tempo real quando o aplicativo iniciar.
precisa
1
Observe que o dicionário possui um .getmétodo que permite especificar um valor padrão. Seu primeiro exemplo pode ser escrito comoprint d.get(a, "3a")
codeape
4

Aqui está um pouco de refatoração de sua função (ela não usa "else" ou "elif"):

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

@ ghostdog74: Python 3 requer parênteses para "imprimir".

Winston C. Yang
fonte
python 3 substituído declaração de impressão python 2 de com uma função, assim, os parênteses necessários, e se você vai de modo que você pode muito bem usar sys.stdout.write
Dan D.
2
deveria ser ('1', '2'), o op está usando strings
priestc
2
def function(a):
    if a == '1':
        print ('1a')
    else if a == '2'
        print ('2a')
    else print ('3a')

Deve ser corrigido para:

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

Como você pode ver, caso contrário, se for alterado para elif, deve haver dois pontos após '2' e, então, deve haver uma nova linha após a instrução else e feche o espaço entre a impressão e os parênteses.

MilkyWay90
fonte