Урок 4. Выбираем с помощью оператора if

Строки if и else в Python выступают операторами, которые проверяют, является ли значение выражения равным True.

Урок 4. Выбираем с помощью оператора if

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

В большинстве языков программирования такие символы, как фигурные скобки ({ и }) и ключевые слова (например, begin и end), применяются для разбивки кода на разделы. В этих языках хорошим тоном является использование отбивки пробелами с целью сделать программу более легкочитаемой для себя и других. Существуют даже специальные инструменты, которые помогают красиво выстраивать код.

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

Наши первые примеры кода состояли из одной строки. А теперь посмотрим, как создавать комментарии и команды длиной несколько строк.

Комментируем с помощью символа #

Комментарий — это фрагмент текста в вашей программе, который будет проигнорирован интерпретатором Python. Вы можете использовать комментарии, чтобы давать пояснение кода, делать какие-то пометки для себя или для чего-либо еще. Комментарий помечается символом #: все, что после # и до конца текущей строки, является комментарием. Обычно комментарий располагается на отдельной строке, как показано здесь:

>>> # 60 с/мин * 60 мин/ч * 24 ч/день
>>> seconds_per_day = 86400

Или на той же строке, что и код, который нужно пояснить:

>>> seconds_per_day = 86400 # 60 с/мин * 60 мин/ч * 24 ч/день

Символ # имеет много имен: хеш, шарп, фунт или устрашающее октоторп. Как бы вы его ни назвали, эффект # действует только до конца строки, на которой он располагается.

Python не дает возможности написать многострочный комментарий. Каждую строку или раздел комментария следует начинать с символа #:

>>> # Я могу сказать здесь все, даже если Python это не нравится,
... # поскольку я защищен крутым
... # октоторпом.
...
>>>

Однако если октоторп находится внутри текстовой строки, он становится простым символом #:

>>> print("No comment: quotes make the # harmless.")
No comment: quotes make the # harmless.

Продлеваем строки с помощью символа \

Любая программа становится более удобочитаемой, если ее строки сравнительно короткие. Рекомендуемая (но не обязательная) максимальная длина строки равна 80 символам. Если вы не можете выразить свою мысль в рамках 80 символов, воспользуйтесь символом продолжения\ — просто поместите его в конце строки, и дальше Python будет действовать так, как будто это все та же строка.

Например, если бы я хотел создать длинную строку из нескольких коротких, я мог бы сделать это пошагово:

>>> sum = 0
>>> sum += 1
>>> sum += 2
>>> sum += 3
>>> sum += 4
>>> sum
10

Но мог бы сделать и в одно действие, используя символ продолжения:

>>> sum = 1 + \
...       2 + \
...       3 + \
...       4
>>> sum
10

Если мы оставим обратный слеш в середине выражения, будет сгенерировано исключение:

>>> sum = 1 +
File "<stdin>", line 1
sum = 1 +
^
SyntaxError: invalid syntax

Есть небольшая хитрость: если использовать парные круглые (а также квадратные или фигурные) скобки, Python не будет жаловаться на некорректное окончание строк:

>>> sum = (
...     1 +
...     2 +
...     3 +
...     4)
>>>
>>> sum
10

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

Сравниваем с помощью операторов if, elif и else

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

>>> disaster = True
>>> if disaster:
...     print("Woe!")
... else:
...     print("Whee!")
...
Woe!
>>>

Строки if и else в Python выступают операторами, которые проверяют, является ли значение выражения (в данном случае переменной disaster) равным True. Помните, print() — это встроенная в Python функция для вывода информации, как правило, на экран.

Если ранее вы работали с другими языками программирования, обратите внимание на то, что здесь при проверке if ставить скобки не нужно. Например, не надо писать что-то вроде if (disaster == True). В конце строки следует поставить двоеточие (:). Если вы, как иногда и я, забудете поставить двоеточие, Python выведет сообщение об ошибке.

