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

Введение

Примеры

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 .

Синтаксис

Параметры

Примечания