Книга: Простой Python. Современный стиль программирования. 2-е изд.
Назад: Глава 3. Числа
Дальше: Глава 5. Текстовые строки

Глава 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 функция для вывода информации, как правило, на экран.

108862.png

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

Каждая строка print() имеет отступ под соответствующей проверкой. Я использовал отступ в четыре пробела для того, чтобы выделять подразделы. Вы можете использовать любое количество пробелов, однако Python ожидает, что внутри одного раздела будет применяться одинаковое количество пробелов. Рекомендованный стиль — 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), чтобы вывести строку 'toolow', если значение переменной guess меньше 7, 'toohigh', если оно больше 7, и 'justright', если равно secret.

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

Название песни группы The Beatles. — Примеч. пер.

Назад: Глава 3. Числа
Дальше: Глава 5. Текстовые строки

dofermerdat
этот. породы кроликов с фотографиями мясныефермер ру форум рассадакрупнейшие сельскохозяйственные районы зарубежной европыкрс мясо