Книга: Как устроен Python. Гид для разработчиков, программистов и интересующихся
Назад: 12. Комментарии, логические значения и None
Дальше: 14. Контейнеры: списки, кортежи и множества

13. Условия и отступы

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

Кроме логических литералов True и False для получения логических значений в Python также можно использовать выражения. Если у вас имеется два числа, вы можете сравнить их и проверить, что первое больше второго, или наоборот. Эта задача решается операторами > и < соответственно:

>>> 5 > 9

False

В следующей таблице перечислены операторы сравнения для создания логических значений:

Оператор

Описание

>

Больше

<

Меньше

>=

Больше или равно

<=

Меньше или равно

==

Равно

!=

Не равно

is

Объекты тождественны

is not

Объекты не тождественны

Эти операции могут использоваться с большинством типов. А если вы создадите собственный класс, определяющий соответствующие специальные методы, то ваш класс тоже сможет использовать их:

>>> name = 'Matt'

>>> name == 'Matt'

True

>>> name != 'Fred'

True

>>> 1 > 3

False

ПРИМЕЧАНИЕ

Специальные методы сравнения __gt__, __lt__, __ge__, __le__, __eq__ и __ne__ соотносятся с >, <, >=, <=, == и != соответственно. Определять все эти методы довольно утомительно и однообразно. Для классов, в которых обычно используются эти сравнения, декоратор класса functools.total_ordering предоставит всю функциональность сравнений при условии определения методов __eq__ and __le__. Декоратор автоматически сгенерирует остальные методы сравнения. В противном случае необходимо реализовать все шесть методов:

>>> import functools

>>> @functools.total_ordering

... class Abs(object):

... def __init__(self, num):

... self.num = abs(num)

... def __eq__(self, other):

... return self.num == abs(other)

... def __lt__(self, other):

... return self.num < abs(other)

 

>>> five = Abs(-5)

>>> four = Abs(-4)

>>> five > four # Случай "меньше" не используется!

True

Декораторы считаются темой средней сложности. В книге начального уровня они не рассматриваются.

СОВЕТ

Операторы is и is not предназначены для сравнения тождественности (то есть того, что два объекта имеют одинаковые идентификаторы и фактически являются одним объектом (а не только имеют одинаковые значения)). Так как None является одиночным объектом и имеет только один идентификатор, is и is not могут использоваться с None:

>>> if name is None:

... # Инициализация name

 

13.1. Объединение условных выражений

Условные выражения могут объединяться логическими операторами and, or и not.

Логический оператор

Описание

x and y

Выражение истинно только в том случае, если истинны оба операнда

x or y

Выражение истинно, если истинным является хотя бы один из операндов

not x

Логическое отрицание x (True превращается в False, и наоборот)

В следующем простом примере оценка присваивания осуществляется на основании количества набранных баллов — выражение проверяет, лежит ли количество набранных баллов в заданном числовом диапазоне:

>>> score = 91

>>> if score > 90 and score <= 100:

... grade = 'A'

ПРИМЕЧАНИЕ

В таких случаях Python позволяет использовать диапазонную проверку:

>>> if 90 < score <=100:

... grade = 'A'

Работают оба стиля проверок, но в других языках программирования диапазонные проверки поддерживаются редко.

Следующий пример проверяет, входит ли имя name в заданную группу:

>>> name = 'Paul'

>>> beatle = False

>>> if name == 'George' or \

... name == 'Ringo' or \

... name == 'John' or \

... name == 'Paul':

... beatle = True

... else:

... beatle = False

ПРИМЕЧАНИЕ

В этом примере знак \ в конце строки 'George' or \ указывает, что команда продолжается на следующей строке. Как и во многих языках программирования, в Python условные выражения могут заключаться в круглые скобки. Так как в Python круглые скобки не являются обязательными, многие разработчики опускают их, если они не являются строго необходимыми для определения приоритета операторов. Однако у круглых скобок есть еще один нюанс: они подсказывают интерпретатору, что команда еще не завершена и будет продолжена в следующей строке. Это означает, что в следующем примере символ \ не нужен:

>>> name = 'Paul'

>>> beatle = False

>>> if (name == 'George' or

... name == 'Ringo' or

... name == 'John' or

... name == 'Paul'):

... beatle = True

... else:

... beatle = False

 

СОВЕТ

Ниже приведена версия проверки принадлежности, которая считается ­одной из базовых идиом Python. Чтобы проверить, входит ли значение в набор, объедините элементы набора в множество и воспользуйтесь оператором in:

>>> beatles = {'George', 'Ringo', 'John', 'Paul'}

>>> beatle = name in beatles

Множества более подробно рассматриваются в одной из последующих глав.

Пример использования ключевого слова not в условной команде:

