Я знаю такие языки, как C, C ++, Java и C #, (пример C # <) оператор else if является синтаксическим сахаром, поскольку в действительности это просто один оператор else, за которым следует оператор if.

else if (conition(s)) { ...

Равно

else {
    if (condition(s)) { ...
}

Однако в python есть специальное выражение elif. Мне было интересно, является ли это просто сокращением для разработчиков или есть ли какая-то скрытая оптимизация, которую Python может сделать из-за этого, например, интерпретировать быстрее? Но это не имеет смысла для меня, так как другие языки будут делать то же самое (например, JavaScript). Итак, мой вопрос в том, что в python оператор elif является просто условным обозначением для разработчиков, или есть что-то скрытое, что он получает от этого?

6
hargasinski 16 Дек 2015 в 09:01

4 ответа

Лучший ответ

Если вы действительно хотите узнать, что происходит за кулисами в интерпретаторе, вы можете использовать модуль dis. В таком случае:

>>> def f1():
...   if a:
...     b = 1
...   elif aa:
...     b = 2
... 
>>> def f2():
...   if a:
...     b = 1
...   else:
...     if aa:
...       b = 2
... 
>>> dis.dis(f1)
  2           0 LOAD_GLOBAL              0 (a)
              3 POP_JUMP_IF_FALSE       15

  3           6 LOAD_CONST               1 (1)
              9 STORE_FAST               0 (b)
             12 JUMP_FORWARD            15 (to 30)

  4     >>   15 LOAD_GLOBAL              1 (aa)
             18 POP_JUMP_IF_FALSE       30

  5          21 LOAD_CONST               2 (2)
             24 STORE_FAST               0 (b)
             27 JUMP_FORWARD             0 (to 30)
        >>   30 LOAD_CONST               0 (None)
             33 RETURN_VALUE        
>>> dis.dis(f2)
  2           0 LOAD_GLOBAL              0 (a)
              3 POP_JUMP_IF_FALSE       15

  3           6 LOAD_CONST               1 (1)
              9 STORE_FAST               0 (b)
             12 JUMP_FORWARD            15 (to 30)

  5     >>   15 LOAD_GLOBAL              1 (aa)
             18 POP_JUMP_IF_FALSE       30

  6          21 LOAD_CONST               2 (2)
             24 STORE_FAST               0 (b)
             27 JUMP_FORWARD             0 (to 30)
        >>   30 LOAD_CONST               0 (None)
             33 RETURN_VALUE        

Похоже, что наши две функции используют один и тот же байт-код - так что, очевидно, они эквивалентны.

Осторожно, байт-код - это деталь реализации CPython. Нельзя сказать, что все реализации Python делают одно и то же за кулисами. Все, что имеет значение, - это то, что они ведут себя одинаково. Работая с логикой, вы можете убедить себя, что f1 и f2 должны делать одно и то же независимо от того, рассматривает ли базовая реализация это как «синтетический сахар» или происходит что-то более сложное.

11
mgilson 16 Дек 2015 в 06:16

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

elif condition: ...
else if conition { ...
else {
    if conition { ...
}

elif в Python - это просто синтаксический сахар для общего выражения else if

1
M. Bloom 16 Дек 2015 в 06:12

elif в Python является синтаксическим сахаром для else if, встречающимся во многих других языках. Это все.

1
janos 16 Дек 2015 в 06:05

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

3
Prashant Yadav 16 Дек 2015 в 06:09