§6.2. Знакомьтесь, змея

Python — простой и расширяемый язык программирования. Код на этом языке легко читать, писать и запускать. Убедитесь в этом сами: запустите Python и скажите ему print('Hello, world!'). Поздравляем, вы только что прочитали, написали и запустили программу. Теперь давайте поговорим об устройстве программ посложнее и об удобных способах их писать и запускать.

Поле эксперимента

Место, в котором вы оказываетесь, когда запускаете Python, называется REPL (англ. read, eval, print, loop — «прочитай, вычисли, выведи на экран, повтори»). Принцип его работы целиком содержится в его названии — он ожидает пользовательский ввод, обрабатывает его, отображает результат и снова ожидает пользовательский ввод. REPL — неплохая среда, в которой можно экспериментировать и изучать язык, а также быстро что-нибудь считать, ведь Python — отличный калькулятор.

Но пользоваться REPL в чистом виде мы не будем. Есть программа IPython, которую можно установить через pip: pip3 install ipython — она гораздо удобнее, а ещё в ней есть подсветка синтаксиса, которая помогает искать ошибки в коде глазами. Чтобы запустить IPython, используйте команду ipython3.

Принципиально IPython ничем не отличается от обычного REPL, но в нём, например, есть очень удобная справка: чтобы узнать, что делает и как работает, скажем, print(), достаточно приписать к нему знак вопроса:

Данные и типы

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

ТипОписаниеПримеры
intЦелое число42, -0x5d0
floatДробное число1.43
boolБулева переменнаяTrue, False
strТекстовая строка"頭のトラブル", '1 мая'

Ввести данные в Python просто:

In [1]: 1234
Out[1]: 1234

REPL нас понял и ответил нам тем же самым числом. Заметьте, что это не простое повторение. Если ввести число в шестнадцатеричном виде, язык ответит нам его десятичным представлением:

In [2]: 0x4d2
Out[2]: 1234

Этот трюк позволяет легко преобразовывать любые, даже самые огромные числа в понятный вид. К слову, числа можно вводить не только в этих двух системах счисления, но также в двоичной, 0b1000101, и восьмеричной, 0o105.

Текстовые строки при вводе обязательно заключаются в двойные или одинарные кавчки. Важно понимать, что даже если строка и состоит из числа, это всё ещё строка, а не число:

In [3]: "5" + 5
# TypeError: can only concatenate str (not "int") to str

Другое дело, что строки можно «складывать» друг с другом: оператор + в таком случае будет отвечать за конкатена́цию (так в программировании называют соединение двух строк):

In [4]: "Привет, " + "мир"
Out[4]: 'Привет, мир'

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

In [5]: year = 2020

In [6]: year
Out[6]: 2020

In [7]: year = year + 5

In [8]: year
Out[8]: 2025

Функции

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

  • f(x) = x²

В Python определение данной функции выглядит так:

def f(x):
    return x * x

Разберёмся с этой записью. Любое определение начинается с def (англ. definition — определение), после чего следует название функции, f, и аргументы. Двоеточие. Новая строка. Следом идёт тело функции — код, который будет исполнен, когда функцию вызовут. Он может состоять из нескольких строчек, каждая из которых должна начинаться с отступа (4 пробела, в IPython вводятся клавишой Tab). Тело обычно заканчивается особым словом return, после которого идёт возвращаемое значение. Фух.

Определив функцию, мы можем её вызывать:

In [9]: def f(x):
...:     return x * x
...:

In [10]: f(2)
Out[10]: 4

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

f(2):
    return 2 * 2

Вычислить такое выражение уже не проблема. Попробуйте теперь самостоятельно определить функцию g(x) = x + 2.

Функции очень похожи на процедуры. Так вот, на самом деле, процедуры — это просто функции, которые ничего не возвращают. Да, так можно, а иногда даже нужно. Вспомните print() из начала параграфа. Этой процедуре нечего возвращать, её работа — выводить данные на экран.

Полноценные программы

Нередко бывает такое, что мы используем одну и ту же программу несколько раз. Было бы неудобно каждый раз набирать её исходный код в IPython, чтобы она выполнилась. Для этого программу сохранить, а потом вызвать из терминала.

Python — интерпретируемый язык программирования. Это означает, что в результате мы не получим .exe-файл для Windows или исполняемый файл для Linux. Вместо этого мы будем запускать непосредственно файл с кодом программы. Для его исполнения на компьютере должен быть установлен интерпретатор Python.

Давайте попробуем написать простую программу. Создадим файл hello.py и откроем его в текстовом редакторе. В нём мы можем писать тот же код, что и в IPython, однако результат мы узнаем только после запуска всей программы целиком.

В отличие от IPython, где мы можем присвоить переменной нужное значение, в программах должен быть какой-то способ получить данные от пользователя, чтобы программу можно было как-то настроить. Для этого используется функция input():

name = input()

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

greeting = "Привет, " + name

Наконец, получим наше приветствие:

greeting

Сохраним этот файл и попробуем его запустить. Для этого перейдём в терминале в директорию с программой и выполним команду python3 hello.py. На первый взгляд кажется, что всё зависло. Но на самом деле программа ожидает нашего ввода — мы же спрашиваем у пользователя его имя. Введём своё имя и нажмем Enter:

Ничего не произошло. Почему же? Дело в том, что программы сильно отличаются от REPL — пользователю не выводится результат каждого вычисления. Он видит только то, что было явно напечатано разработчиком. Для этого используется уже знакомая нам функция print(). Заменим третью строчку на print(greeting) и попробуем снова:

Теперь наша программа работает. На практике бывает удобно комбинировать как использование IPython, так и запуск программ в файлах.

Выводы

  1. Python — это не только змея, но и язык программирования. С ним мы и будем работать в этой главе.

  2. В Python есть типы данных, чтобы отличать числа от строк от других вещей. У каждого типа данных есть свой формат и стандартное представление. Значение любых данных можно присваивать переменным.

  3. Функции в программировании принципиально похожи на математические. Результат работы функции называют её возвращаемым значением. Функции, которые ничего не возвращают, называют процедурами.

  4. Сохраняя программы в файлы, мы можем легко запускать их много раз.

§6.3. Работаем с данными ⟶