Условный оператор и логические выражения

Условный оператор if

Для проверки истинности выражений в Python используется оператор if. Если условие истинно, то выполниться блок кода, который стоит после if. Если ложно, то тот, который после else.


In [1]:
print("Чему равно 2 * 2?")
a = int(input())
if a == 4:
    print("Правда")
else:
    print("Ложь")


Чему равно 2 * 2?
5
Ложь

Особенности синтаксиса:

  • После условия в if ставится :
  • После else ставится :
  • Принадлежащий if'у блок обозначается отступом в 4 пробела
  • Скобки вокруг условия не нужны

if переводиться с английского как если, а elseиначе

else можно пропускать. Тогда при ложном условии ничего не выполнится:


In [2]:
if 2 * 2 == 5:
    print("2 * 2 = 5")
    
# В выводе ничего нет

Блок кода внутри if или else может содержать сколько угодно кода, в том числе вложенные if:


In [3]:
if 10 > 5:
    print("1")
    print("2")
    if 5 < 4:
        print("3")
        print("4")
    else:
        print("5")
else:
    print("6")


1
2
5

По отступам очень удобно отслеживать, какой else к какому if относится. Если не ставить двоеточие или отступы, то программа будет выдавать ошибку и не запустится.


In [4]:
if 6 > 5
    print("Пропущено двоеточие!")


  File "<ipython-input-4-615a4bd4ed19>", line 1
    if 6 > 5
            ^
SyntaxError: invalid syntax

SyntaxError: invalid syntax = ОшибкаСинтаксиса: некорректный синтаксис


In [5]:
if 6 > 5:
print("Пропущен отступ!")


  File "<ipython-input-5-641a99981a4e>", line 2
    print("Пропущен отступ!")
        ^
IndentationError: expected an indented block

IndentationError: expected an indented block = ОшибкаОтступа: ожидался блок с отступом

Конструкция elif позволяет рассматривать множественные случаи без вложенных if ... else в ветке else.


In [6]:
x = 3
if x < 2:
    print("0 or 1")
else:
    if x < 4:
        print("2 or 3")
    else:
        print("4+")


2 or 3

Тот же код с использованием elif выглядит так:


In [7]:
x = 3
if x < 2:
    print("0 or 1")
elif x < 4:
    print("2 or 3")
else:
    print("4+")


2 or 3

Логический тип bool

Для обозначения истинности в Python есть логический типbool. У него есть 2 возможных значения: True (истина) и False (ложь).


In [8]:
if True:
    print("Ветка if")
else:
    print("Ветка else")


Ветка if

In [9]:
if False:
    print("Ветка if")
else:
    print("Ветка else")


Ветка else

Переменные также могут быть логического типа:


In [10]:
a = True
b = False
print(a, b)
if a:
    print("a =", a)
if b:
    print("b =", b)


True False
a = True

Понятно, что после if может стоять не только значение True или False. Посмотрим, что делает Python, если после if стоит нечто более странное?

Одни типы данных могут преобразовываться к другим, если это возможно (если Python позволяет). Такое преобразование называется преобразованием типов (или приведением типов).

Например, 0 преобразуется в False:


In [11]:
if 0:                     
    print("Ветка if")
else:
    print("Ветка else")


Ветка else

Любое другое число (в том числе и нецелое), отличное от 0 преобразуется в True:


In [12]:
if 3.5:
    print("Ветка if")
else:
    print("Ветка else")


Ветка if

In [13]:
if 0.0:
    print("Ветка if")
else:
    print("Ветка else")


Ветка else

In [14]:
if -1:
    print("Ветка if")
else:
    print("Ветка else")


Ветка if

Пустая строка "" преобразуется в False:


In [15]:
if "":
    print("Ветка if")
else:
    print("Ветка else")


Ветка else

Непустая строка — в True:


In [16]:
if "abc":
    print("Ветка if")
else:
    print("Ветка else")


Ветка if

Логические операции (<, ==, ...)

Посмотрим, как устроены логические операции и операции сравнения в Python.

Список основных операторов сравнения, которые вам понадобятся:

Действие Обозначение в Python Аналог в C++ Аналог в Pascal Приоритет
Равенство a == b a == b a = b 4
Неравенство a != b a != b a != b 4
Меньше a < b a < b a < b 4
Меньше либо равно a <= b a <= b a <= b 4
Больше a > b a > b a > b 4
Больше либо равно a >= b a >= b a >= b 4

Список основных логических операторов, которые вам понадобятся:

Действие Обозначение в Python Аналог в C++ Аналог в Pascal Приоритет
Логическое отрицание not a !a not a 5
Логическое и a and b a && b a and b 6
Логическое или a or b a &vert&vert b a or b 7

Примеры:


In [17]:
print(5 > 2)
print(not 5 > 2)


True
False

In [18]:
a = 5
b = 2
print(b == a)
print(b != a)


False
True

In [19]:
a = True
b = False
print(not b)
print(a and b)
print(a or b)


True
False
True

Логические выражения

Как и во многих других языках программирования, вы можете составлять большие выражения из True, False, булевых переменных, операций сравнения, логических операций и скобок (для изменения приоритета). Например:


In [20]:
a = 5
b = 2
print(True and a > 2)
print(False or b >= 2)

if a >= 2 and b >= 2:
    print("Обратите внимание, в if не нужны скобки вокруг условия")


True
True
Обратите внимание, в if не нужны скобки вокруг условия

In [21]:
x = 4
print(1 < x and x <= 6)


True

Вообще говоря, сравнения можно соединять в цепочки, например предыдущий пример можно переписать так:


In [22]:
x = 4
print(1 < x <= 6)


True

В таких случаях для читаемости кода полезно упорядочивать сравнения так, чтобы использовать только знаки < и <=.

Никогда не сравнивайте напрямую с True или False. Вместо этого используйте саму переменную или её отрицание. То же самое для сложных выражений.


In [23]:
bool_var = True
if bool_var == True:
    print("Ай-ай")

if bool_var:
    print("Так хорошо")
    
bool_var = False
if not bool_var:
    print("Так тоже хорошо")


Ай-ай
Так хорошо
Так тоже хорошо

Конечно, в условии после if чаще всего приходится использовать логические операции. В качестве примера, давайте напишем программу, проверяющую является ли данный год високосным:


In [24]:
year = int(input())

if (year % 4 == 0 and year % 100 != 0) or year % 400 == 0:
    print("YES")
else:
    print("NO")


2018
NO