Який правильний синтаксис 'else if'?


284

Я новий програміст Python, який робить стрибок з 2.6.4 до 3.1.1. Все пройшло нормально, поки я не спробував використати вислів 'ще якщо'. Інтерпретатор видає мені синтаксичну помилку після "якщо" в "інше, якщо" з тієї причини, яку я не можу зрозуміти.

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

function(input('input:'))

Мені, мабуть, не вистачає чогось дуже простого; однак я не зміг знайти відповідь самостійно.


3
Я не думаю, що це працює в 2.6.4.
WRAR

Дійсно, цей елемент синтаксису і семантики Python не змінювався між цими версіями. Можливо, взагалі ніколи.
Майк Грехем

Ви можете почати з хорошого підручника про те, якщо / ще в python: dreamsyssoft.com/python-scripting-tutorial/ifelse-tutorial.php
Triton Man

Відповіді:


444

У python "else if" написано "elif".
Також вам потрібна двокрапка після elifі else.

Проста відповідь на просте запитання. У мене була така ж проблема, коли я вперше почав (за останні пару тижнів).

Отже, ваш код повинен читати:

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

function(input('input:'))

11
не хвилюйтесь, всі ми повинні колись навчитися. Мені здається дивним, що python розміщує такий ельфіс на читанні, а потім переходить і використовує elkif замість іншого. Я пропоную постійно зберігати посібник з API python: docs.python.org/3.1 важливими посиланнями є Підручник: docs.python.org/3.1/tutorial/index.html Довідка про мову: docs.python.org/3.1/reference /index.html Направлення до
Lyndon White

1
Perl використовує те саме ключове слово, і його обґрунтуванням було запобігати нещасним випадкам, коли ви забудете закінчити писати попереднє інше твердження і починаєте писати інше if. Мабуть, це була загальна проблема під час написання коду С.
Нейт Гленн

1
@NateGlenn Perl фактично використовує elsif, я думаю, Python повинен був бути одним символом більш ефективним. "Elif", схоже, виник із препроцесором C, який використовувався #elifзадовго до Python AFAICT. Очевидно, що в цьому контексті мати однозначну директиву є цінним, оскільки синтаксичний розбір #else if <code>порівняно #else <code that could theoretically even be an if statement>ускладнив би синтаксис, який мав бути простий.
FeRD


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

10

З давніх часів правильний синтаксис для if/else ifPython є elif. До речі, ви можете використовувати словник, якщо у вас є багато if/else.eg

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

Для msw, приклад виконання функцій за допомогою словника.

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
Можна, але будь ласка, не робіть цього. Словник не є хорошою заміною для elif.
С.Лотт

@ s.lott, справа ОП проста. Якщо йому доведеться перевірити багато значень "a", словник акуратніший. ви можете зробити це звичком не користуватися ним, але я використовував його, і мені подобається такий підхід краще, ніж кодування багатьох, якщо / ще. чортів, я навіть використовую словник для виконання функцій.
ghostdog74

1
@ghostdog: Я знаю, що ти можеш використовувати словники для виконання функцій, але ця ідея мене лякає, як обчислені готи або вклеювання рядків Tcl разом і execing. Це хороша практика? Чи можете ви назвати приклад?
msw

@msw: Це дуже хороша практика. Приклад: ви читаєте потік XML не для якоїсь простої вправи на вискоблювання, а для того, де вам потрібно виконати різну обробку для різних тегів елементів, наприклад, файл електронних таблиць Excel 2007 - це поштове повідомлення з декількох XML-документів, деякі дуже складні. У вас є окремий метод для кожного тегу. Ви відправляєте через словник. Нічого не лякатися. Якщо спосіб обробки <foo>є do_foo, ви навіть можете будувати диктовку на льоту, коли програма запускається.
Джон Махін

1
Зауважте, що у словнику є a .get метод, який дозволяє вказати значення за замовчуванням. Ваш перший приклад можна записати якprint d.get(a, "3a")
codeape

4

Ось трохи рефакторингу вашої функції (вона не використовує "else" чи "elif"):

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

@ ghostdog74: Python 3 вимагає дужок для "друку".


python 3 замінив оператор друку python 2 функцією, таким чином, потрібні дужки, і якщо ви збираєтеся так, щоб ви могли просто скористатися sys.stdout.write
Dan D.

2
повинно бути ('1', '2'), оп використовує рядки
жрець

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

Слід виправити:

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

Як бачимо, інакше, якщо слід змінити на elif, після '2' повинні бути двокрапки, інакше, після оператора else повинен бути новий рядок, і закрити простір між друком і дужками.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.