Каков правильный синтаксис для 'else if'?

284

Я новый программист на Python, который делает скачок с 2.6.4 до 3.1.1. Все прошло хорошо, пока я не попытался использовать оператор «else if». Интерпретатор выдает мне синтаксическую ошибку после 'if' в 'else if' по причине, которую я не могу понять.

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 не менялся между этими версиями. Возможно, никогда вообще.
Майк Грэм
Вы можете начать с хорошего учебника по if / else в python: dreamsyssoft.com/python-scripting-tutorial/ifelse-tutorial.php
Triton Man

Ответы:

444

В питоне «иначе, если» пишется «элиф».
Кроме того, вам нужно двоеточие после 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 Ссылка на библиотеку: docs.python.org/3.1/library/index.html
Линдон Уайт,
1
Perl использует то же ключевое слово, и обоснование для него состояло в том, чтобы предотвратить несчастные случаи, когда вы забыли завершить написание предыдущего оператора else и начали писать еще одно выражение if. По-видимому, это было распространенной проблемой при написании кода на Си.
Нейт Гленн
1
@NateGlenn Perl на самом деле использует elsif, я думаю, Python должен был быть на один символ более эффективным. «Elif», похоже, возникла из препроцессора C, который использовался #elifзадолго до Python AFAICT. Очевидно, что в этом контексте наличие директивы с одним токеном является ценным, поскольку синтаксический анализ #else if <code>vs. #else <code that could theoretically even be an if statement>усложнил бы синтаксис, который должен был быть слишком простым.
1846
13
def function(a):
    if a == '1':
        print ('1a')
    elif a == '2':
        print ('2a')
    else:
        print ('3a')
Том
источник
10

с давних времен правильный синтаксис для if/else ifв Python есть 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()
ghostdog74
источник
1
Вы можете, но, пожалуйста, не делайте этого. Словарь не является хорошей заменой elif.
S.Lott
@ s.lott, случай OP прост. Если ему нужно проверить множество значений, словарь будет более точным. Вы можете сделать это привычкой не использовать его, но я использовал его, и мне нравится этот подход лучше, чем кодирование многих if / else. черт, я даже использую словарь для выполнения функций.
ghostdog74
1
@ghostdog: Я знаю, что вы можете использовать словари для выполнения функций, но идея пугает меня, как вычисленные gotos или вставка строк Tcl вместе и execих объединение . Это хорошая практика? Можете назвать пример?
MSW
@msw: это очень хорошая практика. Пример: вы читаете поток XML не для какого-то простого упражнения по очистке, а для того, чтобы выполнить различную обработку для разных тегов элементов, например, файл электронной таблицы Excel 2007 представляет собой архив нескольких документов XML, некоторые из которых очень сложны. У вас есть отдельный метод для каждого тега. Вы отправляете через словарь. Ничего страшного. Если метод обработки <foo>является do_foo, вы можете даже построить Dict на лету , когда приложение запускается.
Джон Мачин
1
Обратите внимание, что в словаре есть .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
Дэн Д.
2
должно быть ('1', '2'), операционная система использует строки
priestc
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 и закрыть пробел между print и круглыми скобками.

MilkyWay90
источник