Делаем скриншоты
Кросс-платформенный модуль
Для создания скриншота используется метод
Подобный модуль может быть полезен, например, для логирования скриптов, использующих Selenium, который может открывать браузер и производить какие-либо операции в нём.
#модули #pyscreenshot
Кросс-платформенный модуль
pyscreenshot
позволяет делать скриншоты как всего экрана, так и его части. Для его работы должна быть корректно установлена библиотека pillow
.Для создания скриншота используется метод
grab
, для его открытия – show
, для сохранения – save
. Также в grab
можно передать аргумент bbox
для захвата только определённой части экрана.Подобный модуль может быть полезен, например, для логирования скриптов, использующих Selenium, который может открывать браузер и производить какие-либо операции в нём.
#модули #pyscreenshot
Делаем HTTP запросы
Пакет
Устанавливается
Модуль идеально подходит как для работы со внешними API веб-сервисов, так и для получения HTML кода веб-страниц.
#requests
Пакет
requests
абстрагирует сложности выполнения запросов за красивым, простым API, чтобы вы могли сосредоточиться на взаимодействии с сервисами и работе с данными в ваших приложениях.Устанавливается
requests
стандартным путем через пакетный менеджер pip
. Запросы GET, POST, PUT и DELETE делаются интуитивно понятно. Атрибуты у объекта Response
позволяют получить всю информацию об ответе от сервера.Модуль идеально подходит как для работы со внешними API веб-сервисов, так и для получения HTML кода веб-страниц.
#requests
Функции только с именованными аргументами
Для того чтобы при использовании некоторой функции сделать так, чтобы ей можно было бы передавать только именованные аргументы, можно использовать аргумент
Таким образом, если просто передать два аргумента в функцию, то возникнет исключение
Такой прием может быть полезен для того, чтобы улучшить понятность кода. Здесь, что вполне очевидно, можно использовать и позиционные аргументы – в том случае, если поместить их до
#функции
Для того чтобы при использовании некоторой функции сделать так, чтобы ей можно было бы передавать только именованные аргументы, можно использовать аргумент
*
перед списком именованных аргументов.Таким образом, если просто передать два аргумента в функцию, то возникнет исключение
TypeError
. Но если передать их как именованные аргументы, то всё будет работать отлично.Такой прием может быть полезен для того, чтобы улучшить понятность кода. Здесь, что вполне очевидно, можно использовать и позиционные аргументы – в том случае, если поместить их до
*
.#функции
Forwarded from кабачковая икра по акции
Полезно удалёнщикам: 10 лучших городов мира, где идеально соблюдается баланс между работой и личной жизнью. Рейтинг составило издание Business Insider с консалтинговой компанией Kisi.
1. Осло 🇳🇴
2. Берн 🇨🇭
3. Хельсинки 🇫🇮
4. Цюрих 🇨🇭
5. Копенгаген 🇩🇰
6. Женева 🇨🇭
7. Оттава 🇨🇦
8. Сидней 🇦🇺
9. Штутгарт 🇩🇪
10. Мюнхен 🇩🇪
8 из 10 городов находятся в Европе. В десятку лучших не попал ни один город США. Наилучшую позицию среди американских городов в расширенном списке занял Сиэтл, он на 32 месте. Почти треть городов в топ-30 — из Германии. Россия в топ-100 не представлена.
В рейтинге учитывали безопасность, здравоохранение, доступность удалённых рабочих мест и количество дней оплачиваемого отпуска по уходу за ребёнком. Также анализ учитывал факторы открытых пространств, качество воздуха и инфляцию.
1. Осло 🇳🇴
2. Берн 🇨🇭
3. Хельсинки 🇫🇮
4. Цюрих 🇨🇭
5. Копенгаген 🇩🇰
6. Женева 🇨🇭
7. Оттава 🇨🇦
8. Сидней 🇦🇺
9. Штутгарт 🇩🇪
10. Мюнхен 🇩🇪
8 из 10 городов находятся в Европе. В десятку лучших не попал ни один город США. Наилучшую позицию среди американских городов в расширенном списке занял Сиэтл, он на 32 месте. Почти треть городов в топ-30 — из Германии. Россия в топ-100 не представлена.
В рейтинге учитывали безопасность, здравоохранение, доступность удалённых рабочих мест и количество дней оплачиваемого отпуска по уходу за ребёнком. Также анализ учитывал факторы открытых пространств, качество воздуха и инфляцию.
Находим файлы по шаблону
Основной фишкой модуля
В одноименный метод
Вообще модуль является встроенным, но в некоторых ситуациях импорт может выдать исключение. В таком случае надо просто его переустановить через пакетный менеджер
#glob
Основной фишкой модуля
glob
является удобная и лаконичная работа с поиском файлов по паттернам. Более того, можно даже пройтись по директориям рекурсивно.В одноименный метод
glob
передаётся шаблон для поиска файлов, а возвращается список с результатами. Все методы следуют механизму и правилам сопоставления паттернов в стиле Unix. Вообще модуль является встроенным, но в некоторых ситуациях импорт может выдать исключение. В таком случае надо просто его переустановить через пакетный менеджер
pip
.#glob
Разница между генераторными выражениями и генераторами коллекций
Записи в первой и второй строчке в коде выше очень похожи, но различаются видами скобок. В генераторе списка они квадратные, а в генераторном выражении – круглые.
Распечатав переменные, можно заметить, что значением переменной
Если вам нужен результат, например в виде списка, прямо сейчас для дальнейшего выполнения программы, то используйте генераторы коллекций.
А если же значения понадобятся еще не скоро или вообще неизвестно, понадобится ли они вообще, то предпочтительнее генераторы, чтобы не занимать лишнюю память и не нагружать систему.
#генераторы
Записи в первой и второй строчке в коде выше очень похожи, но различаются видами скобок. В генераторе списка они квадратные, а в генераторном выражении – круглые.
Распечатав переменные, можно заметить, что значением переменной
a
является список, а переменная x
хранит в себе объект генератора. И здесь возникает вопрос, что же использовать.Если вам нужен результат, например в виде списка, прямо сейчас для дальнейшего выполнения программы, то используйте генераторы коллекций.
А если же значения понадобятся еще не скоро или вообще неизвестно, понадобится ли они вообще, то предпочтительнее генераторы, чтобы не занимать лишнюю память и не нагружать систему.
#генераторы
Перегрузка операторов
Сначала стоит напомнить, что методы, которые начинаются и заканчиваются двойными нижними подчеркиваниями, называются магическими.
Например, выше в классе
Для перегрузки оператора
Таким образом, когда разработчик пишет запись
#классы
Сначала стоит напомнить, что методы, которые начинаются и заканчиваются двойными нижними подчеркиваниями, называются магическими.
Например, выше в классе
Point
мы определили __str__
, который отвечает за то, как выводятся объекты класса на экран.Для перегрузки оператора
"+"
нужно определить метод __add__
. Он принимает два аргумента, которыми являются, соответственно, операнды в операции сложения.Таким образом, когда разработчик пишет запись
p1 + p2
, интерпретатор воспринимает это в виде Point.__add__(p1, p2)
. Для всех операторов в языке, включая и логические, есть свои магические методы. #классы
Абстрактные классы и методы
В абстрактном классе обычно реализуется общая часть нескольких сущностей или другими словами – абстрактная сущность.
Абстрактный метод – это метод, который не имеет своей реализации в базовом классе, и он должен быть реализован в классе-наследнике.
Для того, чтобы создать абстрактный класс с абстрактными методами, надо импортировать вспомогательные метакласс
Если мы отнаследуем новый класс от абстрактного класса, не переопределив абстрактные методы, в данном случае
Для того, чтобы код заработал корректно, нам необходимо переопределить все абстрактные методы. То есть по сути еще раз просто написать метод, но уже в новом классе.
UPD. В коде опечатка, в классе
#классы #метаклассы #abc
В абстрактном классе обычно реализуется общая часть нескольких сущностей или другими словами – абстрактная сущность.
Абстрактный метод – это метод, который не имеет своей реализации в базовом классе, и он должен быть реализован в классе-наследнике.
Для того, чтобы создать абстрактный класс с абстрактными методами, надо импортировать вспомогательные метакласс
ABCMeta
и декоратор abstractmethod
из модуля abc
.Если мы отнаследуем новый класс от абстрактного класса, не переопределив абстрактные методы, в данном случае
method
, и попробуем создать экземпляр, то получим исключение TypeError
.Для того, чтобы код заработал корректно, нам необходимо переопределить все абстрактные методы. То есть по сути еще раз просто написать метод, но уже в новом классе.
UPD. В коде опечатка, в классе
GoodExample
метод должен называться method
, а не function
.#классы #метаклассы #abc
Упрощение создания операторов сравнения
Для создания объектов с поддержкой операторов сравнения в классе обычно требуется реализовать большое количество магических методов, а именно –
Про то, что делает каждый из них расскажем отдельным постом, но сейчас покажем, как можно сильно упростить реализацию подобного класса. Для этого можно использовать декоратор
В таком случае достаточно реализовать в классе только
#классы
Для создания объектов с поддержкой операторов сравнения в классе обычно требуется реализовать большое количество магических методов, а именно –
__lt__
, __le__
, __eq__
, __ne__
, __gt__
, __ge__
.Про то, что делает каждый из них расскажем отдельным постом, но сейчас покажем, как можно сильно упростить реализацию подобного класса. Для этого можно использовать декоратор
total_ordering
из пакета functools
.В таком случае достаточно реализовать в классе только
__lt__
и __eq__
. Эти два метода являются минимумом, который нужен декоратору для конструирования остальных методов.#классы
Перегрузка операторов сравнения
В случае, если вам в коде необходимо сравнивать объекты какого-либо класса, требуется реализовать магические методы, которые вызываются при сравнении.
Например, под капотом записи
Писать все шесть методов получается слегка громоздко, поэтому зачастую используют декоратор
#классы
В случае, если вам в коде необходимо сравнивать объекты какого-либо класса, требуется реализовать магические методы, которые вызываются при сравнении.
Например, под капотом записи
a < b
вызывается a.__lt__(b)
. Для каждого оператора сравнения существует свой магический метод. Подробнее про то, какой метод за какой оператор отвечает, выше в коде. Писать все шесть методов получается слегка громоздко, поэтому зачастую используют декоратор
total_ordering
из functools
. Про него, кстати, недавно писали пост. #классы
Список импортов по умолчанию
Для ограничения импорта переменных, функций и классов по умолчанию можно использовать список
Таким образом, при импорте вида
Тем не менее, в примере выше импортировать функцию
#модули
Для ограничения импорта переменных, функций и классов по умолчанию можно использовать список
__all__
, в который записываются названия объектов, которые будут подключены.Таким образом, при импорте вида
from module import *
из модуля c подобной записью подключатся только объекты с названиями из списка __all__
.Тем не менее, в примере выше импортировать функцию
foo
из такого модуля всё ещё можно, например, с помощью записи from module import foo
.#модули
Weekend Offer для ML- и RecSys-разработчиков
Команда ВКонтакте хочет найти Data Scientists, RecSys Developers и ML Developers. Они приглашают специалистов в команды VK Клипы и VK Видео, Сообществ, Рекомендаций и развития сервисов и Core ML. Там, вместе с другими талантами, вы будете разрабатывать рекомендательные системы для двух крупнейших российских видеосервисов.
Команда рекомендаций и развития сервисов не просто помогает пользователям найти релевантный контент - они исследуем новые, ранее неизвестные предпочтения людей и помогаем авторам контента найти свою аудиторию. Команда сообщества занимается разными задачами - с сурового хайлоадного бэкенда с продуманными ML-алгоритмами и заканчивая креативными продуктовыми экспериментами. Команда Core ML занимается умным ранжированием ленты и подбором интересных публикаций, а также - многими другими направлениями.
20 июня — 1 июля состоится первая встреча, с вами свяжутся и договорятся о звонке, будет короткий ликбез о командах и выбор слота для индивидуального онлайн-интервью.
В субботу 2 июля пройдёт детальное знакомство. В 10:00 по Москве пройдёт выступление представителей ВКонтакте, а с 11:00 до 19:00 пройдут индивидуальные технические онлайн-собеседования. Затем, уже в воскресенье пройдёт финальное собеседование и определение лучших кандидатов на позиции ВКонтакте.
Команда ВКонтакте хочет найти Data Scientists, RecSys Developers и ML Developers. Они приглашают специалистов в команды VK Клипы и VK Видео, Сообществ, Рекомендаций и развития сервисов и Core ML. Там, вместе с другими талантами, вы будете разрабатывать рекомендательные системы для двух крупнейших российских видеосервисов.
Команда рекомендаций и развития сервисов не просто помогает пользователям найти релевантный контент - они исследуем новые, ранее неизвестные предпочтения людей и помогаем авторам контента найти свою аудиторию. Команда сообщества занимается разными задачами - с сурового хайлоадного бэкенда с продуманными ML-алгоритмами и заканчивая креативными продуктовыми экспериментами. Команда Core ML занимается умным ранжированием ленты и подбором интересных публикаций, а также - многими другими направлениями.
20 июня — 1 июля состоится первая встреча, с вами свяжутся и договорятся о звонке, будет короткий ликбез о командах и выбор слота для индивидуального онлайн-интервью.
В субботу 2 июля пройдёт детальное знакомство. В 10:00 по Москве пройдёт выступление представителей ВКонтакте, а с 11:00 до 19:00 пройдут индивидуальные технические онлайн-собеседования. Затем, уже в воскресенье пройдёт финальное собеседование и определение лучших кандидатов на позиции ВКонтакте.
База данных на минималках
Встроенный модуль
Доступ к данным осуществляется с помощью ключей, как и в случае со словарями. А метод
В документации заявляют, что такая база данных является "надежной". Но учитывая, что
#shelve
Встроенный модуль
shelve
позволяет сохранять и читать произвольные данные. Таким образом, можно сохранять любые Python объекты для дальнейшего использования. Доступ к данным осуществляется с помощью ключей, как и в случае со словарями. А метод
shelve.open
поддерживает протокол контекстного менеджера, то есть можно не вызывать метод close
. В документации заявляют, что такая база данных является "надежной". Но учитывая, что
shelve
написан на pickle
, его стоит использовать только в совсем маленьких проектах.#shelve
Сохраняем бинарные данные
Модуль
Но классы, функции и методы сохранить не получится. Здесь также важно понимать, что при сохранении объекта сохраняется строка, указывающая, к какому классу относится этот объект.
Однако будьте осторожнее,
#pickle
Модуль
pickle
, который мы затронули в прошлом посте, реализует двоичные протоколы для сериализации и десериализации объектов. Вы можете сохранить любой объект, если возможно перевести каждый его атрибут в двоичный вид. Но классы, функции и методы сохранить не получится. Здесь также важно понимать, что при сохранении объекта сохраняется строка, указывающая, к какому классу относится этот объект.
Однако будьте осторожнее,
pickle
не защищен от ошибочных или вредоносных данных. Никогда не извлекайте данные, полученные из ненадежных или не прошедших проверку подлинности источников.#pickle
Аннотации типов: Union и Optional
Ранее на канале был пост про базовые аннотации типов. Но важно знать и про такие аннотации, как
При необходимости допустить использование не любых типов, а только некоторых, можно использовать аннотацию
Для объявления опциональных переменных используется
Кстати, аннотация
#аннотации
Ранее на канале был пост про базовые аннотации типов. Но важно знать и про такие аннотации, как
Union
и Optional
.При необходимости допустить использование не любых типов, а только некоторых, можно использовать аннотацию
Union[T, ...]
с указанием списка типов в квадратных скобках.Для объявления опциональных переменных используется
Optional[T]
. Такая аннотация нужна для переменных, которые либо имеют значение определенного типа, либо равны None
.Кстати, аннотация
Optional[T]
эквивалентна Union[T, None]
. #аннотации
Однажды ты спросишь меня, чего я жду больше: дрим-джоб или One Day Offer от Сбера. Я отвечу: «One Day Offer». И ты уйдёшь, так и не узнав, что это и есть шанс получить работу мечты.
Станьте частью команды Сбера за 1 день!
Форвард среди высокотехнологичных сервисных компаний ищет дата-сайентистов в Москве и Нижнем Новгороде. Подходит, если вы технарь уровня Middle, Senior или Lead с опытом в DS/ML больше 2 лет, который без труда кодит на Python. А если работали с рекомендательными системами — ещё лучше.
Каков порядок действий?
Посещаете 25 июня One Day Offer → проходите интервью → в тот же день получаете предложение, о котором мечтали → вместе с командой Сбера создаёте платформу, которая поможет создавать персональные рекомендации в разных сферах бизнеса.
Участвовать в One Day Offer
Станьте частью команды Сбера за 1 день!
Форвард среди высокотехнологичных сервисных компаний ищет дата-сайентистов в Москве и Нижнем Новгороде. Подходит, если вы технарь уровня Middle, Senior или Lead с опытом в DS/ML больше 2 лет, который без труда кодит на Python. А если работали с рекомендательными системами — ещё лучше.
Каков порядок действий?
Посещаете 25 июня One Day Offer → проходите интервью → в тот же день получаете предложение, о котором мечтали → вместе с командой Сбера создаёте платформу, которая поможет создавать персональные рекомендации в разных сферах бизнеса.
Участвовать в One Day Offer
Заменяем часть строки
Со строками в Python работать очень удобно, так как встроенных методов для них предостаточно. Одним из методов является
Первым аргументом передается подстрока, которая будет изменяться в исходной строке. Вторым аргументом — то, на что будет заменяться.
Также есть третий, опциональный, аргумент, который отвечает за то, сколько раз вы хотите заменить старую подстроку на новую. По умолчанию, все вхождения заменяются.
#строки
Со строками в Python работать очень удобно, так как встроенных методов для них предостаточно. Одним из методов является
str.replace()
, который позволяет заменять части строк.Первым аргументом передается подстрока, которая будет изменяться в исходной строке. Вторым аргументом — то, на что будет заменяться.
Также есть третий, опциональный, аргумент, который отвечает за то, сколько раз вы хотите заменить старую подстроку на новую. По умолчанию, все вхождения заменяются.
#строки
Спасти мир, исправив баги в коде? Легко!
По всей планете вдруг внезапно пошли сильнейшие ливни. Аномалия? Баги! Создатель напутал значения в коде, на котором написан наш мир, и теперь нам грозит утонуть в потоках воды с неба. Все исправить смогут только разработчики.
Помогите Создателю и решите три задачи на языке Python: выбирайте неправильные части кода и отмечайте правильный ответ из предложенных. Вся надежда на вас, поторопитесь!
https://vk.cc/ceD1h5
По всей планете вдруг внезапно пошли сильнейшие ливни. Аномалия? Баги! Создатель напутал значения в коде, на котором написан наш мир, и теперь нам грозит утонуть в потоках воды с неба. Все исправить смогут только разработчики.
Помогите Создателю и решите три задачи на языке Python: выбирайте неправильные части кода и отмечайте правильный ответ из предложенных. Вся надежда на вас, поторопитесь!
https://vk.cc/ceD1h5
Создаем пакеты
Пакет в Python — это, грубо говоря, папка с другими папками и модулями. Помимо разделения частей проекта, пакеты нужны для формирования пространства имен, чтобы можно работать с пакетами и модулями через точку, как в примере выше.
При импорте вида
Также примечателен файл init.py, который раньше был обязателен для создания пакетов. С версии Python 3.3 его необходимость пропала. Однако его функциональность на этом не заканчиваются.
#модули #пакеты
Пакет в Python — это, грубо говоря, папка с другими папками и модулями. Помимо разделения частей проекта, пакеты нужны для формирования пространства имен, чтобы можно работать с пакетами и модулями через точку, как в примере выше.
При импорте вида
from package import *
будет подключены либо все модули и объекты модуля __init__.py
, либо то, что находится в переменной __all__
в том же модуле __init__.py
— подробнее про эту переменную было в посте ранее.Также примечателен файл init.py, который раньше был обязателен для создания пакетов. С версии Python 3.3 его необходимость пропала. Однако его функциональность на этом не заканчиваются.
#модули #пакеты
Завершение программы
Функция
По факту функция просто поднимают исключение
Использовать
#sys #exit
Функция
exit
создана для удобства работы в интерактивном режиме, однако не рекомендуется использовать её внутри скриптов. По факту функция просто поднимают исключение
SystemExit
. А при попытке вызова без скобок напишут подсказку о правильном способе выхода из интерпретатора.Использовать
sys.exit()
стоит потому, что этот метод лежит в стандартном модуле и всегда там доступен. Также это довольно явный способ завершения программы.#sys #exit