Jaka jest poprawna składnia dla „else if”?

284

Jestem nowym programistą Python, który robi skok z wersji 2.6.4 do wersji 3.1.1. Wszystko poszło dobrze, dopóki nie spróbowałem użyć wyrażenia „else if”. Interpreter podaje mi błąd składniowy po „if” w „else if” z powodu, którego nie mogę zrozumieć.

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

function(input('input:'))

Prawdopodobnie brakuje mi czegoś bardzo prostego; jednak nie byłem w stanie sam znaleźć odpowiedzi.

Paul Turner
źródło
3
Nie sądzę, żeby to działało w 2.6.4.
wRAR
Rzeczywiście ten element składni i semantyki Pythona nie zmienił się między tymi wersjami. Prawdopodobnie nigdy.
Mike Graham,
Możesz zacząć od dobrego samouczka na temat if / else w python: dreamsyssoft.com/python-scripting-tutorial/ifelse-tutorial.php
Triton Man

Odpowiedzi:

444

W python „else if” jest napisane „elif”.
Ponadto potrzebujesz dwukropka po elifi else.

Prosta odpowiedź na proste pytanie. Miałem ten sam problem, kiedy zaczynałem (w ciągu ostatnich kilku tygodni).

Twój kod powinien więc brzmieć:

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

function(input('input:'))
Lyndon White
źródło
11
nie martw się, wszyscy musimy się kiedyś nauczyć. Wydaje mi się dziwne, że Python kładzie taki elfizat na czytelności, a następnie idzie i używa elkifu zamiast tego innego. Sugeruję pozostawienie otwartego podręcznika API Pythona przez cały czas: docs.python.org/3.1 ważne linki to Tutorial: docs.python.org/3.1/tutorial/index.html Odwołanie do języka: docs.python.org/3.1/reference /index.html Odświeżanie biblioteki: docs.python.org/3.1/library/index.html
Lyndon White
1
Perl używa tego samego słowa kluczowego, a jego uzasadnieniem było zapobieganie wypadkom, w których zapominasz zakończyć pisanie poprzedniego oświadczenia else i zaczynasz pisać kolejne oświadczenie if. Najwyraźniej był to powszechny problem podczas pisania kodu C.
Nate Glenn
1
@NateGlenn Perl nie używa elsif, chyba Python musiał być, że jedna postać bardziej wydajne. Wydaje się, że „Elif” pochodzi z preprocesora C, który był używany na #elifdługo przed Pythonem AFAICT. Oczywiście w tym kontekście posiadanie dyrektywy jednokokenowej jest cenne, ponieważ parsowanie #else if <code>vs. #else <code that could theoretically even be an if statement>skomplikowałoby składnię, która miała być łatwa.
FeRD
20

Czy masz na myśli elif?

Nick Presta
źródło
13
def function(a):
    if a == '1':
        print ('1a')
    elif a == '2':
        print ('2a')
    else:
        print ('3a')
Tomek
źródło
10

od dawna poprawna składnia if/else ifw Pythonie to elif. Nawiasem mówiąc, możesz użyć słownika, jeśli masz dużo if/else.eg

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

Dla msw, przykład wykonywania funkcji przy użyciu słownika.

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
źródło
1
Możesz, ale nie rób tego. Słownik nie jest dobrym zamiennikiem dla elif.
S.Lott,
@ s.lott, sprawa OP jest prosta. Jeśli musi sprawdzić wiele wartości a, słownik jest lepszy. możesz przyzwyczaić się go nie używać, ale używam go i podoba mi się to podejście bardziej niż kodowanie wielu, jeśli / else. cholera, nawet używam słownika do wykonywania funkcji.
ghostdog74,
1
@ghostdog: Wiem, że możesz używać słowników do wykonywania funkcji, ale ten pomysł mnie przeraża, jak obliczone gotos lub wklejanie ciągów Tcl i łączenie execich. Czy to dobra praktyka? Czy możesz podać przykład?
msw
@msw: To bardzo dobra praktyka. Przykład: czytasz strumień XML nie w celu wykonania jakiegoś prostego skrobania, ale taki, w którym musisz wykonać inne przetwarzanie dla różnych znaczników elementów, np. Plik arkusza kalkulacyjnego Excel 2007 to plik zip wielu dokumentów XML, niektóre bardzo złożone. Masz oddzielną metodę dla każdego tagu. Wysyłasz za pomocą słownika. Nie ma się czego bać. Jeśli metoda <foo>jest taka do_foo, możesz nawet zbudować dykta w locie, gdy aplikacja się uruchomi.
John Machin,
1
Zauważ, że słownik ma .getmetodę, która pozwala określić wartość domyślną. Twój pierwszy przykład można zapisać jakoprint d.get(a, "3a")
codeape
4

Oto trochę refaktoryzacji twojej funkcji (nie używa ona „else” ani „elif”):

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

@ ghostdog74: Python 3 wymaga nawiasów do drukowania.

Winston C. Yang
źródło
Python 3 zastąpił instrukcję print Pythona 2 funkcją wymaganego nawiasu, a jeśli to zrobisz, możesz równie dobrze skorzystać z sys.stdout.write
Dan D.
2
powinno być ('1', '2'), op używa ciągów znaków
priestc
2
def function(a):
    if a == '1':
        print ('1a')
    else if a == '2'
        print ('2a')
    else print ('3a')

Należy poprawić do:

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

Jak widać, w przeciwnym razie, jeśli należy zmienić na elif, po „2” powinny znajdować się dwukropki, a po instrukcji else powinien znajdować się nowy wiersz i zamknąć spację między drukiem a nawiasami.

MilkyWay90
źródło