Ответ 1
Скорее всего это синтаксический сахар. Как Wend
Visual Basic.
Я только начал программирование на Python, и мне интересно, о elif
ключевое слово.
Другие языки программирования, которые я использовал перед использованием else if
. У кого-нибудь есть идея, почему разработчики Python добавили дополнительное ключевое слово elif
?
Почему бы и нет:
if a:
print("a")
else if b:
print("b")
else:
print("c")
Скорее всего это синтаксический сахар. Как Wend
Visual Basic.
Далеко, как я знаю, это там, чтобы избежать чрезмерного отступа. Вы можете написать
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
является коротким для "else if" и полезно избегать чрезмерного отступа.
Языки с синтаксисом типа 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
, который является вторым.
Здесь то же самое написано больше в соответствии с тем, как он анализировался 1:
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, использует отступы для указания блочной структуры, что заставляет структуру блоков выглядеть одинаково с человеческим читателем, как и с интерпретатором 2. После того, как вы получили if
и else
в синтаксисе стиля Python, программисты все еще могли писать код, который ведет себя идентично else-if, помещая второй оператор if
внутри else
первого. Но это выглядит так:
if condition:
if_body()
else:
if another_condition:
else_if_body()
else:
else_body()
Это выглядит уродливым и гораздо сложнее думать в терминах, чем цепочка else-if, когда вы получаете более 1 или 2 else-ifs. Поэтому стоит добавить явную функцию языка, чтобы вернуть способность мыслить в терминах else-if. Даже при том, что это технически делает язык более сложным, он фактически делает мышление с точки зрения языка более простым, так что это хорошая сложность; с созданной вручную цепочкой вложенных if
внутри else
читателю необходимо вручную прочитать весь код и убедиться, что каждый else
кроме последнего содержит ровно один оператор if
и ничего другого, чтобы сделать вывод о том, что целая последовательность эквивалентна линейной цепочке условий, проверенных по порядку, с некоторым кодом для выполнения первой проверки, которая преуспевает.
Итак, тогда. Мы видели, что языки с синтаксисом C-типа также можно использовать с else if
, потому что они получают его бесплатно. Это причина, почему это существует. Языки с синтаксисом типа Python должны явно делать что-то, чтобы получить конструкцию, которая может использоваться как else-if. Почему они выбрали elif
? Это произвольно; вам придется фактически спросить людей, которые приняли решение.
Однако Python не изобрел elif
, он был на других языках задолго до того, как существовал Python. Поэтому я бы предположил, что когда им пришлось реализовать явную конструкцию else-if, они просто выбрали тот, с которым уже знакомы программисты.
1 Технически, именно так люди, которые ДЕЙСТВИТЕЛЬНО серьезно относятся к использованию брекетов с контрольными структурами, должны написать свой код.;)
2 Вы можете, конечно, создать для этого контр-примеры, но это общая идея синтаксиса на основе отступа.
Чтобы избежать скобки ^ H ^ H ^ H ^ H ^ Помогите, если война.
В C/С++, где у вас есть else if
, вы можете структурировать свой код во многих разных стилях:
if (...) {
...
} else if (...) {
...
}
if (...) {
...
}
else if (...) {
...
}
if (...) {
...
} else
if (...) {
...
}
// and so on
имея вместо этого elif
, такой войны никогда не произойдет, так как существует только один способ написать elif
. Кроме того, elif
намного короче else if
.
Это так, как есть. Javascript использует else if
, php использует elseif
, perl использует elsif
, препроцессор C и питон используют elif
. Ни один из них не ошибается, они просто выбирают немного другой синтаксис, чтобы делать то же самое.: D
Я нахожу их полезными, чтобы помочь отличить "else-if" от "final else".
elif - это своего рода замена коммутатора на других языках, но с большей мощностью
например, в 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()
Как вы видите, elif
является более мощным, так как вы можете вводить более сложные операторы, чем в коммутаторе, а также избегать вложения инструкций if/else
Python наследует это от Perl, где он называется elsif
.
В случае Python else if
, поскольку две отдельные конструкции, подобные этой, в C-подобных языках, будут довольно уродливыми, так как вам нужно иметь else: if:
с двумя уровнями отступов.
Возможно ли, что сочетание двух ключевых слов будет лучше (так что else if
создать одну конструкцию, например, оператор not in
.
PL/SQL также имеет elsif
, а препроцессор C имеет значение elif
.