Python Academy
49.5K subscribers
1.08K photos
2 videos
374 links
Python Academy — один канал вместо тысячи учебников

Чат канала: @python_academy_chat

Сотрудничество: @zubar89

Канал включён в перечень РКН: https://rkn.link/TVu
加入频道
Получи оффер в Яндексе за 2 дня 🔥

Яндекс проводит Weekend offer, и это отличная возможность получить оффер для тех, кто прогает уже больше 2-х лет и умеет писать на С++, Java, Python, C#, Go или Kotlin. Нужно до 30 мая пройти автоматизированный отбор, а 5-6 июня написать 2 классных кода и пройти финальное собеседование с командой. Ну и все, оффер от Яндекса у тебя в руках!

Скоро регистрация закроется, поэтому переходи по ссылке сейчас.
​​Получаем срез из бесконечного генератора

Вероятно, у многих были случаи, когда требовалось получить конечный список элементов из бесконечного генератора.

И в целом задача вполне простая, но сейчас рассмотрим лаконичный вариант — воспользуемся пакетом itertools, в котором есть функции на все случаи генераторов.

В нашем случае понадобится islice, который как раз берет "срез" из генератора. В аргументах указываем объект генератора и длину среза.

Для примера мы написали функцию-генератор, которая вычисляет числа Фибоначчи. Результат можете посмотреть на картинке.

#itertools
Кэшированные атрибуты

Во встроенном пакете functools есть классный декоратор @cached_property, который позволяет кэшировать результат метода и загнать его в атрибут.

Таким образом, при первом обращении к атрибуту производятся вычисления в методе, а при дальнейших берется уже кэшированное значение.

Подобное кэшеирование полезно в случаях, когда в методе производятся вычисления, которые нагружают систему и занимают много времени.

По сути, @cached_property можно сравнить с комбинацией декораторов @property (про это был пост) и @functools.lru_cache (и про это тоже).

#functools #cached_property
Важное про цифры и Юникод

0, 1, 2, 3, 4, 5, 6, 7, 8, 9 — не единственные символы, которые считаются цифрами. Python следует правилам Юникода и обрабатывает несколько сотен символов как цифры. Полный список находится здесь.

Это крайне важно знать, потому что эти символы влияют на такие функции, как int, unicode.isdecimal и даже re.match.

Думаю, в один момент это знание сэкономит вам время на исправление "бага" с такими странными символами. Предупрежден — значит вооружен.

#числа #юникод
Гайд по Python: с чего начать новичку 

На канале — много новых подписчиков. Поэтому написал подробную статью, что учить, читать и смотреть. Разделил на три области: веб-разработка, машинное обучение и анализ данных. 

Также прочитайте "Первые шаги в Python" — это тоже хороший вводный гайд, где много полезных книг, сайтов для практики и курсов. 

Читать 5 минут

#статья
Отправляем универсальные уведомления

Наткнулся на интересный пакет notifiers, который позволяет отправлять уведомления на почту, через Телеграм бота, в Слэк и еще много куда. Всего доступно 16 провайдеров, подробнее про них в документации.

В функцию get\_notifier передаем название провайдера в виде строки и получаем объект, с которым можно работать. Отправить уведомление можно с помощью универсального метода notify.

Если не уверены, какие аргументы нужно передать для отправки уведомления, то можете посмотреть их через атрибут required у созданного объекта.

Например, для Телеграма нужно передать токен бота, айди чата и само сообщение. В случае с почтой необходимо указать логин, пароль, адресата и также сообщение.

#уведомления #notifiers
Объект Ellipsis

В Python есть крайне интересный объект, который обозначается как ..., то есть многоточие. Этот объект называется Ellipsis, и используется он в основном как заготовка для чего-то еще не реализованного.

Применяется он зачастую при работе со срезами в Numpy, но и в обычном коде его тоже встретить можно. Например, ... периодически встречается в теле функции в качестве заглушки.

Если привести его к логическому типу данных, то увидим True — это важный момент, потому что похожий по своей сути None выдает False.

#ellipsis
Узнаем кодировку текста

