Qual è la sintassi corretta per "else if"?


284

Sono un nuovo programmatore Python che sta facendo il salto da 2.6.4 a 3.1.1. Tutto è andato bene fino a quando ho provato a usare la frase 'else if'. L'interprete mi dà un errore di sintassi dopo 'if' in 'else if' per un motivo che non riesco a capire.

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

function(input('input:'))

Probabilmente mi manca qualcosa di molto semplice; tuttavia, non sono stato in grado di trovare la risposta da solo.


3
Non penso che questo funzioni in 2.6.4.
WRAR

In effetti, questo elemento della sintassi e della semantica di Python non è cambiato tra queste versioni. Forse mai affatto.
Mike Graham

Puoi iniziare con un buon tutorial su if / else in python: dreamsyssoft.com/python-scripting-tutorial/ifelse-tutorial.php
Triton Man

Risposte:


444

In python "else if" è scritto "elif".
Inoltre, hai bisogno di due punti dopo il elife il else.

Risposta semplice a una domanda semplice. Ho avuto lo stesso problema, quando ho iniziato (nelle ultime due settimane).

Quindi il tuo codice dovrebbe essere:

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

function(input('input:'))

11
non preoccuparti, tutti dobbiamo imparare qualche volta. Trovo strano che Python dia una tale elfisise alla leggibilità e poi vada e usi elkif invece di altro. Suggerisco di tenere sempre aperto il manuale dell'API di Python: docs.python.org/3.1 i collegamenti importanti sono Tutorial: docs.python.org/3.1/tutorial/index.html Riferimento lingua: docs.python.org/3.1/reference /index.html Riferimento libreria: docs.python.org/3.1/library/index.html
Lyndon White

1
Perl usa la stessa parola chiave e la logica di ciò è stata quella di prevenire incidenti in cui si dimentica di finire di scrivere una dichiarazione precedente e si inizia a scrivere un'altra dichiarazione if. Apparentemente quello era un problema comune durante la scrittura del codice C.
Nate Glenn,

1
@NateGlenn Perl utilizza effettivamente elsif, immagino Python doveva essere che un personaggio più efficiente. "Elif" sembra aver avuto origine con il preprocessore C, usato #elifmolto prima di Python AFAICT. Ovviamente, in quel contesto avere una direttiva a singolo token è prezioso, dal momento che l'analisi #else if <code>vs. #else <code that could theoretically even be an if statement>avrebbe complicato una sintassi che doveva essere semplice.
FeRD


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

10

dai tempi antichi, la sintassi corretta per if/else ifin Python è elif. A proposito, puoi usare il dizionario se hai un sacco di if/else.eg

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

Per msw, esempio di esecuzione di funzioni tramite dizionario.

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

1
Puoi, ma per favore non farlo. Un dizionario non è un buon sostituto di un elif.
S.Lott

@ s.lott, il caso di OP è semplice. Se deve controllare molti valori di a, un dizionario è più ordinato. potresti prendere l'abitudine di non usarlo, ma l'ho usato e mi piace questo approccio meglio che codificare molti if / else. diamine, uso persino il dizionario per eseguire le funzioni.
ghostdog74

1
@ghostdog: So che puoi usare i dizionari per eseguire funzioni ma l'idea mi spaventa come goto calcolati o incollando stringhe Tcl insieme e execing. Questa è una buona pratica? Puoi fare un esempio?
msw,

@msw: è un'ottima pratica. Esempio: stai leggendo un flusso XML non per un semplice esercizio di raschiatura ma uno in cui devi eseguire elaborazioni diverse per tag di elementi diversi, ad esempio un file di foglio di calcolo di Excel 2007 è una zip di più documenti XML, alcuni molto complessi. Hai un metodo separato per ogni tag. Spedisci tramite un dizionario. Niente di cui aver paura. Se il metodo di gestione <foo>è do_foo, puoi persino creare il dict al volo all'avvio dell'app.
John Machin

1
Si noti che il dizionario ha un .getmetodo che consente di specificare un valore predefinito. Il tuo primo esempio può essere scritto comeprint d.get(a, "3a")
codeape

4

Ecco un piccolo refactoring della tua funzione (non usa "else" o "elif"):

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

@ ghostdog74: Python 3 richiede parentesi per "stampa".


python 3 ha sostituito l'istruzione print di python 2 con una funzione, quindi le parentesi richieste, e se lo farai, potresti anche usare sys.stdout.write
Dan

2
dovrebbe essere ('1', '2'), l'op sta usando le stringhe
priestc il

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

Dovrebbe essere corretto per:

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

Come puoi vedere, altrimenti se dovesse essere cambiato in elif, ci dovrebbero essere due punti dopo '2' e altrimenti, ci dovrebbe essere una nuova riga dopo l'istruzione else e chiudere lo spazio tra la stampa e le parentesi.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.