§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, так и запуск программ в файлах.
Выводы
Python — это не только змея, но и язык программирования. С ним мы и будем работать в этой главе.
В Python есть типы данных, чтобы отличать числа от строк от других вещей. У каждого типа данных есть свой формат и стандартное представление. Значение любых данных можно присваивать переменным.
Функции в программировании принципиально похожи на математические. Результат работы функции называют её возвращаемым значением. Функции, которые ничего не возвращают, называют процедурами.
Сохраняя программы в файлы, мы можем легко запускать их много раз.