I just started Python programming, and I'm wondering about the elif
keyword.
Other programming languages I've used before use else if
. Does anyone have an idea why the Python developers added the additional elif
keyword?
Why not:
if a:
print("a")
else if b:
print("b")
else:
print("c")
elif is some sort of replacement for switch in other languages but with more power
for example in C you write
in Python you write
As you see
elif
is more powerful since you can put more complex statements than in a switch, plus avoid nestingif/else
statementsThat's just the way it is. Javascript uses
else if
, php useselseif
, perl useselsif
, the C preprocessor and python useelif
. None of them are wrong, they just choose slightly different syntax to do the same thing. :DLanguages with C-like syntax get
else if
for free without having to implement it at all.The reason is that in that syntax control structures simply operate on the next statement, which can be a compound statement enclosed in braces if necessary (e.g.
{ x += 1; y += 1 }
).This means that once you've implemented
if
andelse
,else if
just falls out of the grammar of the language naturally for free, with no further implementation effort. To see why, have a look at this:This looks like an
if
with anelse if
and anelse
attached, each applied to a compound statement. But in fact it's not. This is actually two separateif
statements, each with exactly oneelse
case; the secondif
statement is inside the body of theelse
of the firstif
statement.else if { ... }
is really parsed aselse
applied to the next statement, which is anif
statement (applied to the compound statement{ else_if_body(); }
. Then the finalelse
binds to the immediately precedingif
, which is the second one.Here's the same thing written more in line with how it's parsed1:
But it turns out that if the language did directly implement
else if
as a first-class option forif
statements, it would behave exactly the same as the second independentif
statement inside theelse
of the first! So there's no need to bother implementingelse if
at all; language implementers getelse if
for free with this style of syntax, once they've implementedif
andelse
.Python's syntax doesn't allow this freebie.
Programmers of C-style syntax can think in terms of
else if
even though the language only hasif
with exactly zero-or-oneelse
, but only because they can write code like my first example that is formatted in a way that looks different to a human reader than it does to the compiler.Python, OTOH, uses indentation to indicate block structure, which forces the block structure to look the same to a human reader as it does to the interpreter2. Once you've got
if
andelse
in Python-style syntax, programmers could still write code that behaves identically to an else-if, by putting a secondif
statement inside theelse
of a first. But that comes out looking like this:This looks ugly, and is much more complex to think in terms of than an else-if chain once you get more than 1 or 2 else-ifs. So it's worth adding in an explicit language feature to get back the ability to think in terms of else-if. Even though it technically makes the language more complex, it actually makes thinking in terms of the language simpler, so it's good complexity; with a manually constructed chain of nested
if
s insideelse
s the reader has to manually read all the code and verify that everyelse
except the last contains exactly oneif
statement and nothing else, in order to conclude that the whole sequence is equivalent to a linear chain of conditions checked in order, with some code to execute for the first check that succeeds.So then. We've seen that languages with C-like syntax might as well go with
else if
, because they get it for free. That's the reason why that exists. Languages with Python-like syntax have to explicitly do something to get a construct that can be used as an else-if. Why did they chooseelif
? It's arbitrary; you'd have to actually ask the people who made the decision.However Python didn't invent
elif
, it was around in other languages long before Python existed. So I would guess that when they had to implement an explicit else-if construct they simply picked one that programmers were already familiar with.1 Technically, this is how people who are REALLY serious about always using braces with control structures should write their code. ;)
2 You can certainly construct counter-examples to this, but it's the general idea of indentation-based syntax.
Most likely its syntactic sugar. Like the
Wend
of Visual Basic.I find them helpful to help differentiate the "else-if"s from the "final else".
Python inherits this from Perl, where it's called
elsif
.In Python's case,
else if
as two separate constructs like it is in C-like languages would be quite ugly as you'd have to haveelse: if:
with two indenting levels.It's arguable whether special-casing the two keywords together would be better (so making
else if
a single construct, like thenot in
operator.PL/SQL also has
elsif
, and the C preprocessor has it spelledelif
.