Думаю, у всех были ситуации, когда вы открыли файл или получили ответ от сервера, а внутри оказывался набор странных символов в непонятной кодировке.

Пакет chardet как раз был создан для работы с кодировкам. Его метод detect выдает предполагаемую кодировку с точностью от 0 до 1.

В примере на картинке мы получили ответ по запросу к серверу, взяли его содержимое и проверили кодировку через этот метод.

#chardet
Отлавливаем ошибки с помощью assert

Инструкция assert принимает логическое выражение и необязательное сообщение. Она используется для проверки типов, значений аргумента и вывода функции, а также для отладки, поскольку останавливает программу в случае ошибки.

Если выполнить инструкцию assert с логическим выражением, результат которого равен True, ничего не произойдет. Но в случае с False будет сгенерировано исключение AssertionError.

Однако не нужно пытаться обработать исключение AssertionError блоком try-except. В таком случае assert теряет свой смысл.

В примере мы проверили, является ли переданный аргумент числовым типом данных. Если не является, то будет вызвано исключение и выведено указанное сообщение.

#исключения #assert
Атрибуты функций

Сейчас будет шок для новичков, но функции — это обычные объекты, у которых просто реализован метод __call__. Именно он и позволяет выполнять синтаксис с вызовом через круглые скобки.

И соотвественно у функций, как и у любых других объектов, можно устанавливать атрибуты и даже другие методы. Но сейчас затронем только атрибуты.

Как вариант, в примере я реализовал счетчик вызова функции, но без использования глобальных переменных — всё с помощью атрибута в объекте функции.

Вообще практического применения в продакшне я не припомню, но сам этот факт знать полезно для общего понимания структуры языка и устройства объектов.

#функции #объекты
Разделители для целых чисел

Трудно визуально различить целые числа подобные 10000000 и 100000000. Использовать запятые, как в английском языке, не получится.

Но Python позволяет использовать нижнее подчеркивание как разделитель для улучшения читабельности.

Например, 1_000_000 будет интерпретироваться как целое число 1000000.

#числа
Заглушка в коде

В ходе исполнения оператора pass ничего не происходит, поэтому он может использоваться в качестве некой заглушки в тех местах, где это синтаксически необходимо.

Например, вам надо сделать несколько функций, вы написали def'ы и названия, но сам код еще не успели, однако программу надо запустить и проверить что-то другое. Вот тут и понадобится pass.

Или в конструкции try-except, чтобы просто проигнорировать и никак не обрабатывать ошибку в программе.

#pass
Универсальный парсер статей

Пакет newspaper3k позволяет парсить статьи и извлекать из них заголовки, текст, дату публикации, имена авторов и много другой информации.

Плюс пакета в том, что весь процесс парсинга автоматизирован и не надо вручную искать нужные теги и тянуть из них данные.

Но точность парсера зависит в основном от того, как хорошо сверстана запрашиваемая страница. Поэтому в некоторых случаях результат может отличаться от ожиданий.

#парсер #newspaper3k
Денег будем платить немного, зато дадим акции. У вас есть шанс стать совладельцем суперстартапа. Казалось бы, такие предложения звучат как кидалово, и шанс стать совладельцем Apple из гаража почти нулевой. Но многие программисты так не думают, и правильно считают. Об этом говорит новое исследование компании G-mate. Это чуваки, которые помогают сделать карьеру IT-специалистам.

Ребята опросили несколько сотен айтишников разного уровня — от джуниоров до сеньоров. И результаты вышли довольно неожиданными. Как оказалось, многие программисты готовы получать от работодателей опционы. Например, по такой системе работает «Яндекс». То есть, ты получаешь зарплату, а в качестве бонусной части - акции, которые растут вместе с брендом.

Это, к слову, и становится отличной мотивацией. Ты работаешь не только на компанию, но и повышаешь стоимость своего же акционного портфеля. По данным опроса, 55% профессионалов готовы поменять место работы, если им предложат более выгодные условия, например, те же опционы.

