2010-09-18 4 views
44

Я только начал программирование на Python, и мне интересно о ключевое слово elif.Python, почему ключевое слово elif?

Другие языки программирования, которые я использовал перед использованием else if. У кого-нибудь есть идея, почему разработчики Python добавили дополнительное ключевое слово elif?

Почему нет:

if a: 
    print("a") 
else if b: 
    print("b") 
else: 
    print("c") 
+3

Проверьте рубин. Он делает то же самое. Это не стоит обдумывать, ИМО. –

+2

Отъезд perl, где находится 'elsif'. – slebetman

+3

Проверьте bash/sh, где это 'elif'. – slebetman

ответ

0

Скорее всего его синтаксический сахар. Как Wend Visual Basic.

+21

Я не уверен, как это действительно затрагивает вопрос о том, почему разработчики Python выбирают' elif', а не 'else if'? – Ben

+7

'elif' is * not * просто сокращение для' else if'. 'else if' фактически является синтаксической ошибкой как в python 2, так и в python 3. – JSQuareD

+0

@JSQuareD Это правда, но так же, как' elif' был добавлен как специальный случай, то же самое можно было бы сделать для 'else if' без двоеточия после еще. – Neme

112

Далеко, насколько я знаю, это необходимо, чтобы избежать чрезмерного отступа. Вы можете написать

if x < 0: 
    print 'Negative' 
else: 
    if x == 0: 
     print 'Zero' 
    else: 
     print 'Positive' 

но

if x < 0: 
    print 'Negative' 
elif x == 0: 
    print 'Zero' 
else: 
    print 'Positive' 

просто так гораздо лучше.


Благодаря ign для docs справки:

Ключевое слово elif является аббревиатурой «иначе если», и полезно, чтобы избежать чрезмерного отступа.

+39

@Anna: как насчет 'else if', где' else' и 'if' находятся в одной строке? Я думаю, что это означает OP. –

+15

«else if» не всегда одно ключевое слово. Например, в C# это просто вложенный, если он похож на то, как я написал его в моем первом примере. Это просто, что C# не интересует пробел, а также python, поэтому допустимо выписывать «else if» в одной строке. Что касается того, почему это называется «elif» вместо «elseif», «elsif» или что-то еще, я понятия не имею. Языки разные, и только потому, что некоторые делают что-то в одном направлении, не означает, что каждый должен следовать этому примеру. :) –

+2

Просто добавьте немного больше контекста и источника: http://docs.python.org/2/tutorial/controlflow.html – Nacho

-6

Python наследует это от Perl, где его называют elsif.

В случае с Python, else if, поскольку две отдельные конструкции, подобные на C-подобных языках, были бы довольно уродливыми, так как вы должны были бы иметь else: if: с двумя уровнями отступа.

