Очередь с приоритетом – это такая коллекция, которая поддерживает обязательно две следующие операции: вставка элемента с некоторым приоритетом (это может быть число или другой сравнимый объект) и извлечение элемента с наибольшим (или наименьшим приоритетом).
Метка: python
Перенаправление стандартного вывода
Случается так, что некий код (возможно, не ваш) пишет в стандартный вывод какую-то нужную информацию. Ее нетрудно перехватить с помощью функции redirect_stdout из стандартного модуля contextlib.
redirect_stdout является контекст менеджером (применяется совместно с with) и принимает аргументом файло-подобный объект (это может быть и дескриптор файла, и StringIO).
📎 Пример. Сохраним вывод функции help в строку (в интерпретаторе пример работает некорректно, запускайте с файла):
import io from contextlib import redirect_stdout f = io.StringIO() with redirect_stdout(f): help(pow) s = f.getvalue() print(s) # в s будет вывод
📎 Пример. Или в файл:
with open('help.txt', 'w') as help_file: with redirect_stdout(help_file): help(pow)
📎 Пример. stdout в stderr:
import sys with redirect_stdout(sys.stderr): help(pow)
Во время работы redirect_stdout вывод в терминал попадать не будет.
Функция redirect_stderr аналогично перехватывает вывод из стандартного потока ошибок (stderr).
🧙 Специально для канала @pyway. Подписывайтесь на мой канал в Телеграм @pyway 👈
Многоликий else
Все знают, что ключевое слово else служит для выполнения альтернативной ветки кода, если условие if не выполнилось:
x = 5 if x < 3: print("x < 3") else: print("x >= 3")
Но знали ли вы, что есть еще два примения else?
1. for/else, while/else
Если поставить else после тела цикла, то код по else будет выполнен только в том случае, если цикл завершился «нормально», т.е. в цикле не исполнилось break. Пример:
stack = [1, 3, 5, 7] while stack: if stack.pop() == 4: break else: print('not found!')
Пример. Простые числа и множители:
for n in range(2, 10): for x in range(2, n): if n % x == 0: # есть делитель, уходим print(n, '=', x, '*', n/x) break else: # цикл не нашел делителей print(n, 'простое число!')
2. try/else
В блоке try код else выполняется только в том случае, если не возникло исключений. else можно написать только после блока except, без него – нельзя. Порядок выполнения кода соответствует порядку написания сверху вниз: try → except или else → finally.
try: ... except Exception: print('Exception!') else: print('Ok!') finally: print('Bye!')
Причем else не будет также вызван, если сработавшее исключение не подпало под перечисленные except и не было обработано.
🧙 Специально для канала @pyway. Подписывайтесь на мой канал в Телеграм @pyway 👈
Интерактивность в Jupyter Notebook
Как я и говорил, в Jupyter Notebook очень много всяких удобностей. В частности в блокнот можно добавить элементы управления, такие как:
- Слайдер для выбора значения числа
- Текстовое поле для ввода чисел или строк
- Выпадающий список выбора
- Чекбоксы (галочка да/нет)
- Выбор даты
- Выбор цвета и другие…
Установка виджетов (если еще не установлены):
pip install ipywidgets
jupyter nbextension enable --py widgetsnbextension
Или через conda одной командой:
conda install -c conda-forge ipywidgets
📎 Пример. Нарисуем синусоиду с изменяемой частотой и фазой:
%matplotlib inline import numpy as np import matplotlib.pyplot as plt from ipywidgets import interact @interact(f=(1, 5, 0.1), phase=(0, 3.14, 0.1)) def plot_f(f, phase): x = np.linspace(0, 10, 100) y = np.sin(f * x + phase) plt.plot(x, y, 'r') plt.show()
Мы делаем интерактивными параметры f и phase. Их имена совпадают с аргументами обернутой функции plot_f(f, phase). А значения — кортеж вида (min, max, step), т.е. минимальное значение, максимальное и шаг слайдера. Как только мы изменим положение движков, то график будет автоматически перерисован.
Магия Jupyter Notebook
Jupyter Notebook предлагает богатейшие возможности по прототипированию кода, проверке гипотез, демонстраций и научных трудов в сравнении со стандартным интерпретатором Python.
Уставновка:
pip install jupyter
Запуск. В терминале пишем:
jupyter notebook
После чего запускается процесс, поднимается веб-сервер и открывается окно браузера с веб-интерфейсом, где вы можете создавать, открывать, редактировать и исполнять файлы типа .ipynb. Не закрывайте этот процесс, пока работаете с блокнотом.
Jupyter Notebook не только позволяет хранить на одной странице и код, и результат его работы, а еще текст с картинками, но и предоставляет магические функции, которые взаимодействуют с вашим Python кодом, интерпретатором и операционной системой.
Рассмотрим некоторые из них:
%magic — выведет документацию по всем-всем доступным магическим функциям.
%lsmagic — просто список этих функций.
%timeit – измеряет среднее время выполнения кусочка кода, при этом вывод гораздо более информативен, чем обычный вызов timeit.timeit; и не требует лишних import.
Сравните вот это (из Jupyter):
def test():
return sum(range(1000))
%timeit test()
12.5 µs ± 378 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
С этим (из интерпретатора):
>>> import timeit
>>> def test(): return sum(range(1000))
...
>>> timeit.timeit("test()", "from __main__ import test")
12.405041060002986
По-моему, первый вариант выигрывает по удобству и информативности.
%%timeit – многострочный вариант предыдущей функции. Пример:
%%timeit x = 10
x += 20
x /= 2
48.7 ns ± 0.435 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
%pinfo [имя] или [имя]? – покажет документацию по функции или классу [имя]. Примеры:
import numpy as np
%pinfo np.random.uniform
Или
import numpy as np
np.random.uniform?
Построение графиков:
%matplotlib inline
from matplotlib import pyplot as plt
import numpy as np
x = np.linspace(0, 10, 100)
y = np.sin(x)
plt.plot(x, y)
%env — показать текущие переменные среды.
%env [имя]=[значение] — управление переменными среды. Пример:
%env OMP_NUM_THREADS=4
%cd – показывает или меняет рабочую директорию.
Можно вызывать системные команды прямо из блокнота через знак восклицания. Примеры:
!ls
!pip install click
# резульат выполнения системной команды можно получить в перемунную и использовать далее
output = !pip list | grep tensorflow
Это лишь малая часть доступных функций, о других сценариях работы я расскажу в следующих выпусках, оставайтесь на связи. Тестовый ноутбук по ссылке тут.
P.S. Многие магические функции также работают и в интерпретаторе IPython.
🧙 Специально для канала @pyway. Подписывайтесь на мой канал в Телеграм @pyway 👈