Впрочем, это не главный вывод исследования. Как показал опрос, для большинства программистов на первом месте стоит не доход, а «инженерская душа». Если тебе комфортно работать с соратниками по профессии, ты чувствуешь коллег и то, что занимаешься важным делом — зарплата встаёт на второе место. Ну а опционы к ней — просто как хороший бонус. Опрос показал, что такое поощрение даёт в среднем + 30% к доходу. Больше, чем давали бы стандартные премии.

Но в этом есть и минус. Про существование опционов знают и получают их только 17% опрошенных. То есть, ваш доход уже могла бы быть выше благодаря опционам.. Мы бы на вашем месте прямо сейчас задали этот вопрос своему работодателю.
Временные файлы

В стандартной библиотеке Python есть модуль tempfile, который содержит классы и методы для корректной работы со временными файлами и директориями.

Функция TemporaryFile создает временный файл в системной директории и возвращает файлоподобный объект.

Созданный временный файл будет автоматически удален по закрытию файла или при выходе из контекстного менеджера.

Также другие процессы и приложения не смогут получить доступ к этому временному файлу.

#tempfile
Скачиваем видео с YouTube

Пакет pytube предоставляет всю небходимую функциональность для скачивания видео с YouTube, а также для сбора всей информации о нем.

Для работы нам необходимо создать объект класса YouTube. Помимо ссылки на видео в конструктор можно передать в качестве параметров функции для обработки прогресса загрузки и завершения.

Большинство видео на ютубе не имеют аудиодорожки на потоках с высоким разрешением, свыше 720p — это связано с технологией передачи DASH, которую использует ютьюб. Решение данной проблемы покажем в следующем посте.

На картинке мы показали как отфильтровать потоки с прогрессивной передачей и выбрать из полученного списка с максимальным доступным разрешением до 720p.

Для загрузки выбранного потока используем функцию download(), в функцию можно передать в качестве параметров путь до директории для сохранения и имя файла.

#youtube
Объединяем видео и аудио потоки

Итак, дополнение к предыдущему посту.

Из-за технологии потоковой передачи DASH (Dynamic Adaptive Streaming over HTTP), используемой youtube, мы не можем получить сразу видео в нужном качестве со звуковой дорожкой из-за ее отсутствия в потоке.

В качестве решения мы можем по отдельности забрать аудио и видео и объединить с помощью утилиты ffmpeg. Для этого выбираем нужные потоки video и audio, после чего передаем url'ы в команду для инициирования создания процесса для скачивания и объединения потоков с помощью ffmpeg.

#youtube
Задаем ширину текста

Ранее уже был пост про встроенный модуль textwrap — там мы рассказывали про то, как сократить текст до определенного количества символов без прерывания на середине слова.

Но мощные функции для красивого форматирования текста на этом не заканчиваются. В модуле есть еще fill, который позволяет задать ширину текста в символах.

Как видите в примере на картинке, слова переносятся на новые строки и ничего не обрывается на полуслове.

#textwrap
Операторы множеств

Множество — это коллекция, где все элементы уникальны. То есть одно и то же значение не может повторяться дважды.

Помимо обычных методов, у множеств реализована поддержка различных операторов: объединение, пересечение, симметрическая разность, обычная разность и некоторые другие.

Примеры этих операторов можете посмотреть выше на картинке. Реализовано подобное поведение с помощью магических методов, про которые уже не раз говорили на канале.

#множества
Работаем с буфером обмена

Здесь всё просто: есть пакет pyperclip, который позволяют отправлять текст в буфер обмена вашего компьютера и получать его оттуда.

В этом пакете есть две основные функции — copy() и paste(), по названию которых понятно их предназначения.

Таким образом, можно прямо через код копировать вывод программы в буфер обмена вместо того, чтобы делать это вручную.

#pyperclip
Как работают статические методы

Статические методы создаются в классе при помощи декоратора @staticmethod. Такие методы привязаны к классу, а не объекту — в этом и есть основное отличие.

Такой тип методов не может модифицировать ни объект, ни сам класс. То есть передавать объект или класс и прописывать self или cls в аргументах не нужно.

Обычную функцию стоит вносить в класс в качестве статического метода в том случае, когда эта функция логически относится к классу и имеет смысл там быть.

#ооп