Знакомсьво с REPL

Python поставляется со встроенным REPL. REPL – это программа, которая по сути выполняет код python в интерактивном режиме. . Акроним REPL расшифровывается так:

Для запуска 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