Знакомсьво с REPL
Python поставляется со встроенным REPL. REPL – это программа, которая по сути выполняет код python в интерактивном режиме. . Акроним REPL расшифровывается так:
- Read — прочитать ввод от пользователя,
- Eval — выполнить введённый код,
- Print — распечатать на экран результат,
- Loop — снова войти в режим ожидания.
Для запуска REPL достаточно набрать
python3:
Теперь наберите любой корректный код на Python, например такой:
>> 7 + 9 16 >>> 5 + 9 14 >>>
REPL выводит результат выполнения операции прямо на экран и снова входит в режим ожидания ввода команд. Для выхода из REPL нужно вместо ввода кода нажать Ctrl + D.
Встроенная документация
Язык Python на уровне синтаксиса поддерживает дополнение кода документацией. Основным средством документирования являются так называемые "строки документации" ("docstrings"). Документированная функция выглядит так:
def f(x):
"""Duble digit."""
return x + x
Из подобных docstrings создаётся online-документация,эта документация доступна для просмотра прямо в REPL.
Для просмотра документации необходимо объявить функцию help.
Давайте объявим нашу функцию f в REPL, а затем посмотрим описание нашей функции:
>>> def f(x):
... """duble digit."""
... d = x + x
... return d
...
>>> help (f)
Получим вывод:
Help on function f in module __main__:
f(x)
duble digit.
Функция help может работать и в интерактивном режиме:
если её вызвать без аргументов (help()), то будет показана страница приветствия
и приглашение в строке ввода изменится на help>.
Страница приглашения показывает, какие команды можно вводить, а
также упоминает, что для выхода из режима справки нужно дать команду quit
(нажатие Ctrl+D тоже сработает).
Очень полезна команда topics, она выводит список тем,
по которым можно почитать статьи прямо в этом же режиме справки REPL'а.
REPL и None
REPL не отображает возврат из функции значения None. Дело в том, что это сделано специально:
любая функция, которая не возвращает результат явно, считается функцией, возвращающей None.
И чтобы не "мозолить глаза" программисту бесконечными None в выводе REPL,
авторами интерпретатора было решено подавлять вывод этого значения.
Но мы всё же можем увидеть в REPL None, если обернём вызов print... в ещё один вызов print:
>>> print(42)
42
>>> print(print(42))
42
None
Если вы вдруг столкнётесь с ситуацией, когда ваша функция в REPL вызывается, но "ничего не возвращается" — не паникуйте!
Возможно ваша функция всего лишь возвращает None (скажем, потому, что вы забыли сделать return)!
Ввод многострочного кода
В 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 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