Каждая строка print() имеет отступ под соответствующей проверкой. Я использовал отступ в четыре пробела для того, чтобы выделять подразделы. Вы можете использовать любое количество пробелов, однако Python ожидает, что внутри одного раздела будет применяться одинаковое количество пробелов. Рекомендованный стиль — PEP-8 (http://bit.ly/pep-8) — предписывает использовать четыре пробела. Не применяйте табуляцию или сочетание табуляций и пробелов — это мешает считать отступы.

Все выполненные в этом примере действия позже я объясню более детально.

• Булево значение True присваивается переменной disaster.

• Производится условное сравнение при помощи операторов if и else с выполнением разных фрагментов кода в зависимости от значений переменной disaster.

Вызывается функцияprint() для вывода текста на экран.

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

>>> furry = True
>>> large = True
>>> if furry:
...     if large:
...         print("It's a yeti.")
...     else:
...         print("It's a cat!")
... else:
...     if large:
...         print("It's a whale!")
...     else:
...         print("It's a human. Or a hairless cat.")
...
It's a yeti.

В Python отступы определяют, какие разделы if и else объединены в пару. Наша первая проверка обращалась к переменной furry. Поскольку ее значение равно True, Python переходит к выделенной таким же количеством пробелов проверке iflarge. Поскольку мы указали значение переменной large равным True, проверка вернет результат True, а следующая строка else будет проигнорирована. Это заставит Python запустить строку, размещенную под конструкцией iflarge, и вывести на экран строку It'sayeti.

Если нужно проверить больше двух вариантов, используйте оператор if для первого варианта, elif (это значит elseif — «иначе если») для промежуточных и else для последнего:

>>> color = "mauve"
>>> if color == "red":
...     print("It's a tomato")
... elif color == "green":
...     print("It's a green pepper")
... elif color == "bee purple":
...     print("I don't know what it is, but only bees can see it")
... else:
...     print("I've never heard of the color", color)
...
I've never heard of the color mauve

В предыдущем примере мы проверяли равенство с помощью оператора ==. В Python используются следующие операторы сравнения:

• равенство (==);

• неравенство (!=);

• меньше (<);

• меньше или равно (<=);

• больше (>);

• больше или равно (>=).

Эти операторы возвращают булевы значения True или False. Посмотрим на то, как они работают, но сначала присвоим значение переменной x:

>>> x = 7

Теперь выполним несколько проверок:

>>> x == 5
False
>>> x == 7
True
>>> 5 < x
True
>>> x < 10
True

Обратите внимание на то, что для проверки на равенство используются два знака «равно» (==). Помните, что один знак «равно» применяется для присваивания значения переменной.

Если нужно выполнить несколько сравнений одновременно, можно использовать логические (или булевы) операторыand, or и not для определения итогового логического результата.

Булевы операторы имеют более низкий приоритет по сравнению с фрагментами кода, которые они сравнивают. Это значит, что результаты фрагментов сначала вычисляются, а затем сравниваются. Поскольку в данном примере мы устанавливаем значение х равным 7, проверка 5<х возвращает значение True, проверка х<10 также возвращает True, поэтому наше выражение преобразуется в TrueandTrue:

>>> 5 < x and x < 10
True

Как указывается в подразделе «Приоритет операций» на с. 73, самый простой способ избежать путаницы — использовать круглые скобки:

>>> (5 < x) and (x < 10)
True

Рассмотрим некоторые другие проверки:

>>> 5 < x or x < 10
True
>>> 5 < x and x > 10
False
>>> 5 < x andnot x > 10
True

Если вы используете оператор and для того, чтобы объединить несколько проверок, Python позволит вам сделать следующее:

>>> 5 < x < 10
True

Это выражение аналогично проверкам 5<x и x<10. Вы также можете писать более длинные сравнения:

>>> 5 < x < 10 < 999
True

Что есть истина?

Что, если элемент, который мы проверяем, не является булевым? Чем Python считает True и False?

Значение false не обязательно должно быть явно логическим False. Например, к False приравниваются следующие значения:

• булева переменная False;

• значение None;

• целое число 0;

• число с плавающей точкой 0.0;

• пустая строка ('');

• пустой список ([]);

• пустой кортеж (());

• пустой словарь ({});

• пустое множество (set()).

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

>>> some_list = []
>>> if some_list:
...     print("There's something in here")
... else:
...     print("Hey, it's empty!")
...
Hey, it's empty!

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

if color == "red":

Python оценит выражение color=="red". В нашем примере мы присвоили переменной color значение "mauve", поэтому значение выражения color=="red" равно False и Python перейдет к следующей проверке:

elif color == "green":

Выполняем несколько сравнений с помощью оператора in

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

>>> letter = 'o'
>>> if letter == 'a' or letter == 'e' or letter == 'i' \
...     or letter == 'o' or letter == 'u':
...     print(letter, 'is a vowel')
... else:
...     print(letter, 'is not a vowel')
...
o is a vowel
>>>

Каждый раз, когда вам нужно выполнить множество подобных сравнений, разделенных ключевым словом or, используйте оператор членстваin. В следующем примере мы проверяем, является ли буква гласной, более «питонским» способом, используя строку, состоящую целиком из гласных:

>>> vowels = 'aeiou'
>>> letter = 'o'
>>> letter in vowels
True
>>> if letter in vowels:
...     print(letter, 'is a vowel')
...
o is a vowel

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

>>> letter = 'o'
>>> vowel_set = {'a', 'e', 'i', 'o', 'u'}
>>> letter in vowel_set
True
>>> vowel_list = ['a', 'e', 'i', 'o', 'u']
>>> letter in vowel_list
True
>>> vowel_tuple = ('a', 'e', 'i', 'o', 'u')
>>> letter in vowel_tuple
True
>>> vowel_dict = {'a': 'apple', 'e': 'elephant',
...               'i': 'impala', 'o': 'ocelot', 'u': 'unicorn'}
>>> letter in vowel_dict
True
>>> vowel_string = "aeiou"
>>> letter in vowel_string
True

В случае со словарем оператор in проверяет ключи (они находятся слева от двое­точия), а не значения.

Новое: I Am the Walrus

В Python 3.8 появился оператор-морж, который выглядит следующим образом:

имя := выражение

Заметили моржа? (Он похож на смайлик с бивнями.)

Как правило, для присваивания и проверки нужно выполнить два шага:

>>> tweet_limit = 280
>>> tweet_string = "Blah" * 50
>>> diff = tweet_limit - len(tweet_string)
>>> if diff >= 0:
...     print("A fitting tweet")
... else:
...     print("Went over by", abs(diff))
...
A fitting tweet

С помощью новой силы клыков (операторов присваивания) мы можем два шага объединить в один:

>>> tweet_limit = 280
>>> tweet_string = "Blah" * 50
>>> if diff := tweet_limit - len(tweet_string) >= 0;
...     print("A fitting tweet")
... else:
...     print("Went over by", abs(diff))
...
A fitting tweet

Оператор-морж также может использоваться в циклах for и while, которые мы рассмотрим в уроке 6.

Упражнения

4.1. Выберите число от 1 до 10 и присвойте его переменной secret. Выберите еще одно число от 1 до 10 и присвойте его переменной guess. Далее напишите условные проверки (if, else и elif), чтобы вывести строку 'слишком маленький', если значение переменной guess меньше 7, 'слишком большой', если оно больше 7, и 'равный', если равно secret.

4.2. Даны два числа, a и b(реализуй через функцию input()). Если оба числа положительны, то вывести “Оба положительны”, если a положительно, а b отрицательно, то вывести “Первое положительно”, иначе (если оба числа не положительны) вывести “Неположительны”.