Різниця між кількома if і elif?


76

У python, чи є різниця між say:

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

і

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

Просто цікаво, чи можуть множини ifs викликати будь-які небажані проблеми і чи не було б кращою практикою використовувати elifs.

Відповіді:


108

Кілька if означає, що ваш код буде переходити і перевіряти всі умови if, де, як у випадку elif, якщо одна, якщо умова задовольняє, не перевірятиме інші умови ..


48

Іншим простим способом побачити різницю між використанням 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 where '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 хибний, а тому інша частина виконується з друком "Вік повинен бути цілим додатним числом".

У Еліф фіксує це і робить два , якщо «злипаються» ЗВІТНІСТЬ як один:

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

analyzeAge( 18 )  #Calling the function
>You are a child

Редагувати: виправлене написання


10
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 трохи швидший. Це було б більш очевидним, якби було більше якщо і більше еліфів.


5

Ось ще один спосіб думати про це:

Скажімо, у вас є дві конкретні умови, яких не буде достатньою структурою catchall if / else:

Приклад:

У мене є дошка 3 х 3 хрестиками, і я хочу надрукувати координати обох діагоналей, а не решту квадратів.

Система координат «Хрестики-нолики»

Я вирішую використовувати замість цього структуру 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)

Але почекай! Я хотів включити всі три координати діагоналі2, оскільки (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

У наведеному вище прикладі є відмінності, оскільки ваш другий код відступив elif , він насправді знаходився б у блоці if і в цьому прикладі є синтаксично та логічно неправильним.

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

ваш зразок 1:

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

як if, так і elif мають відступи однаково, тому вони пов’язані з однією логікою. ваш другий приклад:

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

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


1

elifце просто вигадливий спосіб висловитись else: if,

Кілька ifs виконують кілька гілок після тестування, тоді як 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!"

1

Коли ви використовуєте декілька if, ваш код повернеться назад у кожному ifоператорі, щоб перевірити, чи відповідає вираз вашим умовам. Іноді бувають випадки надсилання багатьох результатів для одного виразу, чого ви навіть не очікуєте. Але використання elifзавершує процес, коли вираз відповідає будь-якому вашому умові.


0

Ось як я розбиваю оператори керування потоком:


# 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

У випадку:

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

Усі ifоператори на одному рівні відступу виконуються, навіть якщо тільки перший ifоператор True.

У випадку:

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

Коли ifоператор є True, попередні оператори опускаються / не виконуються.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.