В двух предыдущих разделах было показано, как IPython позволяет вам эффективно и интерактивно использовать и изучать Python. Здесь мы начнем обсуждать некоторые из улучшений, которые IPython добавляет поверх обычного синтаксиса Python. Они известны в IPython как магические команды и предваряются %
символом. Эти магические команды предназначены для краткого решения различных распространенных проблем при стандартном анализе данных. Магические команды бывают двух видов: магия строк, которые обозначаются одним %
префиксом и работают с одной строкой ввода, и магия ячеек, которые обозначаются двойным %%
префикс и работать с несколькими строками ввода. Мы продемонстрируем и обсудим здесь несколько кратких примеров и вернемся к более сфокусированному обсуждению нескольких полезных магических команд позже в этой главе.
Вставка блоков кода: %paste
и %cpaste
При работе в интерпретаторе IPython одна распространенная ошибка заключается в том, что вставка многострочных блоков кода может привести к неожиданным ошибкам, особенно при использовании отступов и маркеров интерпретатора. Распространенным случаем является то, что вы находите какой-то пример кода на веб-сайте и хотите вставить его в свой интерпретатор. Рассмотрим следующую простую функцию:
>>> def donothing(x):
... return x
Код отформатирован так, как он будет отображаться в интерпретаторе Python, и если вы скопируете и вставите его непосредственно в IPython, вы получите сообщение об ошибке:
In [2]: >>> def donothing(x):
...: ... return x
...:
File "<ipython-input-20-5a66c8964687>", line 2
... return x
^
SyntaxError: invalid syntax
При прямой вставке интерпретатор сбивается с толку из-за дополнительных символов подсказки. Но никогда не бойся – %paste
Волшебная функция IPython предназначена для обработки именно этого типа многострочного ввода с разметкой:
In [3]: %paste
>>> def donothing(x):
... return x
## -- End pasted text --
%paste
Команда одновременно вводит и выполняет код, так что теперь функция готова к использованию:
In [4]: donothing(10)
Out[4]: 10
Команда с аналогичным намерением %cpaste
открывает интерактивное многострочное приглашение , в которое вы можете вставить один или несколько фрагментов кода, которые будут выполняться в пакетном режиме:
In [5]: %cpaste
Pasting code; enter '--' alone on the line to stop or use Ctrl-D.
:>>> def donothing(x):
:... return x
:--
Эти волшебные команды, как и другие, которые мы увидим, предоставляют функциональность, которая была бы трудной или невозможной в стандартном интерпретаторе Python.
Запуск Внешнего Кода: %run
Когда вы начнете разрабатывать более обширный код, вы, скорее всего, обнаружите, что работаете как в IPython для интерактивного исследования, так и в текстовом редакторе для хранения кода, который вы хотите повторно использовать. Вместо того, чтобы запускать этот код в новом окне, может быть удобно запустить его в рамках сеанса IPython. Это можно сделать с %run
помощью магии.
Например, представьте, что вы создали myscript.py
файл со следующим содержимым:
#-------------------------------------
# file: myscript.py
def square(x):
"""square a number"""
return x ** 2
for N in range(1, 4):
print(N, "squared is", square(N))
Вы можете выполнить это из своего сеанса IPython следующим образом:
In [6]: %run myscript.py
1 squared is 1
2 squared is 4
3 squared is 9
Обратите также внимание, что после запуска этого сценария все функции, определенные в нем, будут доступны для использования в вашем сеансе IPython:
In [7]: square(5)
Out[7]: 25
Существует несколько вариантов точной настройки того, как выполняется ваш код; вы можете просмотреть документацию обычным способом, введя %run?
интерпретатор IPython.
Время Выполнения Кода: %timeit
Другим примером полезной магической функции является %timeit
функция , которая автоматически определяет время выполнения однострочного оператора Python, следующего за ним. Например, мы можем захотеть проверить эффективность понимания списка:
In [8]: %timeit L = [n ** 2 for n in range(1000)]
1000 loops, best of 3: 325 µs per loop
Преимущество %timeit
заключается в том, что для коротких команд он автоматически выполняет несколько запусков для достижения более надежных результатов. Для многострочных операторов добавление второго %
знака превратит это в магию ячеек, которая может обрабатывать несколько строк ввода. Например, вот эквивалентная конструкция с a for
-петлей:
In [9]: %%timeit
...: L = []
...: for n in range(1000):
...: L.append(n ** 2)
...:
1000 loops, best of 3: 373 µs per loop
Мы сразу видим, что понимание списка в данном случае происходит примерно на 10% быстрее, чем при построении эквивалентного for
цикла. Мы рассмотрим %timeit
и другие подходы к коду синхронизации и профилирования в разделе Профилирование и код синхронизации.
Справка по магическим функциям: ?
, %magic
, и %lsmagic
Как и обычные функции Python, функции IPython magic имеют строки документов, и доступ к этой полезной документации можно получить стандартным способом. Так, например, чтобы прочитать документацию по %timeit
магии, просто введите это:
In [10]: %timeit?
Аналогичным образом можно получить доступ к документации для других функций. Чтобы получить доступ к общему описанию доступных магических функций, включая некоторые примеры, вы можете ввести это:
In [11]: %magic
Для быстрого и простого списка всех доступных магических функций введите это:
In [12]: %lsmagic
Наконец, я упомяну, что при желании довольно просто определить свои собственные магические функции. Мы не будем обсуждать это здесь, но если вам интересно, посмотрите ссылки, перечисленные в Других ресурсах IPython.