Это спорно ли специальная кожухотрубные две ключевые слова вместе будет лучше (так что делает else if один конструкт, как оператор not in.

PL/SQL также elsif и C препроцессора это прописано elif.

+17

«Python inhertis это от Perl» - Wat? – delnan

+5

Я думаю, что они оба получили это из предыдущих языков - Python вовсе не потомок Perl. –

+4

's/Perl/Bash /' было бы лучше, так как в bash это действительно 'elif'. И я считаю, что bash унаследовал его от sh, который намного старше Perl. – slebetman

15

Чтобы избежать скобку^H^H^H^H^Helse если война

в C/C++, где у вас есть else if, вы можете структурировать свой код в самых разных стилях:.

if (...) { 
    ... 
} else if (...) { 
    ... 
} 


if (...) { 
    ... 
} 
else if (...) { 
    ... 
} 

if (...) { 
    ... 
} else 
if (...) { 
    ... 
} 

// and so on 

, вместо этого такая война никогда не произойдет, поскольку существует только один способ написать elif. Кроме того, elif намного короче, чем else if.

+17

Последний пример болезнен, чтобы посмотреть. Горе тому, кто причинил это, вы невинные глаза. – SingleNegationElimination

+17

Я не могу понять, как 'else if', если бы он существовал на Python, привел бы к битке. –

+4

@ypercube: http://answers.google.com/answers/threadview/id/386870.html –

8

Так оно и есть. Javascript использует else if, php использует elseif, perl использует elsif, препроцессор C и использование python elif. Ни один из них не ошибается, они просто выбирают немного другой синтаксис, чтобы делать то же самое.: D

+0

Мне до этого не приходило в голову, что C использует 'else if', в то время как CPP использует' elif', поэтому вы часто в итоге оба смешаны в одном файле. – ArtOfWarfare

0

Элиф какая-то замена переключателя на других языках, но с большей силой

, например, в C вы пишете

 
switch (number){ 
case 1: 
    doA() 
    break; 
case 2: 
    doB() 
    break; 
case N: 
    doN() 
    break; 
default: 
    doSomethingElse() 
    break; 
} 

в Python вы пишете

 
if number == 1: doA() 
elif number == 2: doB() 
elif number == N: doC() 
else: doSomethingElse() 

As вы видите, что elif более мощный, поскольку вы можете вводить более сложные выражения, чем в коммутаторе, а также избегать вложения if/else операторов

+2

Нет, 'elif' является аналогом' else if' в C, который имеет точно эквивалентную мощность (даже если он реализован с различными правилами синтаксического анализа). Вы можете использовать 'else if' вместо' case' даже в C. И это, безусловно, не имеет никакого отношения к тому, почему 'elif' используется в python, а не' else if'. – Ben

6

Я нахожу их полезными, чтобы помочь отличить «else-if» от «final else».

47

Языки с синтаксисом типа C получают else if бесплатно без необходимости его реализации.

Причина в том, что в этих структурах управления синтаксисом просто используется следующий оператор, который может быть составным выражением, заключенным в фигурные скобки, если необходимо (например, { x += 1; y += 1 }).

Это означает, что после того, как вы внедрили if и else, else if просто выпадает из грамматики языка, естественно, бесплатно, без каких-либо дополнительных усилий по осуществлению. Чтобы понять, почему, посмотрите на это:

if (condition) { 
    if_body(); 
} else if (another_condition) { 
    else_if_body(); 
} else { 
    else_body(); 
} 

Это выглядит как if с else if и else прилагается, каждый применительно к составному оператору. Но на самом деле это не так. Это фактически два отдельных оператора if, каждый из которых имеет только один случай else; второй оператор if находится внутри тела else первого if.

else if { ... } действительно анализируются как else применяется к следующему оператору, который представляет собой if заявления (применительно к составному оператору { else_if_body(); }. Затем конечный else связывается с непосредственно предшествующими if, которая является вторым.

Вот то же самое написано в соответствие с тем, как он разобран :

if (condition) { 
    if_body(); 
} else { 
    if (another_condition) { 
     else_if_body(); 
    } else { 
     else_body(); 
    } 
} 

Но получается, что если язык не принимали непосредственного осуществления else if как первоклассный вариант для if заявлений, он будет вести себя точно то же, что и второе независимое заявление if изнутри else первых! Поэтому нет необходимости беспокоиться об осуществлении else if; языковые исполнители получают else if бесплатно с этим стилем синтаксиса, после того как они реализованы if и else.

Синтаксис Python не разрешает эту халяву.

Программисты синтаксиса C-стиля может думать с точки зрения else if хотя язык имеет только if с точно нулевой или один год else, но только потому, что они могут писать код, как мой первый пример, который отформатирован в который выглядит по-разному для читателя, чем для компилятора.

Python, OTOH, использует отступы для указания структуры блока, что заставляет структуру блоков выглядеть одинаково с человеческим читателем, как и с интерпретатором . После того, как вы получили if и else в синтаксисе стиля Python, программисты все еще могли написать код, который ведет себя идентично else-if, помещая второй оператор if изнутри else первого. Но это выходит глядя, как это:

if condition: 
    if_body() 
else: 
    if another_condition: 
     else_if_body() 
    else: 
     else_body() 

Это выглядит некрасиво, и гораздо сложнее мыслить в терминах, чем еще, если цепь, как только вы получите больше, чем 1 или 2-либо еще сослагательного наклонения. Поэтому стоит добавить явную функцию языка, чтобы вернуть способность мыслить в терминах else-if. Несмотря на то, что это технически делает язык более сложным, он фактически делает мышлением с точки зрения языка проще, поэтому это хорошая сложность; с созданной вручную цепочкой вложенных if с внутри else с читателем необходимо вручную прочитать весь код и убедиться, что каждый else, за исключением последнего, содержит ровно один оператор if и ничего больше, чтобы сделать вывод, что вся последовательность эквивалентна линейная цепочка условий, проверенная по порядку, с некоторым кодом для выполнения первой проверки, которая преуспевает.

Итак, тогда. Мы видели, что языки с C-подобным синтаксисом могут также идти с else if, потому что они получают его бесплатно. Вот почему это существует. Языки с синтаксисом типа Python должны явно делать что-то, чтобы получить конструкцию, которая может использоваться как else-if. Почему они выбрали elif? Это произвольно; вы должны спросить людей, которые приняли решение.

Однако Python не изобрел elif, он был на других языках задолго до того, как существовал Python. Поэтому я хотел бы угадать, что, когда им пришлось реализовать явную конструкцию else-if, они просто выбрали тот, с которым уже знакомы программисты.


Технически, это то, как люди, которые действительно серьезно всегда использовать фигурные скобки с управляющими структурами должны написать свой код. ;)

Вы можете, конечно, создать контр-примеры для этого, но это общая идея синтаксиса на основе отступа.

Смежные вопросы