Курс ориентирован на людей, уже знакомых с каким-либо языком программирования, например, Java или C++.
Лектор: Сергей Лебедев.
Домашние задания
Рекомендации к оцениванию домашних заданий. Оценивать по двум критериям: корректность и идиоматичность, то есть решение должно правильно работать и соответствовать руководству по стилю.
Хорошие книги про Python
- David M. Beazley, Python Essential Reference, 2009.
- Mark Lutz, Learning Python, 5th edition, 2013 (значительная часть 4-го издания также будет релевантной).
- David M. Beazley, Brian K. Jones, Python Cookbook, 3rd edition, 2013.
Лекция 1. Начало.
Кто, когда и зачем придумал язык Python. Интерпретаторы языка. Синтаксис языка с высоты птичьего полёта. Интерактивная оболочка IPython.
Лекция 2. Всё, что вы хотели знать о функциях в Python.
Синтаксис объявления функций. Упаковка и распаковка аргументов. Ключевые аргументы и аргументы по умолчанию. Распаковка и оператор присваивания. Области видимости, правило LEGB, операторы global и nonlocal. Функциональное программирование, анонимные функции. Функции map, filter и zip. Генераторы списков, множеств и словарей. Немного о PEP 8.
Лекция 3. Декораторы и модуль functools.
Синтаксис декораторов. Декораторы с аргументами, без аргументов. Примеры использования декораторов. Модуль functools.
Лекция 4. Строки, байты, файлы и ввод/вывод.
Строковые литералы и сырые строки. Строки и Юникод. Основные методы работы со строками. Модуль string. Байты. Кодировки. Файлы и файловые объекты. Методы работы с файлами. Модуль io.
Лекция 5. Встроенные коллекции и модуль collections.
И снова встроенные коллекции: кортеж, список, множество, словарь — обход в глубину, обзор методов, примеры. Почти всё про модуль collections: именованные кортежи, счётчики, defaultdict, OrderedDict.
Лекция 6. Классы 1.
Синтаксис объявления классов. Атрибуты, связанные и несвязанные методы, __dict__, __slots__<
/code>. Статические методы и методы класса. Свойства, декоратор @property. Наследование, перегрузка методов и функция super. Декораторы классов. Магические методы.
Лекция 7. Исключения и менеджеры контекста.
Исключения, зачем они нужны и как их обрабатывать. Встроенные исключения и базовые классы BaseException и Exception. Операторы try...except..else..finally. Менеджеры контекста и модуль contextlib.
Лекция 8. Итераторы, генераторы и модуль itertools.
Два протокола итераторов: __next__ + __iter__ и __getitem__. Итераторы и цикл for, а также операторы in и not in. Генераторы, оператор-выражение yield. Генераторы как: итераторы, сопрограммы, менеджеры контекста. Модуль itertools.
Лекция 9. Модули, пакеты и система импорта.
Модули. Операторы import и from ... import. Пакеты. Относительный и абсолютный импорт. __init__-фасад. И снова оператор import - обход в глубину.
Лекция 10. Классы 2.
Дескрипторы: что-как-зачем. Конструктор __new__, класс type и метаклассы. Наследование встроенных типов. Модули abc и collections.abc.
Лекция 11. Тестирование.
Зачем тестировать? Тестирование в интерпретаторе и доктесты. Модуль unittest. Пакет py.test - на порядок лучше. Тестирование свойств и пакет hypothesis.
Лекция 12. Быстрее, Python, ещё быстрее.
Измерение времени работы кода на Python с помощью модулей timeit, cProfile и line_profiler. Немного о NumPy. JIT и AOT компиляция кода на Python на примере Numba и Cython.
Motor 0.5
Motor 0.5 (асинхронный драйвер для MongoDB) доехал до релиза.
Новая версия работает с asyncio.
Всем рекомендую
Автор: Andrew Svetlov
Функция reload, углубляемся, примеры
message = “First version”
def printer():
print(message)
Этот модуль создает и экспортирует два имени – одно связано со строкой, а другое является функцией. Теперь запустите интерпретатор Python, импортируйте модуль и вызовите функцию, которую он экспортирует. Функция выведет
значение глобальной переменной message:
% python
>>> import changer
>>> changer.printer()
First version
Не закрывая интерактивную оболочку интерпретатора, отредактируйте файл модуля в другом окне:
…измените файл changer.py, не останавливая интерактивный сеанс…
% vi changer.py
Измените глобальную переменную message, а также тело функции printer:
message = “After editing”
def printer():
print(‘reloaded:’, message)
Затем вернитесь в окно интерактивной оболочки и перезагрузите модуль, что-
бы выполнить обновленный программный код. Обратите внимание: в следую-
щем листинге видно, что операция импортирования модуля не дает желаемого
результата – на экран выводится первоначальный текст сообщения, несмотря
на то, что файл был изменен. Чтобы задействовать новую версию, необходимо
вызвать функцию reload:
…вернитесь обратно в интерактивную оболочку…
>>> import changer
>>> changer.printer() # Никакого эффекта: используется прежняя версия модуля
First version
>>> from imp import reload
>>> reload(changer) # Принудительная загрузка/выполнение нового кода
>>> changer.printer() # Теперь будет запущена новая версия
reloaded: After editing
Обратите внимание, что функция reload в действительности возвращает объект – обычно ее результат игнорируется, но поскольку интерактивная оболочка автоматически выводит результат выражения, интерпретатор вывел результат в виде строки
Автор: Няшный Человек
Дата публикации: 2015-11-29T12:13:00.001+02:00
Основы использования функции reload
• reload – это не инструкция, а функция.
• Функции reload передается существующий объект модуля, а не имя.
• В Python 3.0 функции reload находится в модуле imp, который требуется импортировать, чтобы получить доступ к функции. Функция reload ожидает получить объект, поэтому к моменту ее вызова модуль уже должен быть успешно импортирован (если операция импорта оказалась неудачной из-за синтаксических или каких-либо других ошибок, вам может потребоваться повторить ее, прежде чем можно будет повторно загрузить модуль).
Кроме того, синтаксис инструкции import и функции reload отличается: аргумент должен передаваться функции reload в круглых скобках, а инструкции import – без них. Повторная загрузка модуля выполняется примерно следующим образом:
import module # Первоначальное импортирование
…используются атрибуты модуля…
… # Теперь выполняются изменения в файле модуля
…
from imp import reload # Импортировать функцию reload (в 3.0)
reload(module) # Загрузить обновленный модуль
…используются атрибуты модуля…
Это типичный случай, когда вы импортируете модуль, затем изменяете исходный программный код в текстовом редакторе, а потом повторно загружаете его. Когда вы вызываете функцию reload, интерпретатор повторно читает файл с исходными текстами и выполняет инструкции, находящиеся на верхнем уровне. Пожалуй, самое важное, что следует знать о функции reload, – это то, что она изменяет непосредственно сам объект модуля – она не удаляет и не создает его повторно. Вследствие этого все ссылки на объект модуля, имеющиеся в программе, автоматически будут учитывать изменения, произошедшие в результате повторной загрузки. А теперь подробнее о том, как происходит повторная загрузка:
• Функция reload запускает новый программный код в файле модуля в текущем пространстве имен модуля. При повторном выполнении программный код перезаписывает существующее пространство имен вместо того, чтобы удалять его и создавать вновь.
• Инструкции присваивания на верхнем уровне файла замещают имена новыми значениями. Например, повторный запуск инструкции def приводит к замещению предыдущей версии функции в пространстве имен модуля, выполняя повторную операцию присваивания имени функции.
• Повторная загрузка оказывает воздействие на всех клиентов, использовавших инструкцию import для получения доступа к модулю. Клиенты, использовавшие инструкцию import, получают доступ к атрибутам модуля, указывая полные их имена, поэтому после повторной загрузки они будут получать новые значения атрибутов.
• Повторная загрузка будет воздействовать лишь на тех клиентов, которые еще только будут использовать инструкцию from в будущем. Клиенты, которые использовали инструкцию from для получения доступа к атрибутам в прошлом, не заметят изменений, произошедших в результате повторной загрузки, – они по-прежнему будут ссылаться на старые объекты, полученные до выполнения перезагрузки.
Автор: Няшный Человек
Дата публикации: 2015-11-21T16:54:00.000+02:00
Повторная загрузка модулей
• При вызове операции импортирования (с помощью инструкций import и from) программный код модуля загружается и выполняется, только когда модуль импортируется в первый раз за время работы программы.
• При последующих попытках импортировать модуль будет использоваться объект уже загруженного модуля. Повторная загрузка и запуск программного кода в этом случае не происходит.
• Функция reload принудительно выполняет повторную загрузку уже загруженного модуля и запускает его программный код. Инструкции присваивания, выполняемые при повторном запуске, будут изменять существующий объект модуля.
Для чего вся эта суета вокруг повторной загрузки модулей? Функция reload позволяет изменять части программы, не останавливая всю программу. Благодаря функции reload эффект от изменений в программном коде можно наблюдать сразу же после внесения этих изменений. Повторная загрузка модулей поможет не во всех ситуациях, но она позволит существенно сократить цикл разработки. Например, представьте себе программу, предназначенную для работы с базами данных, которая должна при запуске соединиться с сервером, – так как изменения или настройки могут проверяться немедленно после повторной
загрузки, вам достаточно соединиться с базой данных всего один раз за весь сеанс отладки. Таким же способом можно обновлять программный код долго работающих серверов, которые нельзя останавливать.
Язык Python относится к языкам интерпретирующего типа (более или менее), поэтому в нем отсутствуют этапы компиляции/компоновки, необходимые, чтобы запустить программу, например, на языке C модули загружаются динамически уже запущенной программой. Возможность повторной загрузки обеспечивает повышение производительности труда, позволяя вам изменять части работающей программы без ее остановки. Обратите внимание, что в настоящее время функция reload может обслуживать только модули, написанные на языке Python, – скомпилированные модули расширений, написанные на таких языках, как C, тоже могут динамически загружаться во время работы программы, но их нельзя загрузить повторно.
Автор: Няшный Человек
Дата публикации: 2015-11-15T12:57:00.000+02:00
uvloop — альтернатива стандартному asyncio loop
Он взял libuv и построил с её помощью uvloop — asyncio совместимый event loop.
Результаты замера производительности здесь.
Получается, что uvloop в 3.5 раза быстрее стандартного и в 1.25 раза обгоняет gevent.
Т.е. абсолютный победитель по скорости в мире Python.
Библиотека пока еще не имеет стабильной версии, скоро всё будет.
Автор: Andrew Svetlov