Реализация полезных магических команд IPython в Jupyter Notebook
Python не только самый универсальный язык программирования, но и самый гибкий, когда речь заходит об интеграции новых функций. Магические команды являются одной из таких важных функций, добавленных в стандартную оболочку Python.
Что же такое магические команды Python?
Магические команды — это улучшения, добавляемые поверх обычного кода на Python, их предоставляет ядро IPython.
Эти команды обычно начинаются с символа “%”
Магические команды были преимущественно добавлены для решения распространенных проблем, с которыми сталкиваются пользователи. Также в командной оболочке IPython есть несколько сочетаний горячих клавиш, которые значительно облегчат вам работу.
Существует 2 типа магических команд: строчные, обозначенные одним символом %, и ячеечные, обозначенные двойным символом % %.
Префикс % означает, что команда работает на одной строке кода, в то время как префикс %% позволяет команде работать над всей ячейкой.
Ниже приведен список магических команд и примеры их использования в блокнотах Jupyter.
Где и как достать исходный код Майнкрафта | Под капотом
Выполнение внешнего кода
Любой внешний код Python из блокнота Jupyter можно запускать с помощью команды %run.
Файл myCode.py на изображении выше содержит простой скрипт, который выводит предложение “The world makes sense!».
Если мы введем команду %run, а после нее зададим имя файла, она выполнит код, который содержится в указанном файле.
Примечание: %run также позволяет выполнять код из других блокнотов Jupyter.
Время работы кода
Вы никогда не задумывались, сколько именно времени занимает работа кода в рамках одной ячейки?
Магическая команда time позволяет получить всю необходимую информацию о времени.
Поскольку здесь мы будем иметь дело со всей ячейкой, мы будем использовать %% в качестве префикса перед ключевым словом time.
Ячейка на примере выше включает в себя цикл for со случайным вычислением. %%time помогает узнать время, необходимое для перебора в цикле for.
Копирование содержимого во внешний файл
В большинстве случаев возникает необходимость скопировать содержимое вашей ячейки в скрипт python или текстовый файл непосредственно из вашего блокнота Jupyter.
Вместо того чтобы копировать все и создавать новый файл, вы можете напрямую экспортировать свои данные, добавив команду writefile в ячейку перед кодом.
Обратите внимание на двойной % перед командой, который говорит о том, что будет экспортировано содержимое всей ячейки.
Поскольку у меня уже был создан файл с некоторым кодом, этот код выводит «Overwriting myCode.py» (Перезапись файла). Это говорит о том, что исходное содержимое будет заменено кодом, показанным на изображении выше.
Просмотр содержимого внешнего файла
Часто вам может понадобиться скопировать в свой код несколько строк кода из внешнего файла. Команда %pycat избавит вас от долгой процедуры извлечения определенных данных из файла и их копирования в другой файл. Она позволяет просматривать содержимое любого файла в любом каталоге.
СОЗДАЛ МАЙНКРАФТ НА PYTHON!
Содержимое внешнего файла отображается в качестве его выходных данных. С точки зрения функционирования этой магической команды получается, что это %writefile, только наоборот.
Держись крепче! Впереди еще много удивительного «волшебства».
Список всех переменных
Эта магическая команда выдает список всех глобальных переменных, используемых в вашем блокноте.
Ниже приведены 3 переменные — 2 строки и 1 целое число. Если мы используем %who, она перечислит все 3 переменные, которые мы задали.
a = “hello”
b = “Good Morning”
c = 1
Приведенный выше код отображает все переменные независимо от их типа.
Для того чтобы получить переменные определенного типа, мы должны указать этот тип после магической команды. Приведенный выше код отображает все переменные строкового типа в качестве выходных данных.
Обмен переменными между блокнотами
Эта волшебная команда позволяет вам хранить любую переменную и использовать ее в различных блокнотах Jupyter.
Чтобы извлечь переменную, вам нужно ввести ту же команду с параметром ‘-r’.
Вот так выглядит первый блокнот:
Код, необходимый для извлечения этих данных, записан в другом блокноте.
Это самый простой способ обмена данными любого типа между различными блокнотами.
Выполнение html-скрипта
%% html позволяет нам писать html-код в ячейке. Теперь ячейка будет действовать как html-редактор с html-выводом ячейки.
Следующий код состоит из простой таблицы, созданной в формате html. Заметьте, что html-вывод отображает ожидаемую таблицу.
%%html
Sid | India | 22 |
Dave | UK | 28 |
Совет: вы можете запустить код JavaScript в ячейке с помощью команды % %js magic, аналогичной магической команде HTML.
Отображение графиков Matplotlib
%matplotlib inline — это самая популярная магическая команда. Она позволяет отображать в блокнотах графики Matplotlib. Эта команда активирует интерактивную поддержку Matplotlib для блокнота Jupyter.
import random
import matplotlib.pyplot as plt
%matplotlib inline
Мы импортировали несколько библиотек, чтобы показать, как работает команда.
Теперь создадим два случайных списка для построения графика:
a = []
b = []
for i in range(10):
a.append(random.randint(0,10))
b.append(random.randint(0,10))
Далее мы построим диаграмму рассеяния данных:
plt.scatter(a,b)
Магическая команда %matplotlib inline позволяет визуализировать график внутри блокнота Jupyter.
Переменные среды
Эта волшебная команда позволяет вам сделать 3 вещи — вывести список всех переменных в среде, получить значение конкретной переменной среды и установить значение переменной.
%env без переменной будет перечислять все переменные среды.
%env с одной переменной вернет значение для указанного параметра.
%env variable value задаст значение для указанного имени переменной.
Подробная информация об объекте
%pinfo предоставляет подробную информацию об объекте, который передается вместе с ним. Она похожа на функцию object?.
В следующем фрагменте я указал простую строку “a” вместе с %pinfo, чтобы получить подробную информацию о ней.
a = «The World Makes Sense!»
%pinfo a
В приведенных выше выходных данных %pinfo предоставляет всю информацию о строке.
Вы можете посмотреть весь список магических команд, используя команду “%lsmagic”.
%lsmagic
На мой взгляд это были лучшие 10 магических команд, которые могут улучшить вашу продуктивность и сэкономить время.
Надеюсь, вам понравилось!
- Nota Bene для программиста Python
- Почему Python не станет языком программирования будущего
- Изучаем Python: генераторы, стримы и yield
Источник: medium.com
Доступ к исходному коду Python и байт-коду
Интерпретатор Python компилирует код в байт — код перед выполнением его на виртуальной машине Python.
Вот как просмотреть байт-код функции Python
import dis def fib(n): if n
Функция dis.dis в модуле Дис возвратит декомпилированный байткод функции переданного ему.
Изучение объекта кода функции
CPython разрешает доступ к объекту кода для объекта функции.
__code__ объект содержит необработанный байт — код ( co_code ) функции, а также другую информацию , такую как константы и имена переменных.
def fib(n): if n
Показать исходный код объекта Объекты, которые не являются встроенными
Чтобы напечатать исходный код использования объекта в Python inspect .Обратите внимание, что это не будет работать ни для встроенных объектов, ни для объектов, определенных в интерактивном режиме. Для этого вам понадобятся другие методы, объясненные позже.
Вот как напечатать исходный код метода randint от random модуля:
import random import inspect print(inspect.getsource(random.randint)) # Output: # def randint(self, a, b): # «»»Return random integer in range [a, b], including both end points. # «»» # # return self.randrange(a, b+1)
Просто напечатать строку документации
print(inspect.getdoc(random.randint)) # Output: # Return random integer in range [a, b], including both end points.
Печать полный путь к файлу , в котором метод random.randint определяется:
print(inspect.getfile(random.randint)) # c:Python35librandom.py print(random.randint.__code__.co_filename) # equivalent to the above # c:Python35librandom.py
Объекты, определенные в интерактивном режиме
Если объект определен в интерактивном режиме inspect не может предоставить исходный код , но вы можете использовать dill.source.getsource вместо
# define a new function in the interactive shell def add(a, b): return a + b print(add.__code__.co_filename) # Output: import dill print dill.source.getsource(add) # def add(a, b): return a + b
Исходный код для встроенных функций Python написано на C и может быть доступен только глядя на исходном коде языка Python (размещенные на ртутном или загрузить с https://www.python.org/downloads/source/ ).
print(inspect.getsource(sorted)) # raises a TypeError type(sorted) #
Источник: www.codecamp.ru
Исходный код майнкрафта на python
Игровое поле представляет собой прямоугольный «стакан», в который сверху падают фигуры – стилизованные буквы L, S, Z, J, O, I и T.
Каждая буква состоит из 4 блоков:
Игрок управляет движением фигур вниз – двигает их вправо и влево (но не вверх), поворачивает на 90 градусов, при желании ускоряет падение нажатием/удержанием клавиши ↓ или мгновенно сбрасывает фигуры на дно нажатием Enter.
Приземлением считается момент, когда фигура падает на дно стакана или на элемент предыдущих фигур. После этого программа проверяет, вызвало ли приземление полное (без пустот) заполнение ряда элементов. Заполненные ряды (их может быть от 1 до 4 включительно) удаляются; находящиеся над ними элементы перемещаются вниз на столько рядов, сколько было заполнено и удалено; вверху стакана добавляется соответствующее количество пустых рядов. После удаления 10 заполненных рядов происходит переход на следующий уровень, и падение фигур ускоряется.
Больше полезных материалов вы найдете на нашем телеграм-канале «Библиотека питониста»
Основные параметры игры
Прежде всего импортируем нужные модули:
Заливку сплошным цветом реализовать очень просто, но полупрозрачную заставку сделать сложнее – как ни странно, метод draw в Pygame до сих пор не поддерживает эту опцию. Есть несколько способов решения этой проблемы. Мы воспользуемся методом, который предусматривает создание дополнительной поверхности с попиксельным альфа-смешением, и последующую заливку экрана паузы цветом с наложением на поверхность окна игры:
Функция checkPos() следит за тем, чтобы падающая фигура оставалась в пределах игрового поля и не накладывалась на предыдущие. На примере слева фигура остается в допустимой области, на примере справа – ошибочно накладывается на предыдущую. Чтобы определить положение фигуры в стакане, нужно суммировать собственные координаты фигуры со «стаканными»:
Собственные координаты – (2, 1), (3, 1), (2, 2), (2, 3).
Стаканные координаты фигуры – (2, 3) на примере слева и (1, 11) на примере справа. Суммирование дает следующие результаты:
(2+2, 1+3), (3+2, 1+3), (2+2, 2+3), (2+2, 3+3) = (4, 4), (5, 4), (4, 5), (4, 6). Значит, фигура находится в пределах стакана и не наталкивается ни на один элемент предыдущих фигур.
На примере слева ситуация обратная:
(2+1, 2+11), (3+1, 2+11), (2+1, 3+11), (2+1, 4+11) = (3, 13), (4, 13), (3, 14), (3, 15) – две последние координаты в массиве cup уже заняты блоками предыдущих фигур. Именно такие ситуации и предотвращают checkPos() вместе с incup() :
Переменная y после удаления одного ряда продолжает указывать на его номер – это нужно для того, чтобы перейти к удалению других заполненных рядов, если они смещаются на место только что удаленного. В случае если других заполненных рядов пока нет, происходит уменьшение у .
Рисование блоков фигур
Каждая фигура состоит из 4 элементов – блоков. Блоки рисует функция drawBlock(), которая получает координаты из convertCoords() :
def drawBlock(block_x, block_y, color, pixelx=None, pixely=None): #отрисовка квадратных блоков, из которых состоят фигуры if color == empty: return if pixelx == None and pixely == None: pixelx, pixely = convertCoords(block_x, block_y) pg.draw.rect(display_surf, colors[color], (pixelx + 1, pixely + 1, block — 1, block — 1), 0, 3) pg.draw.rect(display_surf, lightcolors[color], (pixelx + 1, pixely + 1, block — 4, block — 4), 0, 3) pg.draw.circle(display_surf, colors[color], (pixelx + block / 2, pixely + block / 2), 5)
Для рисования блоков используются примитивы rect (прямоугольник) и circle (круг). При желании верхний квадрат можно конвертировать в поверхность ( Surface ), после чего наложить на эту поверхность изображение или текстовый символ. Функция drawBlock() также используется в drawnextFig() для вывода следующей фигуры справа от игрового поля.
Напоминаем, что полный код игры можно скачать здесь . Это полностью функциональный Тетрис с простым интерфейсом. Pygame предоставляет немало дополнительных возможностей для дополнения программы: к примеру, в игру можно добавить звуковые эффекты, диалоговое окно для закрытия, фоновое изображение, запись рекордов в файл. Если какие-то моменты остались неясными – задавайте вопросы в комментариях.
Материалы по теме
- Пишем кейлоггер на Python для Windows за 5 минут
- Создание интерактивных панелей с Streamlit и Python
- Как сделать сайт на Python за 5 минут с помощью SSG-генератора Pelican
Источник: proglib.io