- if/elif/else#
- Условия#
- True и False#
- Операторы сравнения#
- Оператор in#
- Операторы and, or, not#
- Оператор and#
- Оператор or#
- Пример использования конструкции if/elif/else#
- Тернарное выражение (Ternary expression)#
- Условия (ветвления if-elif-else) и тернарные операторы
- Условное выражение (или «Тернарный оператор»)
- Если заявление
- Остальное заявление
- Логические выражения
- И оператор
- Или оператор
- Ленивая оценка
- Тестирование на множественные условия
- Истинные ценности
- Использование функции cmp для получения результата сравнения двух объектов
- Тестирование объекта на None и присвоение ему
if/elif/else#
Конструкция if/elif/else позволяет делать ответвления в ходе программы. Программа уходит в ветку при выполнении определенного условия.
В этой конструкции только if является обязательным, elif и else опциональны:
- Проверка if всегда идет первой.
- После оператора if должно быть какое-то условие: если это условие выполняется (возвращает True), то действия в блоке if выполняются.
- С помощью elif можно сделать несколько разветвлений, то есть, проверять входящие данные на разные условия.
- Блок elif это тот же if, но только следующая проверка. Грубо говоря, это «а если …»
- Блоков elif может быть много.
- Блок else выполняется в том случае, если ни одно из условий if или elif не было истинным.
In [1]: a = 9 In [2]: if a == 10: . : print('a равно 10') . : elif a 10: . : print('a меньше 10') . : else: . : print('a больше 10') . : a меньше 10
Условия#
Конструкция if построена на условиях: после if и elif всегда пишется условие. Блоки if/elif выполняются только когда условие возвращает True, поэтому первое с чем надо разобраться — это что является истинным, а что ложным в Python.
True и False#
В Python, кроме очевидных значений True и False, всем остальным объектам также соответствует ложное или истинное значение:
- истинное значение:
- любое ненулевое число
- любая непустая строка
- любой непустой объект
- 0
- None
- пустая строка
- пустой объект
Например, так как пустой список это ложное значение, проверить, пустой ли список, можно таким образом:
In [12]: list_to_test = [1, 2, 3] In [13]: if list_to_test: . : print("В списке есть объекты") . : В списке есть объекты
Тот же результат можно было бы получить несколько иначе:
In [14]: if len(list_to_test) != 0: . : print("В списке есть объекты") . : В списке есть объекты
Операторы сравнения#
Операторы сравнения, которые могут использоваться в условиях:
In [3]: 5 > 6 Out[3]: False In [4]: 5 > 2 Out[4]: True In [5]: 5 2 Out[5]: False In [6]: 5 == 2 Out[6]: False In [7]: 5 == 5 Out[7]: True In [8]: 5 >= 5 Out[8]: True In [9]: 5 10 Out[9]: True In [10]: 8 != 10 Out[10]: True
Обратите внимание, что равенство проверяется двойным == .
Пример использования операторов сравнения:
In [1]: a = 9 In [2]: if a == 10: . : print('a равно 10') . : elif a 10: . : print('a меньше 10') . : else: . : print('a больше 10') . : a меньше 10
Оператор in#
Оператор in позволяет выполнять проверку на наличие элемента в последовательности (например, элемента в списке или подстроки в строке):
In [8]: 'Fast' in 'FastEthernet' Out[8]: True In [9]: 'Gigabit' in 'FastEthernet' Out[9]: False In [10]: vlan = [10, 20, 30, 40] In [11]: 10 in vlan Out[11]: True In [12]: 50 in vlan Out[12]: False
При использовании со словарями условие in выполняет проверку по ключам словаря:
In [15]: r1 = . : 'IOS': '15.4', . : 'IP': '10.255.0.1', . : 'hostname': 'london_r1', . : 'location': '21 New Globe Walk', . : 'model': '4451', . : 'vendor': 'Cisco'> In [16]: 'IOS' in r1 Out[16]: True In [17]: '4451' in r1 Out[17]: False
Операторы and, or, not#
В условиях могут также использоваться логические операторы and , or , not :
In [15]: r1 = . : 'IOS': '15.4', . : 'IP': '10.255.0.1', . : 'hostname': 'london_r1', . : 'location': '21 New Globe Walk', . : 'model': '4451', . : 'vendor': 'Cisco'> In [18]: vlan = [10, 20, 30, 40] In [19]: 'IOS' in r1 and 10 in vlan Out[19]: True In [20]: '4451' in r1 and 10 in vlan Out[20]: False In [21]: '4451' in r1 or 10 in vlan Out[21]: True In [22]: not '4451' in r1 Out[22]: True In [23]: '4451' not in r1 Out[23]: True
Оператор and#
В Python оператор and возвращает не булево значение, а значение одного из операндов.
Если оба операнда являются истиной, результатом выражения будет последнее значение:
In [24]: 'string1' and 'string2' Out[24]: 'string2' In [25]: 'string1' and 'string2' and 'string3' Out[25]: 'string3'
Если один из операторов является ложью, результатом выражения будет первое ложное значение:
In [26]: '' and 'string1' Out[26]: '' In [27]: '' and [] and 'string1' Out[27]: ''
Оператор or#
Оператор or , как и оператор and, возвращает значение одного из операндов.
При оценке операндов возвращается первый истинный операнд:
In [28]: '' or 'string1' Out[28]: 'string1' In [29]: '' or [] or 'string1' Out[29]: 'string1' In [30]: 'string1' or 'string2' Out[30]: 'string1'
Если все значения являются ложными, возвращается последнее значение:
Важная особенность работы оператора or — операнды, которые находятся после истинного, не вычисляются:
In [33]: '' or sorted([44, 1, 67]) Out[33]: [1, 44, 67] In [34]: '' or 'string1' or sorted([44, 1, 67]) Out[34]: 'string1'
Пример использования конструкции if/elif/else#
Пример скрипта check_password.py, который проверяет длину пароля и есть ли в пароле имя пользователя:
# -*- coding: utf-8 -*- username = input('Введите имя пользователя: ') password = input('Введите пароль: ') if len(password) 8: print('Пароль слишком короткий') elif username in password: print('Пароль содержит имя пользователя') else: print('Пароль для пользователя <> установлен'.format(username))
$ python check_password.py Введите имя пользователя: nata Введите пароль: nata1234 Пароль содержит имя пользователя $ python check_password.py Введите имя пользователя: nata Введите пароль: 123nata123 Пароль содержит имя пользователя $ python check_password.py Введите имя пользователя: nata Введите пароль: 1234 Пароль слишком короткий $ python check_password.py Введите имя пользователя: nata Введите пароль: 123456789 Пароль для пользователя nata установлен
Тернарное выражение (Ternary expression)#
Иногда удобнее использовать тернарный оператор, нежели развернутую форму:
s = [1, 2, 3, 4] result = True if len(s) > 5 else False
Этим лучше не злоупотреблять, но в простых выражениях такая запись может быть полезной.
Условия (ветвления 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 заявления проверяет состояние. Если он имеет значение 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
Эта функция удалена на 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 .