Разница между несколькими If и Python Elif

в python есть разница между словами:

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

и

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

просто интересно, может ли несколько ifs вызвать какие-либо нежелательные проблемы и лучше ли использовать elifs

7 ответов


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


другой простой способ увидеть разницу между использованием 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 предложения. Это неправильно. Это должно быть только первое предложение.

это потому, что оба оператора if оцениваются. Компьютер видит их как два отдельных утверждения:

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

на Элиф исправляет это и делает два оператора 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

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.


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

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

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

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

и Если и Элиф отступы одинаковы, поэтому они связаны с одной и той же логикой. второй пример:

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

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


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

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

пример:

у меня есть доска 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) также является частью diagonal 2.

"Элиф" вызвал зависимость С "если", так что, если исходное "если" было удовлетворено, "Элиф" не будет инициироваться, даже если логика "Элиф" также удовлетворяла условию.

давайте вместо этого изменим второе "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))

теперь я получаю результат, который я хотел, потому что два оператора " if " взаимно эксклюзивный.

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

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


elif - это просто другой способ выражения else: if,

несколько ifs выполняют несколько ветвей после тестирования, в то время как elifs являются взаимоисключающими, выполняют acutally одну ветвь после тестирования.

возьмите примеры 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!"

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