О, если ты спокоен, не растерян,
Когда теряют головы вокруг…
Редьярд Киплинг. Если
В предыдущих главах вам встречались самые разные данные, но с ними вы практически не работали. В большинстве примеров использовался интерактивный интерпретатор, а сами они были достаточно короткими. Теперь вы увидите, как структурировать код 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 вы также увидите, как парные тройные кавычки позволяют создавать многострочные выражения.
И вот мы готовы сделать первый шаг к структурам кода, которые вводят данные в программы. В качестве первого примера рассмотрим небольшую программу, которая проверяет значение булевой переменной 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 () — предписывает использовать четыре пробела. Не применяйте табуляцию или сочетание табуляций и пробелов — это мешает считать отступы.
Все выполненные в этом примере действия позже я объясню более детально.
• Булево значение 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":
Предположим, что у вас есть буква и вы хотите узнать, является ли она гласной. Одним из вариантов решения может быть создание длинного утверждения 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 проверяет ключи (они находятся слева от двоеточия), а не значения.
В 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. — Примеч. пер.