Python академия
Open in Telegram
Учи Python быстро и легко. Ежедневно публикуем практические задачи, разборы, готовые решения, объяснения логики, советы по алгоритмам. ✔ Подходит для прокачки навыков кодирования. По всем вопросам @evgenycarter
Show more7 293
Subscribers
-224 hours
-157 days
-3530 days
Posts Archive
7 293
Проверка наличия подстрок в строке списка
А вот и задача, с которой многим приходится иметь дело ежедневно: проверять, есть ли в строке подстрока. В отличие от других языков программирования, в Python имеется для этого хорошее ключевое слово.
Подписывайтесь на канал 👉@pythonofff
7 293
+9
Элитные апартаменты в Сочи с доходом 6 млн ₽ в год!
⚡ Клубный комплекс элитных апартаментов расположенный в центральном Сочи
- от 28 до 350 м²
- 5 мин до пляжа
- Премиальная отделка с мебелью
- Инфинити бассейн. Бар у бассейна. SPA
- Спортплощадки. Ресторан
- Салон красоты. Фитнес. Пруд с черепахами
- Умный дом. Подземный паркинг
- Консьерж-сервис. Панорамные окна
✅ Получите планировки и цены на сайте:
Перейти на сайт
#реклама
mrqz.me
О рекламодателе
7 293
Вычисление выражений Python
Вы наверняка знакомы с eval, но знаете ли вы о literal_eval? Вряд ли. Для безопасного исполнения выражений, содержащих исключительно литералы, вы можете делать так, как показано на картинке выше.
Между прочим, данная фича находится в языке уже очень давно.
Подписывайтесь на канал 👉@pythonofff
7 293
🔍
match-case + dataclass: Python как mini-Pydantic
Когда не хочется тащить Pydantic, но нужно элегантно валидировать и распарсить входящие данные — попробуй комбо match-case и dataclass. Красиво, просто, pythonic.
Python 3.10+ принёс структурное сопоставление (match-case). В связке с dataclass можно описывать и валидировать структуру данных без лишней магии.
Пример: простенький парсер события из словаря:
from dataclasses import dataclass
from typing import Any
@dataclass
class UserJoined:
user_id: int
room: str
@dataclass
class MessageSent:
user_id: int
message: str
def parse_event(event: dict[str, Any]) -> Any:
match event:
case {"type": "user_joined", "user_id": int(uid), "room": str(room)}:
return UserJoined(uid, room)
case {"type": "message_sent", "user_id": int(uid), "message": str(msg)}:
return MessageSent(uid, msg)
case _:
raise ValueError("Unknown event type")
# Пример использования
raw = {"type": "message_sent", "user_id": 42, "message": "Привет!"}
event = parse_event(raw)
print(event) # MessageSent(user_id=42, message='Привет!')
💡 Что происходит:
- match проверяет структуру словаря и типы значений.
- Если шаблон совпал, мы сразу вытаскиваем нужные поля.
- dataclass делает остальное: хранение данных и авто-_repr_.
Плюсы:
- Не надо писать вручную if, try/except, dict.get().
- Простая и читабельная валидация без внешних зависимостей.
- Работает из коробки, если у вас Python 3.10+.
Минусы:
- Без вложенных структур и сложных схем — не замена Pydantic, но хороший lightweight-вариант.
Подписывайтесь на канал 👉@pythonofff7 293
Форматирование строки
Самые важные части кода — это входные данные, логика и выходные данные. Все три части требуют некоторого форматирования при написании кода для получения лучших и более удобных для восприятия человеком выходных данных. В Python имеется целый ряд методов форматирования строки.
Подписывайтесь на канал 👉@pythonofff
7 293
+7
Сколько приложений нужно вашей команде для работы?
Всего один сервис — Битрикс24! А внутри десятки инструментов для совместной работы и бизнеса.
Читайте подробнее в карточках. Регистрируйтесь сейчас, чтобы забрать их все себе бесплатно😊
Зарегистрироваться
#реклама 16+
office-online.bitrix24.ru
О рекламодателе
7 293
Not a Number
В модуле math есть особый объект, который называется NaN (Not a Number).
Эти объекты NaN не уникальны, и даже не равны самим себе, так что вы можете иметь несколько подобных объектов, взятых из нескольких разных источников.
Например можно создать подобный объект, просто передав строку 'nan' во float. Кстати говоря, это значит что вы можете использовать NaN в качестве ключа в словаре (хотя мы и не советуем это делать).
Подписывайтесь на канал 👉@pythonofff
7 293
Перехожу на Go: чего НЕ стоит делать?
Приглашаем на бесплатный вебинар, где мы разберем ключевые ошибки и начнем писать Go-код правильно с самого начала.
На встрече мы:
🔸 изучим особенности синтаксиса, нюансы concurrency, обработки ошибок и управления памятью в Go;
🔸 расскажем о типичных ловушках, с которыми сталкиваются разработчики при переходе из других языков;
🔸 покажем, как правильно использовать концепции языка и не сломать себе мозг, разбираясь с GOрутинами.
Освоив эти принципы, вы сможете чувствовать себя увереннее в работе с Golang.
Когда: 29 апреля в 19:00
📌 Занять место на вебе — через бота-помощника.
erid: 2W5zFFwbK5a
7 293
Хранение в памяти
При создании списка, в памяти резервируется пустая область. С одной стороны, это ничем не отличается от создания любого другого типа данных, но разница в том, что содержимое list может меняться
Подписывайтесь на канал 👉@pythonofff
7 293
Будьте в курсе трендов корпоративных коммуникаций!
💰 Хотите знать, как сделать общение в команде эффективнее?
Ищете способы оптимизировать рабочие процессы?
⚡ В канале VK WorkSpace делимся инсайтами о трендах коммуникаций, кейсами компаний, внедривших платформу, и анонсами новых сервисов для продуктивной работы в организациях любого масштаба — от стартапов до корпораций.
✅ Подписывайтесь и получайте приглашения на вебинары, где эксперты расскажут, как вывести командную работу на новый уровень!
Подписаться
#реклама 16+
О рекламодателе
7 293
Вычисляем размер объектов в памяти
Чтобы вычислить размер какого-либо объекта, можно воспользоваться функцией sys.getsizeof(object[, default]). Поскольку Python написан в полном соответствии с парадигмой ООП, таким объектом может быть все что угодно.
Однако, следует помнить, что хотя все built-in (встроенные) объекты и вернут правильный размер, в общем случае это не должно быть верно для каких-либо пользовательских объектов.
Аргумент default позволяет определить значение, которое будет возвращено, если тип объекта не предоставляет средства для извлечения размера и вызовет TypeError .
Функция getsizeof вызывает метод __sizeof__ объекта и добавляет дополнительные служебные данные сборщика мусора, если конечно объект управляется сборщиком мусора.
Подписывайтесь на канал 👉@pythonofff
7 293
Проверяем, присвоено ли значение переменной окружения
Давайте создадим Python-файл со следующим скриптом для проверки переменных. Для чтения значений переменных мы используем модуль os, а модуль sys — для прекращения работы приложения.
Бесконечный цикл while непрерывно принимает от пользователя имена переменных и проверяет их значения до тех пор, пока пользователь не введёт имя переменной, которой не присвоено значение.
Если пользователь вводит имя переменной окружения, которой присвоено значение, это значение выводится, если же нет — выводится соответствующее сообщение и процесс останавливается.
Подписывайтесь на канал 👉@pythonofff
7 293
Получи грант до 1,2 млн руб. на обучение в магистратуре
Хочешь развиваться в сфере ИТ и получить фундаментальные знания с практикой?
Поступай в магистратуру Центрального университета!
- 4 офлайн программы по востребованным направлениям ИТ
- Онлайн-программа по машинному обучению
- 300 мест с грантами до 1,2 млн руб.
- Вечерние занятия и учеба по выходным — удобно совмещать с работой
- Обучение по модели STEM-образования: на стыке науки, технологий и бизнеса
- Возможность стажировок и трудоустройства в ведущих компаниях
- Государственный диплом за 2 года
Магистратура в Центральном университете — это современный подход к образованию, сильный преподавательский состав и актуальные кейсы от индустрии.
Оставляй заявку на грант уже сейчас!
Подать заявку
#реклама 16+
apply.centraluniversity.ru
О рекламодателе
7 293
Explicit Conversion Flag
Флаг явного преобразования используется для преобразования значения поля format перед его непосредственным форматированием.
Это поле можно использовать для переопределения поведения format для какого либо конкретного типа и форматирования значения. В настоящее время распространены два явных флага преобразования:
!r – преобразует значение в строку, используя функцию repr()
!s – преобразует значение в строку, используя функцию str()
В примере, в случае с флагом !r строка 'Hello' будет напечатана с кавычками в поле шириной не менее 20 символов, а в случае с флагом !s – без кавычек (в более удобном для чтения виде).
Подписывайтесь на канал 👉@pythonofff
7 293
⚙️Уже работаете с Rust, но хотите эффективно интегрировать его с другими языками? Или интересуетесь, как устроен процесс сборки и линковки в этом языке?
🗓На открытом вебинаре 24 апреля в 20:00 мск мы подробно разберем, как собирать и линковать библиотеки в Rust, как использовать Rust-библиотеки в других языках, а также реализуем Си ABI (Application Binary Interface). Вы получите знания, которые помогут вам повысить производительность ваших проектов и интегрировать Rust в существующие решения.
👨💻Урок будет полезен всем, кто хочет углубить свои знания в Rust, повысить квалификацию и навыки работы с библиотеками и системами. Вы сможете применять полученные знания в реальных проектах.
👉Присоединяйтесь к открытому вебинару и получите скидку на большое обучение «Rust Developer. Professional»: https://vk.cc/cKZKKP
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
7 293
Repost from Библиотека Python разработчика | Книги по питону
yield from — элегантная передача управления
Если вы пишете генераторы, которые вызывают другие генераторы — забудьте про for x in sub(): yield x. Есть способ проще и мощнее.
Оператор yield from позволяет передавать элементы из подгенератора напрямую, без лишнего кода. Но фишка не только в лаконичности — он также автоматически пробрасывает исключения и возвращаемые значения из подгенератора.
Вот классика:
def gen():
for x in range(3):
yield x
def wrapper():
for x in gen():
yield x
Можно короче и лучше:
def wrapper():
yield from gen()
Но главное — yield from пробрасывает return-значение из подгенератора (начиная с Python 3.3):
def sub():
yield 1
yield 2
return 'done'
def main():
result = yield from sub()
print('Sub returned:', result)
for _ in main():
pass
# Выведет: Sub returned: done
А ещё через yield from можно проксировать значения внутрь генератора — например, в сопрограммах:
def delegator():
result = yield from coroutine()
print('coroutine done:', result)
def coroutine():
x = yield
y = yield
return x + y
g = delegator()
next(g) # Старт
next(g) # coroutine ждет x
g.send(10) # x = 10
print(g.send(20)) # y = 20 → return 30
# Выведет: coroutine done: 30
Итог: если вы пишете генераторы — освоение yield from даст вам лаконичный синтаксис, проброс return-значений, исключений и взаимодействие на новом уровне.
👉@BookPython7 293
Как создать базовый объект timedelta в Python
Для начала давайте создадим базовый объект timedelta:
Итак, мы успешно создали объект timedelta. Теперь нам нужно создать «эталонное» время, чтобы можно было применить созданный нами объект timedelta для выполнения каких-нибудь арифметических действий.
Подписывайтесь на канал 👉@pythonofff
7 293
Татарская 35. Дом с видом на Кремль
Третьяковская галерея и тихие переулки старой Москвы, купеческие особняки и древние храмы, набережные канала и уютные кафе Пятницкой улицы. Всё это - домашний район для жителей ТАТАРСКОЙ 35.
ТАТАРСКАЯ 35 - дом, у подножья которого все Замоскворечье, а из окон открываются виды на знаковые достопримечательности Москвы. Здесь есть собственный велнес-центр, 100 м2 клубной инфраструктуры для жителей и двор-сад 1,8 га.
В доме представлены элитные квартиры, в том числе с авторской отделкой отделкой: итальянские кухни, европейская техника и сантехника, система "умный дом".
Квартиры на ТАТАРСКОЙ 35 сейчас доступны с 0% рассрочкой от застройщика на 2,5 года.
Узнать больше
Проектная декларация на сайте https://наш.дом.рф/. Застройщик: ООО "СЗ "ПРАКТИКА"
#реклама
btatarskaya35.ru
О рекламодателе
7 293
Ускоряем код с помощью векторизации
Одним из приемов для ускорения работы циклов является векторизация вычислений, т. е. использование функций, которые поддерживают операции над векторами.
Вообще лучший способ ускорить любой цикл – это отказаться от него. В примере выше для работы с функцией my_func мы могли бы вызвать ее в цикле для каждого элемента списка, но гораздо проще использовать vectorize.
По сути, vectorize преобразует функцию таким образом, что она начинает принимать весь вектор целиком, а не отдельный его элемент. Надо помнить, что такой подход не всегда приводит к значительному ускорению.
Подписывайтесь на канал 👉@pythonofff
7 293
Присваиваем значение переменной окружения
Для присвоения значения любой переменной среды используется функция setdefault().
Давайте напишем код, чтобы с помощью функции setdefault() изменить значение переменной DEBUG на True (по умолчанию установлено False). После установки значения мы проверим его функцией get().
Если мы сделали всё правильно, выведется сообщение «Режим отладки включен», в противном случае – «Режим отладки выключен».
Подписывайтесь на канал 👉@pythonofff
Available now! Telegram Research 2025 — the year's key insights 
