Разница между множеством если и элифа? - PullRequest
56 голосов
/ 14 февраля 2012

В python есть ли разница между, скажем,

if text == 'sometext':
    print(text)
if text == 'nottext':
    print("notanytext")

и

 if text == 'sometext':
        print(text)
 elif text == 'nottext':
        print("notanytext")

Просто интересно, может ли несколько if s вызвать какие-либо нежелательные проблемы и будет ли этолучше использовать elif с.

Ответы [ 8 ]

75 голосов
/ 14 февраля 2012

Multiple if означает, что ваш код будет идти и проверять все условия if, где, как в случае elif, если один, если условие удовлетворяет, он не будет проверять другие условия.

31 голосов
/ 30 апреля 2013

Другой простой способ увидеть разницу между использованием if и elif - вот этот пример:

def analyzeAge( age ):
   if age < 21:
       print "You are a child"
   if age >= 21: #Greater than or equal to
       print "You are an adult"
   else:   #Handle all cases were 'age' is negative 
       print "The age must be a positive integer!"

analyzeAge( 18 )  #Calling the function
>You are a child
>The age must be a positive integer!

Здесь вы можете видеть, что когда 18 используется в качестве ввода, ответ (удивительно) 2приговоры.Это не правильно.Это должно быть только первое предложение.

Это потому, что ОБА, если операторы оцениваются.Компьютер видит их как два отдельных утверждения:

  • Первое из них истинно для 18, поэтому печатается «Вы - ребенок».
  • Второе утверждение if является ложным и, следовательно,часть else выполняется с выводом «Возраст должен быть положительным целым числом».

elif исправляет это и делает два оператора if «слипшимися» как один:

def analyzeAge( age ):
   if age < 21:
       print "You are a child"
   elif age > 21:
       print "You are an adult"
   else:   #Handle all cases were 'age' is negative 
       print "The age must be a positive integer!"

analyzeAge( 18 )  #Calling the function
>You are a child
8 голосов
/ 18 марта 2013
def multipleif(text):
    if text == 'sometext':
        print(text)
    if text == 'nottext':
        print("notanytext")

def eliftest(text):
    if text == 'sometext':
        print(text)
    elif text == 'nottext':
        print("notanytext")

text = "sometext"

timeit multipleif(text)
100000 loops, best of 3: 5.22 us per loop

timeit eliftest(text)
100000 loops, best of 3: 5.13 us per loop

Вы видите, что elif немного быстрее.Это было бы более очевидно, если бы было больше ifs и больше elifs.

3 голосов
/ 17 апреля 2015

Вот еще один способ думать об этом:

Допустим, у вас есть два конкретных условия, что структуры перехвата if / else будет недостаточно:

Пример:

Iу меня 3 X 3 крестики-нолики, и я хочу напечатать координаты обеих диагоналей, а не остальных квадратов.

Tic-Tac-Toe Coordinate System

Я решил использовать вместо него структуру if / elif ...

for row in range(3):
    for col in range(3):
        if row == col:
            print('diagonal1', '(%s, %s)' % (i, j))
        elif col == 2 - row:
            print('\t' * 6 + 'diagonal2', '(%s, %s)' % (i, j))

Вывод:

diagonal1 (0, 0)
                        diagonal2 (0, 2)
diagonal1 (1, 1)
                        diagonal2 (2, 0)
diagonal1 (2, 2)

Но ждать!Я хотел включить все три координаты diagonal2, так как (1, 1) также является частью диагонали 2.

'elif' вызвал зависимость с 'if', так что если исходное 'if' былоудовлетворено, что «elif» не будет инициироваться, даже если логика «elif» также удовлетворяет условию.

Давайте вместо этого изменим второе «elif» на «if».

for row in range(3):
    for col in range(3):
        if row == col:
            print('diagonal1', '(%s, %s)' % (i, j))
        if col == 2 - row:
            print('\t' * 6 + 'diagonal2', '(%s, %s)' % (i, j))

Теперь я получаю вывод, который хотел, потому что два оператора «если» взаимоисключающие.

diagonal1 (0, 0)
                        diagonal2 (0, 2)
diagonal1 (1, 1)
                        diagonal2 (1, 1)
                        diagonal2 (2, 0)
diagonal1 (2, 2)

В конечном итоге знание того, какого типа или результата вы хотите достичь, определит тип условных отношений / структуры, которые вы кодируете.

2 голосов
/ 14 февраля 2012

В приведенном выше примере есть различия, потому что ваш второй код имеет отступ elif , он фактически будет внутри блока if и является синтаксически и логически некорректным в этомпример.

Python использует отступы строки для определения блоков кода (большинство языков, подобных C, используют {} для включения блока кода, но python использует отступы строки), поэтому, когда вы кодируете, вы должны серьезно относиться к отступам.

ваш образец 1:

if text == 'sometext':
    print(text)
elif text == 'nottext':
    print("notanytext")

оба , если и elif имеют одинаковый отступ, поэтому они связаны с одной и той же логикой.Ваш второй пример:

if text == 'sometext':
    print(text)
    elif text == 'nottext':
        print("notanytext")

elif имеет отступ больше, чем , если , перед тем, как другой блок его заключит, поэтому он считается внутри , если блок.и поскольку внутри , если нет других вложенных , если , elif рассматривается интерпретатором Python как синтаксическая ошибка.

1 голос
/ 04 апреля 2018

elif - это просто причудливый способ выразить else: if,

Множественные if выполняют несколько ветвей после тестирования, в то время как elifs взаимно исключают друг друга, исполняют одну ветвь после тестирования.

Взять примеры user2333594

    def analyzeAge( age ):
       if age < 21:
           print "You are a child"
       elif age > 21:
           print "You are an adult"
       else:   #Handle all cases were 'age' is negative 
           print "The age must be a positive integer!"

можно перефразировать как:

    def analyzeAge( age ):
       if age < 21:
           print "You are a child"
       else:
             if age > 21:
                 print "You are an adult"
             else:   #Handle all cases were 'age' is negative 
                 print "The age must be a positive integer!"

Другой пример может быть:

def analyzeAge( age ):
       if age < 21:
           print "You are a child"
       else: pass #the if end
       if age > 21:
           print "You are an adult"
       else:   #Handle all cases were 'age' is negative 
           print "The age must be a positive integer!"
0 голосов
/ 29 ноября 2018

Вот как я разбиваю операторы потока управления:


# if: unaffected by preceding control statements
def if_example():
    if True:
        print('hey')
    if True:
        print('hi')  # will execute *even* if previous statements execute

напечатает hey и hi


# elif: affected by preceding control statements
def elif_example():
    if False:
        print('hey')
    elif True:
        print('hi')  # will execute *only* if previous statement *do not*

выведет hi только , поскольку предыдущий оператор оценивается как False


# else: affected by preceding control statements
def else_example():
    if False:
        print('hey')
    elif False:
        print('hi')
    else:
        print('hello')  # will execute *only* if *all* previous statements *do not*

напечатает hello, поскольку все предыдущие операторы не смогли выполнить

0 голосов
/ 25 сентября 2018

Когда вы используете несколько if, ваш код будет возвращаться в каждый оператор if, чтобы проверить, соответствует ли выражение вашему условию.Иногда бывают случаи отправки множества результатов для одного выражения, чего вы даже не ожидаете.Но использование elif завершает процесс, когда выражение подходит для любого вашего условия.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...