Изменение в контекстных менеджерах
Как вы знаете, для удобного управления жизненным циклом ресурсов в python существуют контекстные менеджеры. Но до недавнего времени, чтобы открыть несколько ресурсов в рамках одной области видимости
С выходом python 3.10 появился новый синтаксис, позволяющий в круглых скобках указывать несколько контекстных менеджеров. А также мы можем использовать переменную созданную одним контекстным менеджером в рамках следующего за ним менеджера.
Это стало возможным благодаря появлению нового синтаксического анализатора PEG в python 3.9. И, строго говоря, python 3.9 уже допускал данный синтаксис, хотя официально еще не поддерживался.
Как вы знаете, для удобного управления жизненным циклом ресурсов в python существуют контекстные менеджеры. Но до недавнего времени, чтобы открыть несколько ресурсов в рамках одной области видимости
with нам требовалось либо прописывать их в одну строку либо использовать синтаксис переноса - обратный слеш \ (но это противоречит PEP8).С выходом python 3.10 появился новый синтаксис, позволяющий в круглых скобках указывать несколько контекстных менеджеров. А также мы можем использовать переменную созданную одним контекстным менеджером в рамках следующего за ним менеджера.
Это стало возможным благодаря появлению нового синтаксического анализатора PEG в python 3.9. И, строго говоря, python 3.9 уже допускал данный синтаксис, хотя официально еще не поддерживался.
Генерация капчи
Сегодня покажем создание простейшей капчи. Для этого нам понадобится модуль captcha и Pillow, который используется для создание изображений в captcha.
Все максимально просто, за нас по сути все делает уже написанный в модуле код. Создаем объект изображения ImageCaptcha, на который будет нанесен текст. После чего вызываем метод write с заданным текстом и именем файла, в который будет записано изображение.
Сегодня покажем создание простейшей капчи. Для этого нам понадобится модуль captcha и Pillow, который используется для создание изображений в captcha.
Все максимально просто, за нас по сути все делает уже написанный в модуле код. Создаем объект изображения ImageCaptcha, на который будет нанесен текст. После чего вызываем метод write с заданным текстом и именем файла, в который будет записано изображение.
Получение списка имен в объектах
С помощью функции
Для того, чтобы вручную определить для класса выдачу информации по атрибутам для функции
Для классов, в которых не определен
Данную функцию удобно использовать в интерактивном режиме для поиска нужного атрибута, применяя функцию
С помощью функции
dir() можно получить отсортированный список имен атрибутов и методов, доступных в локальной области. Либо если в функцию передать какой-либо объект dir(object), она вернет список всех имен атрибутов и методов переданного объекта.Для того, чтобы вручную определить для класса выдачу информации по атрибутам для функции
dir(), можно определить в классе метод __dir__().Для классов, в которых не определен
__dir__(), функция соберет информацию по атрибутам из __dict__.Данную функцию удобно использовать в интерактивном режиме для поиска нужного атрибута, применяя функцию
help() по нужному атрибуту для получения документации.Выводим вложенные словари и списки
При выводе вложенных словарей и списков с помощью обычного
Но в стандартной библиотеке есть модуль
Из интересных аргументов есть
При выводе вложенных словарей и списков с помощью обычного
print() мы получаем всё в одну строчку и в неразборчивом виде. Но в стандартной библиотеке есть модуль
pprint, который поможет вывести подобное дело в красивом формате — достаточно в коде заменить print() на pprint.pprint().Из интересных аргументов есть
depth, отвечающий за глубину вложенности при выводе, а также width, который отвечает за ширину вывода в консоли.Создаем бесконечный итератор
Функция
Фишка заключается в том, что когда элементы последовательности заканчиваются, итерация начинается вновь с первого элемента.
Но если вы проходитесь циклом по такому итератору, то важно предусмотреть выход из цикла, иначе он станет бесконечным (как у нас в первом случае на картинке).
Мы также можем воспользоваться
Функция
cycle() из itertools принимает на вход итерируемый объект и создает бесконечный итератор, циклически возвращающий элементы данного объекта.Фишка заключается в том, что когда элементы последовательности заканчиваются, итерация начинается вновь с первого элемента.
Но если вы проходитесь циклом по такому итератору, то важно предусмотреть выход из цикла, иначе он станет бесконечным (как у нас в первом случае на картинке).
Мы также можем воспользоваться
islice(), который вернет итератор по подмножеству переданного объекта.3 интересных функции в random
Этот пост более для тех, у кого есть соответствующий бэкграунд и кто хочет знать про random больше среднего.
betavariate() — используется для получения случайного числа с плавающей запятой от 0 до 1 на основе бета-распределения (применяется для статистических расчетов).
gauss() — генерирует случайное число с плавающей запятой на основе распределения Гаусса (используется в теории вероятности).
paretovariate() — возвращает случайное число с плавающей запятой на основе распределения Парето (используется в теории вероятности).
Этот пост более для тех, у кого есть соответствующий бэкграунд и кто хочет знать про random больше среднего.
betavariate() — используется для получения случайного числа с плавающей запятой от 0 до 1 на основе бета-распределения (применяется для статистических расчетов).
gauss() — генерирует случайное число с плавающей запятой на основе распределения Гаусса (используется в теории вероятности).
paretovariate() — возвращает случайное число с плавающей запятой на основе распределения Парето (используется в теории вероятности).
pprint
Стандартная функция Python print() делает своё дело. Но если попытаться вывести какой-нибудь большой вложенный объект, результат будет выглядеть не очень приятно.
Здесь на помощь приходит модуль из стандартной библиотеки pprint (pretty print). С его помощью можно выводить объекты со сложной структурой в читабельном виде.
Мастхэв для любого Python-разработчика, работающего с нестандартными структурами данных.
Стандартная функция Python print() делает своё дело. Но если попытаться вывести какой-нибудь большой вложенный объект, результат будет выглядеть не очень приятно.
Здесь на помощь приходит модуль из стандартной библиотеки pprint (pretty print). С его помощью можно выводить объекты со сложной структурой в читабельном виде.
Мастхэв для любого Python-разработчика, работающего с нестандартными структурами данных.
geopy
Программистам может быть сложно ориентироваться в географии. Однако модуль geopy всё упрощает:
$ pip install geopy
Он работает путём абстрагирования API разных сервисов геокодирования. Этот модуль даёт возможность узнать полный адрес места, его долготу и широту и даже высоту.
Также в нём есть полезный класс Distance. Он высчитывает расстояние между двумя местами в удобной единице измерения.
Программистам может быть сложно ориентироваться в географии. Однако модуль geopy всё упрощает:
$ pip install geopy
Он работает путём абстрагирования API разных сервисов геокодирования. Этот модуль даёт возможность узнать полный адрес места, его долготу и широту и даже высоту.
Также в нём есть полезный класс Distance. Он высчитывает расстояние между двумя местами в удобной единице измерения.
Блок else в циклах for и while
Цикл while используется для выполнения условия до тех пор, пока оно не будет оценено как истинное.
Цикл for используется для повторения определенных строк кода в программе. Предположим, вы хотите напечатать числа до 10, вы можете сделать это, набрав 10 операторов печати или используя цикл for. Цикл for повторяет часть программы на основе последовательности.
В Python циклы for и while могут содержать блок else, который выполнится, только если цикл завершится без применения break.
Рассмотрим это на примере функции, ищущей иголку (needle) в стоге сена (haystack).
Цикл while используется для выполнения условия до тех пор, пока оно не будет оценено как истинное.
Цикл for используется для повторения определенных строк кода в программе. Предположим, вы хотите напечатать числа до 10, вы можете сделать это, набрав 10 операторов печати или используя цикл for. Цикл for повторяет часть программы на основе последовательности.
В Python циклы for и while могут содержать блок else, который выполнится, только если цикл завершится без применения break.
Рассмотрим это на примере функции, ищущей иголку (needle) в стоге сена (haystack).
Автоматический счетчик во время итераций по коллекциям
Привет. Достаточно часто я наблюдаю ситуации, в которых новички создают "костыли", когда им необходим счетчик во время обхода коллекции. И вот решение проблемы.
Итак, встроенная в Python функция
И это еще не все,
Привет. Достаточно часто я наблюдаю ситуации, в которых новички создают "костыли", когда им необходим счетчик во время обхода коллекции. И вот решение проблемы.
Итак, встроенная в Python функция
enumerate применяется для итерируемых коллекций (строки, списки, словари и другие) и создает объект, который генерирует кортежи, состоящие из двух элементов – индекса элемента и самого элемента.И это еще не все,
enumerate также принимает необязательный второй аргумент, который позволяет указать, с какого числа начинать отсчет. По умолчанию индекс начинается с нуля, но в данном примере я передал единицу.Модуль transliterate
Модуль transliterate представляет собой двунаправленный транслитератор текста для Python.
Транслитерирует (unicode) строки в соответствии с правилами, указанными в языковых пакетах, то есть заменяет все русские буквы на английские и наоборот по правилам транслитерации.
Выше представлена транслитерация текста с английского на русский, т.е. замена всех английских букв на русские.
Модуль transliterate представляет собой двунаправленный транслитератор текста для Python.
Транслитерирует (unicode) строки в соответствии с правилами, указанными в языковых пакетах, то есть заменяет все русские буквы на английские и наоборот по правилам транслитерации.
Выше представлена транслитерация текста с английского на русский, т.е. замена всех английских букв на русские.
Функция random.choices()
Функция возвращает список элементов длины k, выбранных из последовательности lst с перестановкой элементов. Другими словами, функция используется, когда требуется выбрать несколько k случайных элементов из заданной последовательности, элементы не сохраняют первоначальный порядок.
Если k > len(lst), то элементы lst могут повторятся несколько раз.
Функция возвращает список элементов длины k, выбранных из последовательности lst с перестановкой элементов. Другими словами, функция используется, когда требуется выбрать несколько k случайных элементов из заданной последовательности, элементы не сохраняют первоначальный порядок.
Если k > len(lst), то элементы lst могут повторятся несколько раз.
Делаем ошибки более читаемыми
В Python есть удобный модуль
Для того, чтобы он заработал, достаточно импортировать его в ваш код.
Вывод ошибок в вашей программе будет выглядеть более читаемым. Более того, разные части вывода будут помечаться разным цветом вместо монотонного серого цвета.
Также модуль можно модифицировать, указав параметры в конфиге. Подробнее можете почитать в документации модуля.
В Python есть удобный модуль
pretty_errors, который делает стандартный вывод исключений и их traceback более удобным для чтения. Для того, чтобы он заработал, достаточно импортировать его в ваш код.
Вывод ошибок в вашей программе будет выглядеть более читаемым. Более того, разные части вывода будут помечаться разным цветом вместо монотонного серого цвета.
Также модуль можно модифицировать, указав параметры в конфиге. Подробнее можете почитать в документации модуля.
Сравниваем Django и Flask
Оба фреймворка крайне мощные, но выбрать надо что-то одно. Из общеизвестных фактов: Django – самый востребованный в плане работы, Flask – наиболее производительный.
Django является более монолитным и предоставляет сразу множество инструментов из коробки, а Flask в свою очередь гибкий и минималистичный, позволяет кастомизировать архитектуру приложения.
Если в приоритете трудоустройство, то следует изучать Django. Но если вы хотите быстро начать создавать пет-проекты или изучать веб в целом, то рекомендуем рассматривать Flask.
Оба фреймворка крайне мощные, но выбрать надо что-то одно. Из общеизвестных фактов: Django – самый востребованный в плане работы, Flask – наиболее производительный.
Django является более монолитным и предоставляет сразу множество инструментов из коробки, а Flask в свою очередь гибкий и минималистичный, позволяет кастомизировать архитектуру приложения.
Если в приоритете трудоустройство, то следует изучать Django. Но если вы хотите быстро начать создавать пет-проекты или изучать веб в целом, то рекомендуем рассматривать Flask.
Превращаем PDF в текст
Думаю, все периодические работают с PDF-документами. И зачастую это ручная и скучная работа. Но Python может автоматизировать даже такую рутинную задачу.
Модуль
Кстати, здесь ещё интересно то, что исходный код модуля написан на C++. Поэтому есть небольшая вероятность, что придётся повоевать с зависимостями.
Думаю, все периодические работают с PDF-документами. И зачастую это ручная и скучная работа. Но Python может автоматизировать даже такую рутинную задачу.
Модуль
pdftotext создан именно для работы с документами в PDF формате. Устанавливается он через пакетный менеджер pip, а использовать его проще простого. Все основные операции представлены на картинке выше. Кстати, здесь ещё интересно то, что исходный код модуля написан на C++. Поэтому есть небольшая вероятность, что придётся повоевать с зависимостями.
Протоколы
Термины "протокол итератора" или "протокол дескрипторов" уже привычны и используются давно. Но теперь можно описывать протоколы в виде кода и проверять их соответствие на этапе статического анализа.
Протокол описывается как обычный класс, наследующийся от
Хоть это и не совсем интерфейсы, но все же классная штука. Еще важно, что протоколы, как и все остальные фишки аннотаций типов, используются в основном со статически типизированным
#typing #аннотации
Термины "протокол итератора" или "протокол дескрипторов" уже привычны и используются давно. Но теперь можно описывать протоколы в виде кода и проверять их соответствие на этапе статического анализа.
Протокол описывается как обычный класс, наследующийся от
Protocol. Он может иметь методы (в том числе с реализацией) и поля. Реальные классы, реализующие протокол могут наследоваться от него, но это не обязательно, как показано в примере. Хоть это и не совсем интерфейсы, но все же классная штука. Еще важно, что протоколы, как и все остальные фишки аннотаций типов, используются в основном со статически типизированным
mypy. #typing #аннотации
Избегайте циклы с коллекциями
Представим задачу: требуется создать новый список, элементами которого будут являться квадраты чисел другого списка. Большинство сразу же напишут цикл
Но такой подход займет как минимум три строчки: объявление новой переменной, создание цикла и кода внутри него. Более того, также снижается скорость работы скрипта.
В коде выше мы привели две достойные альтернативы – генератор списка и функция
Представим задачу: требуется создать новый список, элементами которого будут являться квадраты чисел другого списка. Большинство сразу же напишут цикл
for.Но такой подход займет как минимум три строчки: объявление новой переменной, создание цикла и кода внутри него. Более того, также снижается скорость работы скрипта.
В коде выше мы привели две достойные альтернативы – генератор списка и функция
map. В обоих вариантах не только код становится лаконичнее, но и заметно повышается производительность.Логирование
Логировние является неотъемлемой частью разработки. Логи показывают информацию о текущем состоянии программы. И чем лучше выстроено логирование, тем проще будет разобраться в нестандартных ситуациях.
Python поставляется для этих целей с гибким модулем
Созданный объект Logger предоставляет методы для записи сообщений разного уровня (
По умолчанию в
Для отправки логов в сконфигурированные места используются обработчики. Мы можем использовать уже существующие хэндлеры, либо создать свой класс обработчика, унаследовавшись от базового класса
Логировние является неотъемлемой частью разработки. Логи показывают информацию о текущем состоянии программы. И чем лучше выстроено логирование, тем проще будет разобраться в нестандартных ситуациях.
Python поставляется для этих целей с гибким модулем
logging. Для создания объекта Logger, вызываем функцию getLogger, передавая в нее имя логера.Созданный объект Logger предоставляет методы для записи сообщений разного уровня (
DEBUG, INFO, WARNING, ERROR, CRITICAL), что удобно для поиска нужной информации с применением фильтров.По умолчанию в
logging задан уровень WARNING, это означает, что сообщения уровня DEBUG и INFO будут игнорироваться при записи в лог. Изменить данное поведение можно с помощью метода setLevel, передав минимальный уровень, который будет отлавливаться.Для отправки логов в сконфигурированные места используются обработчики. Мы можем использовать уже существующие хэндлеры, либо создать свой класс обработчика, унаследовавшись от базового класса
Handler.