Условия (ветвления if-elif-else) и тернарные операторы

Введение

Примеры

  • если, элиф, и еще

    В Python можно определить ряд условных , используя , if для первого, elif для отдыха, вплоть до окончательного (опционально) else для чего - нибудь не пойманного других условных.

     number = 5
    
    if number > 2:
        print("Number is bigger than 2.")
    elif number < 2:  # Optional clause (you can have multiple elifs)
        print("Number is smaller than 2.")
    else:  # Optional clause (you can only have one else)
        print("Number is 2.")
    
    
     

    Выходы Number is bigger than 2 , Number is bigger than 2

    Использование else if , elif else if вместо elif вызовет синтаксическую ошибку и не допускается.

  • Условное выражение (или «Тернарный оператор»)

    Тернарный оператор используется для встроенных условных выражений. Лучше всего использовать его в простых, кратких операциях, которые легко читаются.

    • Порядок аргументов отличается от многих других языков (таких как C, Ruby, Java и т. Д.), Что может привести к ошибкам, когда люди, незнакомые с «удивительным» поведением Python, используют его (они могут изменить порядок).
    • Некоторые считают его «громоздким», поскольку он идет вразрез с нормальным потоком мысли (сначала думая о состоянии, а затем о последствиях).
     n = 5
    
    "Greater than 2" if n > 2 else "Smaller than or equal to 2"
    # Out: 'Greater than 2'
    
     

    Результат этого выражения будет таким, как он читается на английском языке - если условное выражение имеет значение True, то оно будет вычисляться как выражение с левой стороны, в противном случае - с правой стороны.

    Тенарные операции также могут быть вложенными, как здесь:

     n = 5
    "Hello" if n > 10 else "Goodbye" if n > 5 else "Good day"
    
     

    Они также обеспечивают способ включения условных в функции лямбды .

  • Если заявление

     if condition:
        body
    
     

    В if заявления проверяет состояние. Если он имеет значение True , она выполняет тело , if заявление. Если он имеет значение False , он пропускает тело.

     if True:
        print "It is true!"
    >> It is true!
    
    if False:
        print "This won't get printed.."
    
     

    Условием может быть любое допустимое выражение:

     if 2 + 2 == 4:
        print "I know math!"
    >> I know math! 
  • Остальное заявление

     if condition:
        body
    else:
        body
    
     

    Оператор else будет выполнять свое тело только в том случае, если все предыдущие условные операторы будут иметь значение False.

     if True:
        print "It is true!"
    else:
        print "This won't get printed.."
    
    # Output: It is true!
    
    if False:
        print "This won't get printed.."
    else:
        print "It is false!"
    
    # Output: It is false! 
  • Логические выражения

    Булевы логические выражения, в дополнение к оценке в True или False , возвращает значение , которое было истолковано как True или False . Это Pythonic способ представить логику, которая в противном случае может потребовать теста if-else.

    И оператор

    and оператор вычисляет все выражения и возвращает последнее выражение , если все вычисления выражений True . В противном случае она возвращает первое значение , которое вычисляется значение False :

     >>> 1 and 2
    2
    
    >>> 1 and 0
    0
    
    >>> 1 and "Hello World"
    "Hello World"
    
    >>> "" and "Pancakes"
    ""
    
    
     

    Или оператор

    or оператор вычисляет выражения слева направо и возвращает первое значение , которое вычисляет True или последнее значение (если ни один не True ).

     >>> 1 or 2
    1
    
    >>> None or 1
    1
    
    >>> 0 or []
    []
    
    
     

    Ленивая оценка

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

     >>> def print_me():
            print('I am here!')
    >>> 0 and print_me()
    0
    
     

    В приведенном выше примере, print_me никогда не выполняются , потому что Python может определить все выражение False , когда он встречает 0 ( False ). Имейте это в виду , если print_me нужно выполнить , чтобы служить вашей логике программы.

    Тестирование на множественные условия

    Распространенной ошибкой при проверке нескольких условий является неправильное применение логики.

    Этот пример пытается проверить , если две переменные имеют больше 2. Заявление оценивается как - if (a) and (b > 2) . Это дает неожиданный результат , так как bool(a) вычисляется как True , когда не равен нулю. a

     >>> a = 1
    >>> b = 6
    >>> if a and b > 2:
    ...     print('yes')
    ... else:
    ...     print('no')
    
    yes
    
     

    Каждую переменную нужно сравнивать отдельно.

     >>> if a > 2 and b > 2:
    ...     print('yes')
    ... else:
    ...     print('no')
    
    no
    
    
     

    Другая, аналогичная ошибка допущена при проверке, является ли переменная одним из нескольких значений. Утверждение в этом примере оценивается как - if (a == 3) or (4) or (6) . Это дает неожиданный результат , так как bool(4) и bool(6) каждый вычисляться значение True

     >>> a = 1
    >>> if a == 3 or 4 or 6:
    ...     print('yes')
    ... else:
    ...     print('no')
    
    yes
    
    
     

    Опять каждое сравнение должно быть сделано отдельно

     >>> if a == 3 or a == 4 or a == 6:
    ...     print('yes')
    ... else:
    ...     print('no')
    
    no
    
     

    Использование оператора in является каноническим способом написать это.

     >>> if a in (3, 4, 6):
    ...     print('yes')
    ... else:
    ...     print('no')
    
    no 
  • Истинные ценности

    Следующие значения считаются falsey, в том , что они оценивают в False при применении к логическому оператору.

    • Никто
    • Ложь
    • 0 , или любое цифровое значение эквивалентно нулю, например , 0L , 0.0 , 0j
    • Пустые последовательности: '' , "" , () , []
    • Пустые отображения: {}
    • Определяемые пользователем типы где __bool__ или __len__ возвращающие методы 0 или False

    Все остальные значения в Python вычисляться True .

    Примечание: Распространенная ошибка является просто проверить на фальшивость операции , которая возвращает различные значения Falsey где разница имеет значение. Например, при использовании , if foo() , а не более явным , if foo() is None

  • Использование функции cmp для получения результата сравнения двух объектов

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

    Предположим , вам нужно напечатать 'greater than' , если x > y , 'less than' , если x < y и 'equal' , если x == y .

     ['equal', 'greater than', 'less than', ][cmp(x,y)]
    
    # x,y = 1,1 output: 'equal'
    # x,y = 1,2 output: 'less than'
    # x,y = 2,1 output: 'greater than'
    
     

    cmp(x,y) возвращает следующие значения

    сравнение Результат х <у -1 х == у 0 х> у 1

    Эта функция удалена на Python 3. Вы можете использовать cmp_to_key(func) вспомогательные функции , расположенные в functools в Python 3 , чтобы преобразовать старые функции сравнения ключевых функций.

  • Тестирование объекта на None и присвоение ему

    Вы часто хотите назначить что - то объект , если он не является None , указав , что он не был назначен. Мы будем использовать aDate .

    Самый простой способ сделать это состоит в использовании is None тест.

     if aDate is None:
        aDate=datetime.date.today()
    
     

    (Обратите внимание , что это не более Pythonic сказать is None вместо == None ) .

    Но это может быть немного оптимизирована за счет использования понятия , что not None не оценит , чтобы True в логическое выражение. Следующий код эквивалентен:

     if not aDate:
        aDate=datetime.date.today()
    
     

    Но есть и более питонский способ. Следующий код также эквивалентен:

     aDate=aDate or datetime.date.today()
    
     

    Это делает оценку короткого замыкания . Если aDate инициализируется и не является not None , то он получает назначение в себе, без чистого эффекта. Если это is None , то datetime.date.today() получает назначение в aDate .

Синтаксис

Параметры

Примечания