>>> last_name = 'unknown'

>>> if name == 'Paul' and not beatle:

... last_name = 'Revere'

13.2. Команды if

Логические значения (True и False) часто используются в условных командах. Условная команда, по сути, означает: «если это условие истинно, выполнить блок кода, а если нет — выполнить другой код». Условные команды часто используются в Python. Иногда «команда if» проверяет значения, содержащие логические значения; в других случаях проверяются выражения, результат которых интерпретируется как логическое значение. Другая распространенная проверка связана с неявным преобразованием к «квазиистинным» или «квазиложным» значениям:

>>> debug = True

>>> if debug: # Проверка логического значения

... print("Debugging")

Debugging

13.3. Команды else

Команда else может использоваться в сочетании с командой if. Тело else выполняется только в том случае, если условие if дает результат False. Ниже приведен пример объединения команды else с if:

>>> score = 87

>>> if score >= 90:

... grade = 'A'

... else:

... grade = 'B'

Python вычисляет выражение score >= 90 и получает результат False. Так как условие if было ложным, выполняются команды блока else, а переменной grade присваивается значение 'B'.

13.4. Множественный выбор

Выбор далеко не всегда ограничивается двумя вариантами. При необходимости вы можете добавить промежуточные шаги при помощи ключевого слова elif (сокращение от «else if»). Ниже приведена схема выбора с несколькими вариантами:

>>> score = 87

>>> if score >= 90:

... grade = 'A'

... elif score >= 80:

... grade = 'B'

... elif score >= 70:

... grade = 'C'

... elif score >= 60:

... grade = 'D'

... else:

... grade = 'F'

Каждая из команд if, elif и else имеет собственный блок кода. Python начинает перебор сверху, пытаясь найти условие с результатом True. Обнаружив такое условие, Python выполняет блок, а затем переходит к выполнению кода, следующего за всеми блоками elif и else. Если ни одно из условий if и elif не дает результата True, выполняется блок команды else.

ПРИМЕЧАНИЕ

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

13.5. Пробелы

Возможно, вы обратили внимание на одну странность: за логическим выражением в команде if следует двоеточие (:). Строки, следующие непосредственно после команды if, снабжаются отступом из четырех пробелов. Строки с отступами образуют блок кода, который выполняется в том случае, если выражение if дает результат True.

В других языках команда if могла бы выглядеть так:

if (score >= 90) {

grade = 'A';

}

В таких языках границы блоков в командах if обозначаются фигурными скобками ({ }). Весь код между фигурными скобками выполняется в том случае, если значение score больше либо равно 90.

В отличие от таких языков, в Python для обозначения блоков используются два признака:

• двоеточие (:);

• отступы.

Если вы программировали на других языках, понять правила использования отступов в Python будет нетрудно. Все, что от вас потребуется, — заменить левую фигурную скобку ({) двоеточием (:) и последовательно применять отступы до конца блока.

СОВЕТ

Что считать «последовательным применением отступов»? Обычно для создания отступов в коде используются либо символы табуляции, либо пробелы. Интерпретатор Python обращает внимание только на единство стиля отступов на уровне файла. Проект может состоять из нескольких файлов, использующих разные схемы отступов, но это было бы глупо.

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

Если вы начнете смешивать табуляции с пробелами, исполняемый файл python3 сообщит об ошибке TabError.

13.6. Итоги

В этой главе рассматривается команда if. Эта команда может использоваться для создания сколь угодно сложных условий посредством объединения выражений операторами and, or и not.

Также в главе рассматривались блоки, отступы и табуляции/пробелы. При первом знакомстве с Python правило обязательных отступов может показаться досадной помехой. Я сталкивался с людьми, которые так считают, на своих учебных курсах. Но когда я их спрашивал, включают ли они отступы в код на других языках, они отвечали: «Конечно, так код лучше читается». В Python удобочитаемости кода уделяется большое внимание, и правило об отступах помогает в этом.

13.7. Упражнения

1. Напишите команду if, которая проверяет, является ли год, хранящийся в переменной, високосным. Правила определения високосных годов приведены в упражнениях главы 8.

2. Напишите команду if для проверки переменной, содержащей целое число, на четность.

3. Напишите команду if. Найдите блок с отступом и проверьте, какие символы использует ваш редактор при создании отступов — табуляции или пробелы. Если отступы создаются символами табуляции, настройте свой редактор, чтобы он использовал пробелы. В некоторых редакторах табуляции отображаются иначе; если в вашем редакторе они отображаются одинаково, для проверки можно подвести курсор к отступу. Если курсор переместится сразу на 4 или 8 символов, значит, редактор вставил символ табуляции.

Назад: 12. Комментарии, логические значения и None
Дальше: 14. Контейнеры: списки, кортежи и множества