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

REPL

Python поставляется со встроенным REPL. REPL – это программа, которая работает как командная оболочка (программу REPL ещё называют интерактивным интерпретатором Python), предназначенная для ввода и выполнения кода на языке Python. Акроним REPL расшифровывается так:

  • Read — прочитать ввод от пользователя,
  • Eval — выполнить введённый код,
  • Print — распечатать на экран результат,
  • Loop — снова войти в режим ожидания.

Для запуска REPL достаточно набрать python3:

Теперь можно выполнять код на Python и сразу же смотреть на результат его выполнения. Наберите любой корректный код на Python, например такой:

REPL выводит результат выполнения операции прямо на экран и снова входит в режим ожидания ввода команд. Для выхода из REPL нужно вместо ввода кода нажать Ctrl + D.

Такой способ работы очень хорошо подходит для быстрой проверки гипотез "а как работает эта штука?", а также для отладки и простых вычислений. Пример работы с REPL:

Встроенная документация

Язык Python прямо на уровне синтаксиса поддерживает дополнение кода документацией. Основным средством документирования являются так называемые "строки документации" ("docstrings"). Документированная функция выглядит так:

def add(x, y):
    """Add one argument to another."""
    return x + y

Из таких docstrings генерируется online-документация. А ещё эта документация доступна для просмотра прямо в REPL! Для просмотра документации служит функция help. Давайте объявим функцию add в REPL, попробуем её вызвать, а затем посмотрим описание нашей функции и нескольких встроенных:

Даже просто быстро узнать, что делает та или иная функция — очень полезно. Но функция help может работать и в интерактивном режиме: если её вызвать без аргументов (help()), то будет показана страница приветствия и приглашение в строке ввода изменится на help>. Страница приглашения показывает, какие команды можно вводить, а также упоминает, что для выхода из режима справки нужно дать команду quit (нажатие Ctrl+D вместо ввода команды тоже сработает). Новичкам может быть полезна команда topics, выводящая список тем, по которым можно почитать статьи прямо в этом же режиме справки REPL'а. Войдём же в режим справки, выведем список тем, а затем откроем статью, которая рассказывает о доступных в языке Python операторах:

REPL и примеры кода в источниках.

REPL в Python-мире настолько широко используется, что в самых разных источниках — статьях, книгах, документации к библиотекам — можно встретить примеры, изображающие кусочек "диалога" программиста и REPL. Выглядит это примерно так:

>>> 1 + 2
3
>>> len("Thomas")
5
>>> "Hello" + '\n' + "World!"
'Hello\nWorld!'
>>> print("Hello" + '\n' + "World!")
Hello
World!

Здесь строчки, начинающиеся на >>> (эти символы называются "приглашением" ("prompt")) — это код, введённый программистом. А следующий за "вводом" текст до следующей строчки с приглашением, представляет собой результат выполнения введённого кода. Если вы решите попробовать указанный в таком виде пример самостоятельно, не вводите само приглашение, вводите только сам код, следующий за символами >>>. И строки вывода тоже вводить не нужно — тут уж интерпретатор сам справится!

Привыкайте к этому формату публикации примеров, в наших курсах он тоже будет использоваться широко!

Каноническое представление и вывод на печать

Заметьте, что при вводе строки, в выводе интерпретатора оная отображается с кавычками и со спецсимволами. Числа выводятся, как числа. То же самое касается вывода любых других значений: большинство значений выводится в виде "канонического строкового представления" ("canonical string representation"). Представленные таким образом значения, как правило, можно скопировать в строку приглашения и выполнить опять, т.е. каноническое представление обычно является правильным кодом на Python.

Кстати, самостоятельно получить каноническое представление произвольного значения можно с помощью функции repr. Примеры:

>>> repr(42)
'42'
>>> repr("foo")
'"foo"'
>>> repr(None)
'None'

А вот результат вызова функции print не содержит кавычек, и спецсимволы, вроде символа переноса строки, не отображаются (но эффект на вывод оказывают). Так происходит, как вы могли догадаться, потому, что мы видим результат вывода строки на печать.

REPL и None

Ещё вам стоит знать о том, как REPL отображает возврат из функции значения None. Дело в том, что никак! Это сделано специально: любая функция, которая не возвращает результат явно, считается функцией, возвращающей None. И чтобы не "мозолить глаза" программисту бесконечными None в выводе REPL, авторами интерпретатора было решено подавлять вывод этого значения. Именно поэтому в примере выше REPL мы не увидели, что функция print на самом деле вернула None! Но мы всё же можем увидеть в REPL None, если обернём вызов print... в ещё один вызов print:

>>> print(42)
42
>>> print(print(42))
42
None

Вот и оно, значение None! Мы видим это значение потому, что второй print получает None на вход и приводит к строке, а уже строку — печатает.

Если вы вдруг столкнётесь с ситуацией, когда ваша функция в REPL вызывается, но "ничего не возвращается" — не паникуйте! Возможно ваша функция всего лишь возвращает None (скажем, потому, что вы забыли сделать return)!

Ввод многострочного кода

В Python REPL можно вводить и многострочный код, а ведь не каждый REPL такое позволяет! И пусть отредактировать уже введённые строчки не получится, но, к примеру, небольшие функции вводить вполне удобно. Когда вы вводите строчку, которая по смыслу ещё не завершилась, то REPL меняет приглашение на ... и ожидает ввода новой строчки в дополнение к уже введённой. Так можно ввести целое определение функции вместе с docstring и логикой. Окончанием ввода всего многострочного кода служит пустая строчка (поэтому в коде не получится использовать пустые строчки). В источниках примеры с многострочным кодом будут выглядеть так:

>>> def is_positive(x):
...     """Return True if argument is positive."""
...     if x <= 0:
...          return False
...     return True
...
>>> is_positive(42)
True

REPL — удобный калькулятор

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

>>> result = 42 * 7
>>> result = result - 1
>>> result = result // 2
>>> result
146

Обратите внимание, присваивание не приводит к выводу каких-либо значений. Тогда как любая функция возвращает что-нибудь, пусть даже и None, встроенные инструкции (statements) никогда не возвращают значения (и поэтому, в частности, не могут быть частью выражений).

Использование переменных полезно, если промежуточные результаты нам понадобятся позже. Но если результат нужен только в следующем выражении, то можно использовать специальную переменную _, которая всегда хранит результат выполнения предыдущей команды:

>>> 42 * 7
294
>>> _ - 1
293
>>> _ // 2
146
>>> _
146

Вот теперь уже больше похоже на работу привычного калькулятора: промежуточные результаты и сохраняются и выводятся на экран после каждого действия!

Более того, переменная _ сохраняет последний успешно полученный результат. Если при выполнении какой-то строчки кода произошла ошибка, то предыдущий результат не будет потерян! Также результат не теряется, если вы вводите инструкции (statements). Это удобно, к примеру, когда вы хотите сохранить текущее значение в переменную. Вот пример, который демонстрирует устойчивость к ошибкам и сохранение результата во время выполнения инструкций.

>>> 42
42
>>> _ // 0
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ZeroDivisionError: integer division or modulo by zero
>>> _ // 6
7
>>> a = _
>>> _ + 20
27
>>> a
7

Важно: специальная переменная _ доступна только в REPL, в коде программ такая переменная может быть объявлена, но работать она будет, как любая другая. Помните об этом, когда будете переносить код из REPL в модули.

Мы учим программированию с нуля до стажировки и работы. Попробуйте наш бесплатный курс «Введение в программирование» или полные программы обучения по Node, PHP, Python и Java.

Хекслет

Подробнее о том, почему наше обучение работает →