Обучение с удовольствием
Python

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

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

В предыдущих занятиях вам встречались самые разные данные, но с ними вы практически не работали. В большинстве примеров использовался интерактивный интерпретатор, а сами они были достаточно короткими. Теперь вы увидите, как структурировать код 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

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

Сравниваем с помощью операторов 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 переходит к выделенной таким же количеством пробелов проверке if large. Поскольку мы указали значение переменной large равным True, проверка вернет результат True, а следующая строка else будет проигнорирована. Это заставит Python запустить строку, размещенную под конструкцией if large, и вывести на экран строку It's a yeti.

Если нужно проверить больше двух вариантов, используйте оператор if для первого варианта, elif (это значит else if — «иначе если») для промежуточных и 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, поэтому наше выражение преобразуется в True and True:

>>> 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 Walrus10

В 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, которые мы рассмотрим далее.

Упражнения

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

4.2. Присвойте значения True или False переменным small и green. Напишите несколько утверждений if/else, которые выведут на экран информацию о том, соответствуют ли заданным условиям следующие растения: вишня, горошек, арбуз, тыква.

УЧИМСЯ ВМЕСТЕ

Вопросы и обсуждение

Хороший вопрос — начало открытия

Обсуждение доступно участникам учебной группы.

Войдите, чтобы участвовать в обсуждении своей группы.