- Встроенная документация
- REPL и примеры кода в источниках
- Каноническое представление и вывод на печать
- REPL и None
- Ввод многострочного кода
- Подключение модулей в REPL
- REPL — удобный калькулятор
Python поставляется со встроенным REPL – это программа, которая работает как командная оболочка. Программу REPL еще называют интерактивным интерпретатором Python. Эта программа предназначена для ввода и выполнения кода на языке Python.
Сокращение REPL расшифровывается так:
- Read — прочитать ввод от пользователя
- Eval — выполнить введенный код
- Print — распечатать на экран результат
- Loop — снова войти в режим ожидания
Для запуска REPL достаточно набрать python3
. После этого можно выполнять код на Python и смотреть на результат его выполнения. REPL выводит результат выполнения операции прямо на экран и снова входит в режим ожидания ввода команд.
Такой способ работы хорошо подходит для отладки, простых вычислений и быстрой проверки гипотез в духе «А как работает эта штука?».
Посмотрим на пример работы с REPL:
Для выхода из REPL нужно нажать Ctrl + D.
Встроенная документация
Язык Python прямо на уровне синтаксиса поддерживает дополнение кода документацией. Основное средство документирования — это строки документации или docstrings.
Документированная функция выглядит так:
def add(x, y):
"""Add one argument to another"""
return x + y
Из таких строк генерируется online-документация. А еще эта документация доступна для просмотра прямо в REPL. Для просмотра документации служит функция help
.
Давайте объявим функцию add
в REPL, попробуем ее вызвать, а затем посмотрим описание нашей функции:
Функция help
работает и в интерактивном режиме. Ее можно вызвать без аргументов с помощью команды help()
— в таком случае вы увидите страницу приветствия, а приглашение в строке ввода изменится на help>
. Страница приглашения показывает, какие команды можно вводить. Для выхода из режима справки нужно дать команду quit
или нажать Ctrl+D.
Новичкам может быть полезна команда topics
. Она выводит список тем, по которым можно почитать статьи прямо в этом же режиме справки REPL.
Войдем в режим справки и выведем список тем. Затем откроем статью, которая рассказывает об операторах языка Python:
REPL и примеры кода в источниках
REPL настолько широко используется, что в самых разных источниках можно встретить примеры, изображающие кусочек диалога программиста и REPL. Выглядит это примерно так:
>>> 1 + 2
3
>>> len("Thomas")
6
>>> "Hello" + '\n' + "World!"
'Hello\nWorld!'
>>> print("Hello" + '\n' + "World!")
Hello
World!
Обратите внимание на разные начала строчек:
- Строки с
>>>
— это код, введенный программистом. Сам символ>>>
называется приглашением - Строки без
>>>
— это результат выполнения введенного кода
Если вы решите попробовать это самостоятельно, не вводите само приглашение — достаточно ввести только сам код, следующий за символами >>>
.
Каноническое представление и вывод на печать
На примерах выше видно, что при вводе строка отображается в выводе интерпретатора с кавычками и со спецсимволами. Числа выводятся как числа. То же самое касается вывода любых других значений.
Большинство значений выводится в виде канонического строкового представления. Представленные таким образом значения можно скопировать в строку приглашения и выполнить опять. Каноническое представление обычно считается правильным кодом на Python.
Кстати, самостоятельно получить каноническое представление произвольного значения можно с помощью функции repr
. Посмотрим, как это работает:
>>> repr(42)
'42'
>>> repr("foo")
'"foo"'
>>> repr(None)
'None'
Обратите внимание, что результат вызова функции print
не содержит кавычек и спецсимволов. Так происходит потому, что мы видим результат вывода строки на печать.
REPL и None
Еще вам стоит знать, как REPL отображает возврат из функции значения None
.
Правильный ответ — никак, и это сделано специально. Если функция не возвращает результат явно, считается, что она возвращает None
. И чтобы не загромождать вывод REPL бесконечными None, авторы интерпретатора решили подавлять вывод этого значения.
Именно поэтому в примере выше REPL мы не увидели, что функция print
на самом деле вернула None
.
Но мы все таки можем увидеть в REPL None
. Для этого надо обернуть вызов print
в еще один вызов print
:
>>> print(42)
42
>>> print(print(42))
42
None
Теперь мы видим это значение, потому что второй print
получает None
на вход и приводит к строке, а уже строку — печатает.
В работе вы можете столкнуться с ситуацией, когда функция в REPL вызывается, но ничего не возвращает. В этом нет ничего страшного: возможно, ваша функция всего лишь возвращает None
.
Ввод многострочного кода
В Python 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. Чтобы воспользоваться ими, нужно импортировать необходимый модуль или функцию:
>>> import operator
>>> from math import sqrt
>>> operator.pow(2, 5)
32
>>> sqrt(64)
8.0
REPL — удобный калькулятор
Python REPL удобно использовать даже в роли обычного калькулятора. Разница только в том, что REPL не запоминает промежуточный результат. Чтобы это исправить, мы можем использовать для хранения промежуточных результатов переменную:
>>> result = 42 * 7
>>> result = result - 1
>>> result = result // 2
>>> result
146
Обратите внимание, что присваивание не приводит к выводу каких-либо значений. Встроенные инструкции (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 в модули.
Самостоятельная работа
- Вычислите в REPL значение выражения
sqrt(256) + 100
и выведите его на экран, используя функциюprint
. Функцияsqrt
определена в модулеmath
, так что ее нужно будет предварительно импортировать - Запишите вычисление и вывод выражения в файл
- Запустите этот файл с помощью
python3
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.