fa
Feedback

فریب کلاهبرداران را نخورید! تل‌متریو این کانال‌ها را شناسایی و برچسب‌گذاری می‌کند 👉 برای مشاهده برچسب، اشتراک تهیه کنید

Python вопросы с собеседований

Python вопросы с собеседований

رفتن به کانال در Telegram

Вопросы с собеседований по Python @workakkk - админ @machinelearning_interview - вопросы с собесдований по Ml @pro_python_code - Python @data_analysis_ml - анализ данных на Python @itchannels_telegram - 🔥 главное в ит РКН: clck.ru/3FmrFd

نمایش بیشتر

📈 تحلیل کانال تلگرام Python вопросы с собеседований

کانال Python вопросы с собеседований (@python_job_interview) در بخش زبانی روسی بازیگری فعال است. در حال حاضر جامعه شامل 24 949 مشترک است و جایگاه 5 319 را در دسته فناوری و برنامه‌ها و رتبه 26 101 را در منطقه روسيا دارد.

📊 شاخص‌های مخاطب و پویایی

از زمان ایجاد در невідомо، پروژه رشد سریعی داشته و 24 949 مشترک جذب کرده است.

بر اساس آخرین داده‌ها در تاریخ 29 اکتبر, 2026، کانال فعالیت پایداری دارد. در ۳۰ روز گذشته تغییر اعضا برابر 82 و در ۲۴ ساعت گذشته برابر -2 بوده و همچنان دسترسی گسترده‌ای حفظ شده است.

  • وضعیت تأیید: تأیید نشده
  • نرخ تعامل (ER): میانگین تعامل مخاطب 5.86% است و در ۲۴ ساعت نخست پس از انتشار، محتوا معمولاً 3.02% واکنش نسبت به کل مشترکان کسب می‌کند.
  • دسترسی پست‌ها: هر پست به طور میانگین 1 462 بازدید دریافت می‌کند. در اولین روز معمولاً 753 بازدید جمع‌آوری می‌شود.
  • واکنش‌ها و تعامل: مخاطبان به‌طور فعال حمایت می‌کنند؛ میانگین واکنش به هر پست 7 است.
  • علایق موضوعی: محتوا بر موضوعات کلیدی مانند github, api, собеседование, git, docker تمرکز دارد.

📝 توضیح و سیاست محتوایی

نویسنده این فضا را محل بیان دیدگاه‌های شخصی توصیف می‌کند:
“Вопросы с собеседований по Python @workakkk - админ @machinelearning_interview - вопросы с собесдований по Ml @pro_python_code - Python @data_analysis_ml - анализ данных на Python @itchannels_telegram - 🔥 главное в ит РКН: clck.ru/3FmrFd”

به لطف به‌روزرسانی‌های پرتکرار (آخرین داده در تاریخ 30 اکتبر, 2026)، کانال همواره به‌روز و دارای دسترسی بالاست. تحلیل‌ها نشان می‌دهد مخاطبان به‌طور فعال با محتوا تعامل دارند و آن را به نقطه اثرگذاری مهم در دسته فناوری و برنامه‌ها تبدیل کرده‌اند.

24 949
مشترکین
-224 ساعت
-237 روز
+8230 روز
آرشیو پست ها
\"\ntemplate = t\"

{user_input}

\"\n\n# Предположим, функция html() экранирует опасные символы\nsafe_output = html(template)\n\n\nЗачем это нужно?\n\nИдея проста: обеспечить безопасность по умолчанию при работе с внешними данными. Сегодня f-строки невероятно удобны, но могут стать причиной уязвимостей, если не учитывать контекст.\n\nПример:\n\n\n# Опасный подход с f-строкой\nquery = f\"SELECT * FROM users WHERE name = '{user_input}'\"\n\n\nС t-строками можно заранее создать шаблон и безопасно вставить данные позже, минимизируя риски.\n\nПочему мнения разделились?\n\nМногие разработчики задаются вопросом: зачем ещё один способ форматирования строк, если уже есть:\n\n- старые добрые `%`-форматирование,\n- метод .format(),\n- f-строки,\n- и сторонние шаблонизаторы вроде Jinja2.\n\nНекоторые опасаются, что добавление нового синтаксиса лишь усложнит язык без серьёзной необходимости.\n\nСторонники t-строк, однако, видят их потенциал в упрощении безопасной работы с текстом прямо в стандартной библиотеке Python.\n\nЗаключение\n\nT-строки — это попытка добавить в Python инструмент, который обеспечит безопасность шаблонов без привлечения сторонних библиотек. Будет ли это востребовано или останется малоиспользуемой функцией? Время покажет.\n\n🔗 Полное описание: [PEP 750](https://peps.python.org/pep-0750/)\n\nА как ты относишься к новым t-строкам? 💬","datePublished":"2025-05-07T16:53:03Z","dateModified":"2025-05-07T16:53:03Z","author":{"@type":"Organization","name":"Python вопросы с собеседований","url":"https://telemetr.io/fa/channels/1635717658-python_job_interview","image":"https://img.telemetr.io/c/1MHiSS/5474186619528527464?ty=x"},"publisher":{"@type":"Organization","name":"Python вопросы с собеседований","url":"https://telemetr.io/fa/channels/1635717658-python_job_interview","image":"https://img.telemetr.io/c/1MHiSS/5474186619528527464?ty=x"},"commentCount":2,"interactionStatistic":[{"@type":"InteractionCounter","interactionType":"https://schema.org/ViewAction","userInteractionCount":3334},{"@type":"InteractionCounter","interactionType":"https://schema.org/LikeAction","userInteractionCount":28},{"@type":"InteractionCounter","interactionType":"https://schema.org/ShareAction","userInteractionCount":22},{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":2}]}},{"@type":"ListItem","position":13,"item":{"@type":"SocialMediaPosting","@id":"https://telemetr.io/fa/channels/1635717658-python_job_interview/posts/1101","url":"https://telemetr.io/fa/channels/1635717658-python_job_interview/posts/1101","mainEntityOfPage":"https://telemetr.io/fa/channels/1635717658-python_job_interview/posts/1101","headline":"📝 Как составить резюме, чтобы попасть в Magnificent 7: анализ кейса Недавно инженер поделился своим резюме, к…","articleBody":"📝 Как составить резюме, чтобы попасть в Magnificent 7: анализ кейса\n\nНедавно инженер поделился своим резюме, которое помогло ему получить предложение работы от одной из rjvgfybb Magnificent 7 (Apple, Microsoft, Google, Amazon, Meta, Nvidia, Tesla).\n\nMagnificent 7 (в переводе — «Великолепная семёрка») — это современное неофициальное название семи крупнейших и самых влиятельных технологических компаний США, которые лидируют на фондовом рынке, в инновациях и в масштабе бизнеса.\n\nРазберём, что сделало его резюме успешным и чему можно научиться.\n\n📌 Главные выводы из резюме:\n\n1. Фокус на достижениях, а не обязанностях.\n\nМногие кандидаты в резюме просто перечисляют, *что они делали*, например:\n\n- “Разрабатывал API”\n- “Поддерживал базу данных”\n- “Писал скрипты для автоматизации”\n\n⚠️ Это описывает обязанности, но не показывает ценность или результат работы.\n\nВ успешном резюме инженер вместо этого написал, чего он достиг благодаря своей работе:\n\n✅ “Разработал API, который сократил время обработки данных на 30%” \n✅ “Оптимизировал запросы к базе данных, уменьшив среднее время ответа с 2 секунд до 0.5 секунд” \n✅ “Автоматизировал процесс деплоя, снизив количество ошибок на 15%”\n\nТакой подход показывает, как конкретно ваша работа помогла команде или бизнесу. \nРаботодатель видит результаты, которые вы приносите, а не просто описание того, что вы делали.\n\n💡 Почему это важно?\n\nBig Tech-компании ищут инженеров, которые:\n\n- Умеют оценивать влияние своей работы\n- Думают о метриках успеха\n- Приносят измеримый результат\n\nЕсли в резюме нет цифр, улучшений или влияния на процесс — работодатель сам должен это додумывать. \nА успешное резюме снимает вопросы и сразу показывает: “Вот что я сделал, вот как я улучшил продукт/процесс/результат.”\n\n\n2. Лаконичность и компактность.\n\n✅ 1 страница \n✅ Чёткая структура: “Опыт”, “Навыки”, “Образование” \n✅ Без фото, графиков, цветных рамок — чистый текст\n\n3. Цифры везде, где это возможно.\n\nЛюбое достижение сопровождается конкретной метрикой: улучшение производительности, сокращение времени, рост количества пользователей. \nДаже небольшие улучшения указаны численно.\n\n4. Поддержка через проекты с открытым кодом.\n\nИнженер приложил ссылку на GitHub с реальными проектами — это усилило доверие к нему Как с специалисту.\n\n5. Навыки — только релевантные вакансии.\n\nВ разделе Skills нет «MS Word» или «PowerPoint». \nТолько языки, технологии, инструменты, которые нужны для позиции (Python, Kubernetes, CI/CD, etc.).\n\n6. Интерншипы и стажировки — это опыт.\n\nКаждый опыт, даже в рамках стажировки, описан с результатами. \nВакансии в топ-компаниях ценят любую практику в реальной команде.\n\n---\n\n🎯 Что важно для Big Tech:\n\n✅ Результаты > Задачи. \n✅ Цифры. \n✅ 1 страница. \n✅ GitHub/портфолио. \n✅ Релевантные навыки.\n\n---\n\n🔥 Совет:\n\nВаше резюме — это реклама вас как продукта. \nПокажите пользу, которую вы можете принести, а не просто список обязанностей.\n\n➡️ Статья","datePublished":"2025-05-06T10:00:15Z","dateModified":"2025-05-06T10:00:15Z","author":{"@type":"Organization","name":"Python вопросы с собеседований","url":"https://telemetr.io/fa/channels/1635717658-python_job_interview","image":"https://img.telemetr.io/c/1MHiSS/5474186619528527464?ty=x"},"publisher":{"@type":"Organization","name":"Python вопросы с собеседований","url":"https://telemetr.io/fa/channels/1635717658-python_job_interview","image":"https://img.telemetr.io/c/1MHiSS/5474186619528527464?ty=x"},"commentCount":3,"interactionStatistic":[{"@type":"InteractionCounter","interactionType":"https://schema.org/ViewAction","userInteractionCount":2674},{"@type":"InteractionCounter","interactionType":"https://schema.org/LikeAction","userInteractionCount":15},{"@type":"InteractionCounter","interactionType":"https://schema.org/ShareAction","userInteractionCount":42},{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":3}]}},{"@type":"ListItem","position":14,"item":{"@type":"SocialMediaPosting","@id":"https://telemetr.io/fa/channels/1635717658-python_job_interview/posts/1100","url":"https://telemetr.io/fa/channels/1635717658-python_job_interview/posts/1100","mainEntityOfPage":"https://telemetr.io/fa/channels/1635717658-python_job_interview/posts/1100","headline":"🌟 Dynaconf — управление конфигурациями в Python без головной боли. Этот проект предлагает унифицированный спо…","articleBody":"🌟 Dynaconf — управление конфигурациями в Python без головной боли. Этот проект предлагает унифицированный способ работы с конфигурациями: от простых .toml-файлов до интеграции с Hashicorp Vault для хранения секретов. \n\nПроект выделяет из общей массы поддержка 5+ форматов с автоматическим парсинго, разделение настроек по средам, защита секретов через .gitignore и возможность использовать Redis/Vault. Для старта достаточно pip install dynaconf и одной команды dynaconf init, которая сгенерирует все необходимые файлы. \n\n🤖 GitHub\n\n@python_job_interview","datePublished":"2025-05-05T14:41:01Z","dateModified":"2025-05-05T14:41:01Z","author":{"@type":"Organization","name":"Python вопросы с собеседований","url":"https://telemetr.io/fa/channels/1635717658-python_job_interview","image":"https://img.telemetr.io/c/1MHiSS/5474186619528527464?ty=x"},"publisher":{"@type":"Organization","name":"Python вопросы с собеседований","url":"https://telemetr.io/fa/channels/1635717658-python_job_interview","image":"https://img.telemetr.io/c/1MHiSS/5474186619528527464?ty=x"},"commentCount":0,"interactionStatistic":[{"@type":"InteractionCounter","interactionType":"https://schema.org/ViewAction","userInteractionCount":2284},{"@type":"InteractionCounter","interactionType":"https://schema.org/LikeAction","userInteractionCount":8},{"@type":"InteractionCounter","interactionType":"https://schema.org/ShareAction","userInteractionCount":19}]}},{"@type":"ListItem","position":15,"item":{"@type":"SocialMediaPosting","@id":"https://telemetr.io/fa/channels/1635717658-python_job_interview/posts/1099","url":"https://telemetr.io/fa/channels/1635717658-python_job_interview/posts/1099","mainEntityOfPage":"https://telemetr.io/fa/channels/1635717658-python_job_interview/posts/1099","headline":"Порекомендуйте друга в Ozon Tech и получите 150 000 ₽. Важно: IT-команда ведущего e-com ищет специалистов уро…","articleBody":"Порекомендуйте друга в Ozon Tech и получите 150 000 ₽. \n\nВажно: IT-команда ведущего e-com ищет специалистов уровня senior+ в Data Science. Программа работает для тех, кто не работает в Ozon. \n\nПодробнее о том, за какие вакансии можно получить вознаграждение, здесь ⬅️","datePublished":"2025-05-05T12:41:43Z","dateModified":"2025-05-26T14:08:46Z","author":{"@type":"Organization","name":"Python вопросы с собеседований","url":"https://telemetr.io/fa/channels/1635717658-python_job_interview","image":"https://img.telemetr.io/c/1MHiSS/5474186619528527464?ty=x"},"publisher":{"@type":"Organization","name":"Python вопросы с собеседований","url":"https://telemetr.io/fa/channels/1635717658-python_job_interview","image":"https://img.telemetr.io/c/1MHiSS/5474186619528527464?ty=x"},"commentCount":0,"interactionStatistic":[{"@type":"InteractionCounter","interactionType":"https://schema.org/ViewAction","userInteractionCount":2482},{"@type":"InteractionCounter","interactionType":"https://schema.org/LikeAction","userInteractionCount":2},{"@type":"InteractionCounter","interactionType":"https://schema.org/ShareAction","userInteractionCount":7}]}},{"@type":"ListItem","position":16,"item":{"@type":"SocialMediaPosting","@id":"https://telemetr.io/fa/channels/1635717658-python_job_interview/posts/1098","url":"https://telemetr.io/fa/channels/1635717658-python_job_interview/posts/1098","mainEntityOfPage":"https://telemetr.io/fa/channels/1635717658-python_job_interview/posts/1098","headline":"🧩 Python‑задача: построить резолвер зависимостей для «мини‑PyPI» Нужно написать ядро пакетного менеджера — ал…","articleBody":"🧩 Python‑задача: построить резолвер зависимостей для «мини‑PyPI»\n\nНужно написать ядро пакетного менеджера — алгоритм, выбирающий набор совместимых версий библиотек под заданные ограничения. \nЗадача напоминает работу pip, npm или cargo, но в упрощённом формате, достаточном для тренировки графовых алгоритмов, backtracking и оптимизаций.\n\n## 📜 Входные данные\n\n1. catalog.json — «репозиторий» пакетов. \n \n {\n \"pandas\": {\n \"1.1.0\": { \"depends\": { \"numpy\": \">=1.17,<1.20\" } },\n \"1.3.5\": { \"depends\": { \"numpy\": \">=1.19,<1.22\", \"python-dateutil\": \">=2.7\" } }\n },\n \"numpy\": {\n \"1.18.5\": { \"depends\": {} },\n \"1.19.2\": { \"depends\": {} },\n \"1.21.0\": { \"depends\": {} }\n },\n \"python-dateutil\": {\n \"2.8.0\": { \"depends\": { \"six\": \">=1.5\" } },\n \"2.8.2\": { \"depends\": { \"six\": \">=1.5\" } }\n },\n \"six\": {\n \"1.14.0\": { \"depends\": {} },\n \"1.16.0\": { \"depends\": {} }\n }\n }\n \n *Ключ* — имя пакета; *значения* — версии → словарь зависимостей (`depends`). \n У каждой зависимости указан диапазон версий по SemVer‑синтаксису >=a,=1.1,<1.4\n python-dateutil==2.8.2\n \n\n## 🔧 Задача\n\nНаписать функцию\n\n\nresolve(catalog: dict[str, dict[str, dict]],\n requirements: list[str]) -> dict[str, str]\n\n\nкоторая возвращает словарь \n{package: chosen_version} — единственную консистентную конфигурацию, удовлетворяющую всем ограничениям, *либо* возбуждает UnresolvableError.\n\n### Правила\n\n1. Версия должна лежать в пересечении *всех* диапазонов, навешанных на пакет.\n2. Если диапазон пуст — конфликты нельзя игнорировать.\n3. Разрешение идёт по принципу «самая новая подходящая версия» (Greedy‑latest), но если она приводит к заведомому конфликту, надо откатиться («backtrack») и попробовать более старую.\n4. Каталог может быть большим (≥ 10 000 пакетов), алгоритм должен укладываться в секунды.\n5. Допустимо использовать только стандартную библиотеку + packaging.version/packaging.specifiers (pip‑compatible сравнение версий).\n\n## 🏁 Дополнительные челленджи\n\n* Кэшировать результаты проверки диапазонов, чтобы не пересчитывать одно и то же.\n* Оптимизировать порядок обхода графа (например, сначала пакеты с меньшим числом разрешимых версий).\n* Добавить «экзотики»: опциональные зависимости, extras (`pandas[perf]`) или marker‑выражения (`sys_platform == \"linux\"`).\n\n---\n\n# ✅ Референс‑решение (однофайловое, python 3.11)\n\n> *Не читайте решение в комментариях, пока не попробуете решить сами!*\n\n@python_job_interview","datePublished":"2025-05-02T10:01:30Z","dateModified":"2025-05-02T10:01:30Z","author":{"@type":"Organization","name":"Python вопросы с собеседований","url":"https://telemetr.io/fa/channels/1635717658-python_job_interview","image":"https://img.telemetr.io/c/1MHiSS/5474186619528527464?ty=x"},"publisher":{"@type":"Organization","name":"Python вопросы с собеседований","url":"https://telemetr.io/fa/channels/1635717658-python_job_interview","image":"https://img.telemetr.io/c/1MHiSS/5474186619528527464?ty=x"},"commentCount":0,"interactionStatistic":[{"@type":"InteractionCounter","interactionType":"https://schema.org/ViewAction","userInteractionCount":3151},{"@type":"InteractionCounter","interactionType":"https://schema.org/LikeAction","userInteractionCount":10},{"@type":"InteractionCounter","interactionType":"https://schema.org/ShareAction","userInteractionCount":24}]}},{"@type":"ListItem","position":17,"item":{"@type":"SocialMediaPosting","@id":"https://telemetr.io/fa/channels/1635717658-python_job_interview/posts/1097","url":"https://telemetr.io/fa/channels/1635717658-python_job_interview/posts/1097","mainEntityOfPage":"https://telemetr.io/fa/channels/1635717658-python_job_interview/posts/1097","headline":"🚀 FastUI — фреймворк, позволяющий собирать React-интерфейсы, описывая их декларативно на Python. Под капотом…","articleBody":"🚀 FastUI — фреймворк, позволяющий собирать React-интерфейсы, описывая их декларативно на Python. Под капотом у проекта набор Pydantic-моделей, которые автоматически преобразуются в TypeScript-типы и React-компоненты. \n\nХотя инструмент еще находится в стадии активной разработки, он уже демонстрирует интересный подход — бэкенд полностью определяет UI, а фронтенд становится исполнителем без собственной бизнес-логики.\n\n🤖 GitHub\n\n@python_job_interview","datePublished":"2025-04-30T13:02:49Z","dateModified":"2025-04-30T13:02:49Z","author":{"@type":"Organization","name":"Python вопросы с собеседований","url":"https://telemetr.io/fa/channels/1635717658-python_job_interview","image":"https://img.telemetr.io/c/1MHiSS/5474186619528527464?ty=x"},"publisher":{"@type":"Organization","name":"Python вопросы с собеседований","url":"https://telemetr.io/fa/channels/1635717658-python_job_interview","image":"https://img.telemetr.io/c/1MHiSS/5474186619528527464?ty=x"},"commentCount":1,"interactionStatistic":[{"@type":"InteractionCounter","interactionType":"https://schema.org/ViewAction","userInteractionCount":3113},{"@type":"InteractionCounter","interactionType":"https://schema.org/LikeAction","userInteractionCount":15},{"@type":"InteractionCounter","interactionType":"https://schema.org/ShareAction","userInteractionCount":30},{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":1}]}},{"@type":"ListItem","position":18,"item":{"@type":"SocialMediaPosting","@id":"https://telemetr.io/fa/channels/1635717658-python_job_interview/posts/1096","url":"https://telemetr.io/fa/channels/1635717658-python_job_interview/posts/1096","mainEntityOfPage":"https://telemetr.io/fa/channels/1635717658-python_job_interview/posts/1096","headline":"🖥 В этой статье автор делится опытом компиляции первой стабильной версии Python 1.0, выпущенной 27 января 199…","articleBody":"🖥 В этой статье автор делится опытом компиляции первой стабильной версии Python 1.0, выпущенной 27 января 1994 года, используя современные инструменты виртуализации!\n\n🌟 Для этого автор использует контейнеризацию с помощью Podman, разворачивая старую версию Debian (Debian 4.0) для создания подходящей среды. В процессе описываются шаги по настройке окружения, установке необходимых инструментов сборки и решению возникающих проблем, таких как несовместимость современных протоколов SSL/TLS при загрузке исходных кодов. После успешной компиляции Python 1.0 автор исследует его возможности, отмечая наличие высокоуровневых структур данных и поддержку работы с процессами, текстом, файлами и сетью, а также указывает на некоторые забавные особенности и ограничения той эпохи.\n\n🔗 Ссылка: *клик*\n\n@python_job_interview","datePublished":"2025-04-29T15:00:45Z","dateModified":"2025-04-29T15:00:45Z","author":{"@type":"Organization","name":"Python вопросы с собеседований","url":"https://telemetr.io/fa/channels/1635717658-python_job_interview","image":"https://img.telemetr.io/c/1MHiSS/5474186619528527464?ty=x"},"publisher":{"@type":"Organization","name":"Python вопросы с собеседований","url":"https://telemetr.io/fa/channels/1635717658-python_job_interview","image":"https://img.telemetr.io/c/1MHiSS/5474186619528527464?ty=x"},"commentCount":0,"interactionStatistic":[{"@type":"InteractionCounter","interactionType":"https://schema.org/ViewAction","userInteractionCount":2916},{"@type":"InteractionCounter","interactionType":"https://schema.org/LikeAction","userInteractionCount":7},{"@type":"InteractionCounter","interactionType":"https://schema.org/ShareAction","userInteractionCount":8}]}},{"@type":"ListItem","position":19,"item":{"@type":"SocialMediaPosting","@id":"https://telemetr.io/fa/channels/1635717658-python_job_interview/posts/1090","url":"https://telemetr.io/fa/channels/1635717658-python_job_interview/posts/1090","mainEntityOfPage":"https://telemetr.io/fa/channels/1635717658-python_job_interview/posts/1090","headline":"🖥 Linux — топ среди обучающих каналов для быстрого погружения Linux. Наглядные картинки и короткие видео - мы…","articleBody":"🖥 Linux — топ среди обучающих каналов для быстрого погружения Linux.\n\nНаглядные картинки и короткие видео - мы расскажем о всех секртетах Linux администрирования. \n\nПодписаться: t.me/linuxacademiya","datePublished":"2025-04-29T13:04:05Z","dateModified":"2025-04-29T13:04:05Z","author":{"@type":"Organization","name":"Python вопросы с собеседований","url":"https://telemetr.io/fa/channels/1635717658-python_job_interview","image":"https://img.telemetr.io/c/1MHiSS/5474186619528527464?ty=x"},"publisher":{"@type":"Organization","name":"Python вопросы с собеседований","url":"https://telemetr.io/fa/channels/1635717658-python_job_interview","image":"https://img.telemetr.io/c/1MHiSS/5474186619528527464?ty=x"},"commentCount":1,"interactionStatistic":[{"@type":"InteractionCounter","interactionType":"https://schema.org/ViewAction","userInteractionCount":2994},{"@type":"InteractionCounter","interactionType":"https://schema.org/LikeAction","userInteractionCount":2},{"@type":"InteractionCounter","interactionType":"https://schema.org/ShareAction","userInteractionCount":10},{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":1}]}},{"@type":"ListItem","position":20,"item":{"@type":"SocialMediaPosting","@id":"https://telemetr.io/fa/channels/1635717658-python_job_interview/posts/1089","url":"https://telemetr.io/fa/channels/1635717658-python_job_interview/posts/1089","mainEntityOfPage":"https://telemetr.io/fa/channels/1635717658-python_job_interview/posts/1089","headline":"🖥Задача: \"Динамическое кэширование с ограничением памяти и частотой запросов\" 🔖 Условие: Реализуйте класс Sma…","articleBody":"🖥Задача: \"Динамическое кэширование с ограничением памяти и частотой запросов\"\n\n🔖 Условие:\n\nРеализуйте класс SmartCache, который работает следующим образом:\n\n- Метод put(key: str, value: Any):\n - Сохраняет значение по ключу.\n - Если суммарный объем памяти, занимаемый всеми элементами, превышает лимит (например, 10 MB), автоматически удаляются наименее \"ценные\" элементы.\n\n- Метод get(key: str) -> Any:\n - Возвращает значение по ключу.\n - Увеличивает счётчик использования элемента.\n - Если элемент отсутствует — возвращает None.\n\nЧто значит \"ценность\" элемента:\n- Ценность = количество обращений (`hit count`) к элементу.\n- При очистке кэша сначала удаляются элементы с наименьшим количеством обращений.\n\nОграничения:\n- Класс должен корректно считать объём памяти, занимаемый элементами.\n- Нужно учитывать, что элементы могут быть сложными структурами (`dict`, list, вложенные объекты).\n- Решение должно быть эффективным: операции должны быть быстрыми даже при большом количестве элементов.\n\n---\n\n▪️ Подсказки:\n\n- Для оценки размера объектов можно использовать модуль sys.getsizeof, но для сложных вложенных структур нужен рекурсивный подсчет.\n- Для хранения частоты обращений стоит использовать дополнительную структуру данных (`collections.Counter` или `dict`).\n- При очистке лучше сначала группировать элементы по \"ценности\", а затем удалять самые \"дешевые\".\n\n---\n\n▪️ Что оценивается:\n\n- Умение работать с ограничениями по памяти.\n- Аккуратная обработка ссылок и размеров объектов.\n- Эффективность очистки кэша.\n- Чистота и читаемость кода.\n\n---\n\n▪️ Разбор возможного решения:\n\nИдея архитектуры:\n\n- Храним:\n - storage: словарь {key: value}.\n - hits: счётчик {key: hit_count}.\n - size: общий размер всех объектов.\n- При put():\n - Добавляем элемент.\n - Пересчитываем суммарный размер.\n - Если размер превышает лимит:\n - Удаляем наименее популярные элементы до тех пор, пока не уложимся в лимит.\n- При get():\n - Увеличиваем hit_count элемента.\n - Возвращаем значение или None.\n\nОценка размера объектов:\n\n- Простого sys.getsizeof недостаточно для коллекций.\n- Нужна функция, рекурсивно подсчитывающая размер всех вложенных объектов.\n\nМини-пример функции подсчета размера:\n\n\nimport sys\n\ndef deep_getsizeof(obj, seen=None):\n \"\"\"Рекурсивно считает память объекта и его вложенных объектов\"\"\"\n size = sys.getsizeof(obj)\n if seen is None:\n seen = set()\n obj_id = id(obj)\n if obj_id in seen:\n return 0\n seen.add(obj_id)\n\n if isinstance(obj, dict):\n size += sum([deep_getsizeof(v, seen) + deep_getsizeof(k, seen) for k, v in obj.items()])\n elif isinstance(obj, (list, tuple, set, frozenset)):\n size += sum(deep_getsizeof(i, seen) for i in obj)\n return size\n\n\nМини-пример интерфейса `SmartCache`:\n\n\nclass SmartCache:\n def __init__(self, max_size_bytes):\n self.max_size = max_size_bytes\n self.storage = {}\n self.hits = {}\n self.total_size = 0\n\n def put(self, key, value):\n # добавить логику добавления и очистки при переполнении\n pass\n\n def get(self, key):\n # увеличить hit_count и вернуть значение\n pass\n\n\n🔖 Дополнительные вопросы:\n\n- Как ускорить очистку кэша без полного перебора всех элементов?\n- Как сделать потокобезопасную версию кэша?\n- Как адаптировать SmartCache для распределённой архитектуры (кэш между несколькими машинами)?\n\n@python_job_interview","datePublished":"2025-04-27T13:00:56Z","dateModified":"2025-04-27T13:00:56Z","author":{"@type":"Organization","name":"Python вопросы с собеседований","url":"https://telemetr.io/fa/channels/1635717658-python_job_interview","image":"https://img.telemetr.io/c/1MHiSS/5474186619528527464?ty=x"},"publisher":{"@type":"Organization","name":"Python вопросы с собеседований","url":"https://telemetr.io/fa/channels/1635717658-python_job_interview","image":"https://img.telemetr.io/c/1MHiSS/5474186619528527464?ty=x"},"commentCount":1,"interactionStatistic":[{"@type":"InteractionCounter","interactionType":"https://schema.org/ViewAction","userInteractionCount":2306},{"@type":"InteractionCounter","interactionType":"https://schema.org/LikeAction","userInteractionCount":13},{"@type":"InteractionCounter","interactionType":"https://schema.org/ShareAction","userInteractionCount":22},{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":1}]}}]}
🐍 Хитрая задача на замыкания в Python 🔹 Уровень: Advanced 🔹 Темы: замыкания (closures), переменные цикла, lambda, отложенное выполнение 📌 Условие Что выведет следующий код?

funcs = []

for i in range(5):
    funcs.append(lambda: i)

results = [f() for f in funcs]
print(results)
❓ Вопросы 1. Почему вывод может не соответствовать ожиданиям [0, 1, 2, 3, 4]? 2. Что именно "запоминает" lambda внутри цикла? 3. Как переписать код, чтобы результат был [0, 1, 2, 3, 4]? 🔍 Разбор ✅ Ожидаемый (неправильный) вывод:
[4, 4, 4, 4, 4]
🔧 Почему так происходит - Все lambda внутри funcs замыкают одну и ту же переменную `i`. - К моменту выполнения f() переменная i уже равна 4 — и так для всех функций. ⚠️ Подвох lambda: i не захватывает значение, а ссылается на переменную, которая будет изменяться при каждой итерации цикла. В итоге — все lambda ссылаются на одно и то же `i`, которое стало равно 4 к концу цикла. 🧠 Решение Нужно "зафиксировать" значение i, передав его как аргумент по умолчанию в lambda:

for i in range(5):
    funcs.append(lambda i=i: i)
Теперь результат будет:
[0, 1, 2, 3, 4]
📌 Это один из самых частых подвохов в Python, особенно при использовании лямбда-функций в генераторах и UI-коллбеках.

🔍Тестовое собеседование на Middle Python-разработчика в четверг 22 мая(в четверг) в 19:00 по мск приходи онлайн на открытое
🔍Тестовое собеседование на Middle Python-разработчика в четверг 22 мая(в четверг) в 19:00 по мск приходи онлайн на открытое собеседование, чтобы посмотреть на настоящее интервью на Middle Python-разработчика. Собес проведет Вадим Пуштаев, ex. head of backend в 💙, автор канала @pythonetc, архитектор в европейской компании Как это будет: 📂 Вадим будет задавать реальные вопросы и задачи разработчику-добровольцу 📂 Вадим будет комментировать каждый ответ респондента, чтобы дать понять чего от вас ожидает собеседующий на интервью 📂 В конце можно будет задать любой вопрос Вадиму Это бесплатно. Эфир проходит в рамках менторской программы от ШОРТКАТ для Python-разработчиков, которые хотят повысить свой грейд, ЗП и прокачать скиллы. Переходи в нашего бота, чтобы получить ссылку на эфир → @shortcut_py_bot Реклама. ООО "ШОРТКАТ", ИНН: 9731139396, erid: 2Vtzqvtihsa

🐍 Задача с подвохом: mutable default arguments в Python 🔹 Уровень: Advanced 🔹 Темы: изменяемые аргументы по умолчанию, функции, ловушки с list и dict 📌 Условие Что выведет следующий код?

def append_to_list(value, my_list=[]):
    my_list.append(value)
    return my_list

print(append_to_list(1))
print(append_to_list(2))
print(append_to_list(3))
❓ Вопросы 1. Почему результат выглядит неожиданно? 2. Как исправить это поведение? 3. Когда стоит использовать изменяемые аргументы по умолчанию — если вообще стоит? 🔍 Разбор ✅ Ожидаемый вывод:
[1]
[1, 2]
[1, 2, 3]
🔧 Почему так происходит - Аргументы по умолчанию вычисляются один раз — во время определения функции, а не при каждом вызове. - Значение my_list=[] создаётся один раз и затем используется повторно при всех вызовах. - Все вызовы append_to_list изменяют один и тот же список. ⚠️ Подвох Это один из самых коварных багов в Python, особенно среди начинающих — кажется, что my_list должен быть новым на каждый вызов, но это не так. 🧠 Вывод - Никогда не используй изменяемые типы (list, dict, set) как значения по умолчанию. - Вместо этого используй None и создавай новый объект вручную:

def append_to_list(value, my_list=None):
    if my_list is None:
        my_list = []
    my_list.append(value)
    return my_list
✅ Тогда вывод будет:
[1]
[2]
[3]
📌 Это правило относится ко всем изменяемым типам: [], {}, set() и кастомные классы. @python_job_interview

Repost from Machinelearning
🚀 VS Code трансформируется в опенсорнсый ИИ-редактор! Команда Visual Studio Code объявила о планах трансформировать VS Code
🚀 VS Code трансформируется в опенсорнсый ИИ-редактор! Команда Visual Studio Code объявила о планах трансформировать VS Code в редактор с открытым исходным кодом для работы с ИИ. Конкуренция - двигатели прогресса! Где-то напряглась команда Cursor 🤓 🔗 Подробности: aka.ms/open-source-ai-editor #VSCode #OpenSource #ИИ #Разработка #Сообщество

🌟 FastAPI-Limiter — простое ограничение запросов для FastAPI. Эта библиотека добавляет rate limiting буквально в несколько с
🌟 FastAPI-Limiter — простое ограничение запросов для FastAPI. Эта библиотека добавляет rate limiting буквально в несколько строк кода, используя Redis как хранилище для счетчиков. Достаточно добавить Depends(RateLimiter(times=2, seconds=5)) к эндпоинту и он начнет отклонять запросы после двух обращений в пятисекундном окне. Под капотом работает Lua-скрипт, который эффективно считает запросы без лагов. Интересные фишки: — Поддержка вебсокетов через WebSocketRateLimiter — Кастомизация идентификаторов — Множественные лимиты на один роут 🤖 GitHub @python_job_interview

🐍 Хитрая задача на Python: замыкание + nonlocal 📌 Задача: Напиши функцию counter(start), которая возвращает функцию-счётчик. Каждый вызов этой функции увеличивает значение на 1. Пример:

c = counter(10)
print(c())  # 11
print(c())  # 12
print(c())  # 13

d = counter(100)
print(d())  # 101
print(c())  # 14  ← работает независимо
🎯 Подвох: - Нельзя использовать глобальные переменные - Нужно использовать замыкание - Без nonlocal — не заработает ✅ Решение:

def counter(start):
    count = start
    def inner():
        nonlocal count
        count += 1
        return count
    return inner

# Проверка
a = counter(5)
print(a())  # 6
print(a())  # 7

b = counter(100)
print(b())  # 101
print(a())  # 8
🧠 Объяснение подвоха: - counter возвращает функцию, внутри которой count сохраняется в замыкании - nonlocal нужен, чтобы изменить внешнюю переменную, а не просто читать её - Каждое замыкание имеет своё независимое состояние ⚠️ Без nonlocal count, Python создаст локальную count внутри inner(), и UnboundLocalError — гарантирован 🛠️ Применяется в: • Реализации генераторов состояния • Мини-хранилищах внутри функций • Кеширующих функциях и декораторах @python_job_interview

🐍 Задача на внимательность и глубокое понимание Python: ловушка `defaultdict` и мутабельных объектов Представьте, что вы разрабатываете систему трекинга активностей пользователей на сайте. Вам нужно собрать словарь, где каждому пользователю соответствует список его действий. Вы решаете использовать collections.defaultdict(list) для удобства, и пишете такой код:

from collections import defaultdict

actions = defaultdict(list)

def track(user_id, action):
    actions[user_id].append(action)

track('alice', 'login')
track('bob', 'view')
track('alice', 'logout')

# Теперь вы хотите скопировать этот словарь
copy_actions = actions.copy()

# Допишем в оригинал
track('bob', 'logout')

# Посмотрим, как выглядит копия
print(copy_actions['bob'])  # Что будет напечатано?
🧠 Вопрос: Что будет напечатано? Почему? Как сделать так, чтобы copy_actions не изменился при добавлении новых действий в actions? 💥 Подвох Метод copy() копирует только верхний уровень словаря. То есть, списки значений не копируются — это всё те же самые объекты в памяти. Поэтому при track('bob', 'logout') список actions['bob'] изменяется, и это тот же самый список, что лежит в copy_actions['bob']. ➡️ Ответ: print(copy_actions['bob']) напечатает ['view', 'logout']. ✅ Как правильно? Чтобы избежать такой проблемы, используйте глубокое копирование: import copy copy_actions = copy.deepcopy(actions) Теперь copy_actions не изменится при дальнейшем редактировании actions. 📌 Вывод Даже опытные разработчики иногда забывают: copy() не копирует вложенные структуры данных! Если в значениях словаря лежат мутабельные объекты, обязательно подумайте — а не нужен ли вам deepcopy()? 🧪 Попробуйте изменить defaultdict(list) на обычный dict — и посмотрите, что изменится.

🔍Тестовое собеседование на Middle Python-разработчика в четверг 15 мая(в четверг) в 19:00 по мск приходи онлайн на открытое
🔍Тестовое собеседование на Middle Python-разработчика в четверг 15 мая(в четверг) в 19:00 по мск приходи онлайн на открытое собеседование, чтобы посмотреть на настоящее интервью на Middle Python-разработчика. Как это будет: 📂 Даня, старший разработчик в Авито, будет задавать реальные вопросы и задачи разработчику-добровольцу 📂 Даня будет комментировать каждый ответ респондента, чтобы дать понять чего от вас ожидает собеседующий на интервью 📂 В конце можно будет задать любой вопрос Дане Это бесплатно. Эфир проходит в рамках менторской программы от ШОРТКАТ для Java-разработчиков, которые хотят повысить свой грейд, ЗП и прокачать скиллы. Переходи в нашего бота, чтобы получить ссылку на эфир → @shortcut_py_bot Реклама. ООО "ШОРТКАТ", ИНН: 9731139396, erid: 2VtzqxCZjDW

📚 Django Styleguide — готовый гайд по архитектуре проектов для Django-разработки, основанные на опыте коммерческих проектов.
📚 Django Styleguide — готовый гайд по архитектуре проектов для Django-разработки, основанные на опыте коммерческих проектов. Здесь сделан акцент на разделение бизнес-логики: сервисы для записи данных, селекторы для чтения и чёткие правила валидации в моделях. Особенно полезен среди прочих раздел про обработку ошибок в DRF и примеры тестирования сложных сценариев. Авторы предлагают адаптировать подходы под конкретные задачи, а полный пример проекта вынесен в отдельный репозиторий. 🤖 GitHub @python_job_interview

🐍 Задача с подвохом на Python. Что выведет данный код?
def update_dict(key, value, d={}):
    d[key] = value
    return d

dict1 = update_dict('a', 1)
dict2 = update_dict('b', 2, {})
dict3 = update_dict('c', 3)

print("dict1 =", dict1)
print("dict2 =", dict2)
print("dict3 =", dict3)
— Варианты ответа: A.
dict1 = {'a': 1}  
dict2 = {'b': 2}  
dict3 = {'c': 3}
B.
dict1 = {'a': 1, 'c': 3}  
dict2 = {'b': 2}  
dict3 = {'a': 1, 'c': 3}
C.
dict1 = {'a': 1}  
dict2 = {'b': 2}  
dict3 = {'a': 1, 'c': 3}
Какой из этих ответов правильный и почему?🧐 — Подсказка: аргументы по умолчанию в Python вычисляются только один раз - при определении функции. Словарь, как и список, является изменяемым объектом. В функции update_dict параметр d={} создается один раз и используется для всех вызовов, где не передается явно другой словарь. — Правильный ответ: B Объяснение: 1️⃣ dict1 = update_dict('a', 1) → используется словарь по умолчанию → {'a': 1} 2️⃣ dict2 = update_dict('b', 2, {}) → создан новый словарь → {'b': 2} 2️⃣ dict3 = update_dict('c', 3) → снова используется исходный словарь → {'a': 1, 'c': 3} 4️⃣ dict1 тоже изменится, так как это ссылка на тот же объект → {'a': 1, 'c': 3} Итоговый вывод: dict1 = {'a': 1, 'c': 3} dict2 = {'b': 2} dict3 = {'a': 1, 'c': 3} @python_job_interview

👩‍💻 Хочется выделить свой Github профиль для вашего резюме? 🔥 Просто скачайте этот скрипт и он создаст вам фейковую активн
👩‍💻 Хочется выделить свой Github профиль для вашего резюме? 🔥 Просто скачайте этот скрипт и он создаст вам фейковую активность путем отправки множества пустых коммитов в случайном количестве! 🔐 Лицензия: Apache-2.0 🖥 Github @python_job_interview

🐍 Новая функция в Python 3.14: шаблонные строки — необходимость или излишняя сложность? Python 3.14 готовит к выходу новую возможность — шаблонные строки (template strings, или t-строки), предложенные в PEP 750. Несмотря на интересный замысел, эта функция уже вызвала горячие споры в сообществе разработчиков. Давайте разберёмся, что это и зачем нужно. Что такое t-строки? T-строки — это новый способ форматирования строк, внешне похожий на f-строки. Принцип прост: добавляем префикс t перед строкой, например:

t"Привет, {name}!"
Но ключевое отличие: вместо немедленного преобразования переменных в строку, как это делает f-строка, t-строка создаёт объект Template, который можно обработать позже. Это позволяет, например, безопасно подставлять пользовательские данные, снижая риск атак (XSS, SQL-инъекции и др.). Пример использования:

from string.templatelib import Template

user_input = "<script>alert('XSS')</script>"
template = t"<p>{user_input}</p>"

# Предположим, функция html() экранирует опасные символы
safe_output = html(template)
Зачем это нужно? Идея проста: обеспечить безопасность по умолчанию при работе с внешними данными. Сегодня f-строки невероятно удобны, но могут стать причиной уязвимостей, если не учитывать контекст. Пример:

# Опасный подход с f-строкой
query = f"SELECT * FROM users WHERE name = '{user_input}'"
С t-строками можно заранее создать шаблон и безопасно вставить данные позже, минимизируя риски. Почему мнения разделились? Многие разработчики задаются вопросом: зачем ещё один способ форматирования строк, если уже есть: - старые добрые `%`-форматирование, - метод .format(), - f-строки, - и сторонние шаблонизаторы вроде Jinja2. Некоторые опасаются, что добавление нового синтаксиса лишь усложнит язык без серьёзной необходимости. Сторонники t-строк, однако, видят их потенциал в упрощении безопасной работы с текстом прямо в стандартной библиотеке Python. Заключение T-строки — это попытка добавить в Python инструмент, который обеспечит безопасность шаблонов без привлечения сторонних библиотек. Будет ли это востребовано или останется малоиспользуемой функцией? Время покажет. 🔗 Полное описание: [PEP 750](https://peps.python.org/pep-0750/) А как ты относишься к новым t-строкам? 💬

📝 Как составить резюме, чтобы попасть в Magnificent 7: анализ кейса Недавно инженер поделился своим резюме, которое помогло
📝 Как составить резюме, чтобы попасть в Magnificent 7: анализ кейса Недавно инженер поделился своим резюме, которое помогло ему получить предложение работы от одной из rjvgfybb Magnificent 7 (Apple, Microsoft, Google, Amazon, Meta, Nvidia, Tesla). Magnificent 7 (в переводе — «Великолепная семёрка») — это современное неофициальное название семи крупнейших и самых влиятельных технологических компаний США, которые лидируют на фондовом рынке, в инновациях и в масштабе бизнеса. Разберём, что сделало его резюме успешным и чему можно научиться. 📌 Главные выводы из резюме: 1. Фокус на достижениях, а не обязанностях. Многие кандидаты в резюме просто перечисляют, *что они делали*, например: - “Разрабатывал API” - “Поддерживал базу данных” - “Писал скрипты для автоматизации” ⚠️ Это описывает обязанности, но не показывает ценность или результат работы. В успешном резюме инженер вместо этого написал, чего он достиг благодаря своей работе: ✅ “Разработал API, который сократил время обработки данных на 30%” ✅ “Оптимизировал запросы к базе данных, уменьшив среднее время ответа с 2 секунд до 0.5 секунд” ✅ “Автоматизировал процесс деплоя, снизив количество ошибок на 15%” Такой подход показывает, как конкретно ваша работа помогла команде или бизнесу. Работодатель видит результаты, которые вы приносите, а не просто описание того, что вы делали. 💡 Почему это важно? Big Tech-компании ищут инженеров, которые: - Умеют оценивать влияние своей работы - Думают о метриках успеха - Приносят измеримый результат Если в резюме нет цифр, улучшений или влияния на процесс — работодатель сам должен это додумывать. А успешное резюме снимает вопросы и сразу показывает: “Вот что я сделал, вот как я улучшил продукт/процесс/результат.” 2. Лаконичность и компактность. ✅ 1 страница ✅ Чёткая структура: “Опыт”, “Навыки”, “Образование” ✅ Без фото, графиков, цветных рамок — чистый текст 3. Цифры везде, где это возможно. Любое достижение сопровождается конкретной метрикой: улучшение производительности, сокращение времени, рост количества пользователей. Даже небольшие улучшения указаны численно. 4. Поддержка через проекты с открытым кодом. Инженер приложил ссылку на GitHub с реальными проектами — это усилило доверие к нему Как с специалисту. 5. Навыки — только релевантные вакансии. В разделе Skills нет «MS Word» или «PowerPoint». Только языки, технологии, инструменты, которые нужны для позиции (Python, Kubernetes, CI/CD, etc.). 6. Интерншипы и стажировки — это опыт. Каждый опыт, даже в рамках стажировки, описан с результатами. Вакансии в топ-компаниях ценят любую практику в реальной команде. --- 🎯 Что важно для Big Tech: ✅ Результаты > Задачи. ✅ Цифры. ✅ 1 страница. ✅ GitHub/портфолио. ✅ Релевантные навыки. --- 🔥 Совет: Ваше резюме — это реклама вас как продукта. Покажите пользу, которую вы можете принести, а не просто список обязанностей. ➡️ Статья

🌟 Dynaconf — управление конфигурациями в Python без головной боли. Этот проект предлагает унифицированный способ работы с ко
🌟 Dynaconf — управление конфигурациями в Python без головной боли. Этот проект предлагает унифицированный способ работы с конфигурациями: от простых .toml-файлов до интеграции с Hashicorp Vault для хранения секретов. Проект выделяет из общей массы поддержка 5+ форматов с автоматическим парсинго, разделение настроек по средам, защита секретов через .gitignore и возможность использовать Redis/Vault. Для старта достаточно pip install dynaconf и одной команды dynaconf init, которая сгенерирует все необходимые файлы. 🤖 GitHub @python_job_interview

Порекомендуйте друга в Ozon Tech и получите 150 000 ₽. Важно: IT-команда ведущего e-com ищет специалистов уровня senior+ в Da
Порекомендуйте друга в Ozon Tech и получите 150 000 ₽. Важно: IT-команда ведущего e-com ищет специалистов уровня senior+ в Data Science. Программа работает для тех, кто не работает в Ozon. Подробнее о том, за какие вакансии можно получить вознаграждение, здесь ⬅️

🧩 Python‑задача: построить резолвер зависимостей для «мини‑PyPI» Нужно написать ядро пакетного менеджера — алгоритм, выбирающий набор совместимых версий библиотек под заданные ограничения. Задача напоминает работу pip, npm или cargo, но в упрощённом формате, достаточном для тренировки графовых алгоритмов, backtracking и оптимизаций. ## 📜 Входные данные 1. catalog.json — «репозиторий» пакетов.

   {
     "pandas": {
       "1.1.0": { "depends": { "numpy": ">=1.17,<1.20" } },
       "1.3.5": { "depends": { "numpy": ">=1.19,<1.22", "python-dateutil": ">=2.7" } }
     },
     "numpy": {
       "1.18.5": { "depends": {} },
       "1.19.2": { "depends": {} },
       "1.21.0": { "depends": {} }
     },
     "python-dateutil": {
       "2.8.0": { "depends": { "six": ">=1.5" } },
       "2.8.2": { "depends": { "six": ">=1.5" } }
     },
     "six": {
       "1.14.0": { "depends": {} },
       "1.16.0": { "depends": {} }
     }
   }
   
*Ключ* — имя пакета; *значения* — версии → словарь зависимостей (`depends`). У каждой зависимости указан диапазон версий по SemVer‑синтаксису >=a,<b. 2. requirements.txt — то, что хочет пользователь:
   pandas>=1.1,<1.4
   python-dateutil==2.8.2
   
## 🔧 Задача Написать функцию

resolve(catalog: dict[str, dict[str, dict]],
        requirements: list[str]) -> dict[str, str]
которая возвращает словарь {package: chosen_version} — единственную консистентную конфигурацию, удовлетворяющую всем ограничениям, *либо* возбуждает UnresolvableError. ### Правила 1. Версия должна лежать в пересечении *всех* диапазонов, навешанных на пакет. 2. Если диапазон пуст — конфликты нельзя игнорировать. 3. Разрешение идёт по принципу «самая новая подходящая версия» (Greedy‑latest), но если она приводит к заведомому конфликту, надо откатиться («backtrack») и попробовать более старую. 4. Каталог может быть большим (≥ 10 000 пакетов), алгоритм должен укладываться в секунды. 5. Допустимо использовать только стандартную библиотеку + packaging.version/packaging.specifiers (pip‑compatible сравнение версий). ## 🏁 Дополнительные челленджи * Кэшировать результаты проверки диапазонов, чтобы не пересчитывать одно и то же. * Оптимизировать порядок обхода графа (например, сначала пакеты с меньшим числом разрешимых версий). * Добавить «экзотики»: опциональные зависимости, extras (`pandas[perf]`) или marker‑выражения (`sys_platform == "linux"`). --- # ✅ Референс‑решение (однофайловое, python 3.11) > *Не читайте решение в комментариях, пока не попробуете решить сами!* @python_job_interview

🚀 FastUI — фреймворк, позволяющий собирать React-интерфейсы, описывая их декларативно на Python. Под капотом у проекта набор
🚀 FastUI — фреймворк, позволяющий собирать React-интерфейсы, описывая их декларативно на Python. Под капотом у проекта набор Pydantic-моделей, которые автоматически преобразуются в TypeScript-типы и React-компоненты. Хотя инструмент еще находится в стадии активной разработки, он уже демонстрирует интересный подход — бэкенд полностью определяет UI, а фронтенд становится исполнителем без собственной бизнес-логики. 🤖 GitHub @python_job_interview

🖥 В этой статье автор делится опытом компиляции первой стабильной версии Python 1.0, выпущенной 27 января 1994 года, использ
🖥 В этой статье автор делится опытом компиляции первой стабильной версии Python 1.0, выпущенной 27 января 1994 года, используя современные инструменты виртуализации! 🌟 Для этого автор использует контейнеризацию с помощью Podman, разворачивая старую версию Debian (Debian 4.0) для создания подходящей среды. В процессе описываются шаги по настройке окружения, установке необходимых инструментов сборки и решению возникающих проблем, таких как несовместимость современных протоколов SSL/TLS при загрузке исходных кодов. После успешной компиляции Python 1.0 автор исследует его возможности, отмечая наличие высокоуровневых структур данных и поддержку работы с процессами, текстом, файлами и сетью, а также указывает на некоторые забавные особенности и ограничения той эпохи. 🔗 Ссылка: *клик* @python_job_interview

🖥 Linux — топ среди обучающих каналов для быстрого погружения Linux. Наглядные картинки и короткие видео - мы расскажем о вс
+5
🖥 Linux — топ среди обучающих каналов для быстрого погружения Linux. Наглядные картинки и короткие видео - мы расскажем о всех секртетах Linux администрирования. Подписаться: t.me/linuxacademiya

🖥Задача: "Динамическое кэширование с ограничением памяти и частотой запросов" 🔖 Условие: Реализуйте класс SmartCache, который работает следующим образом: - Метод put(key: str, value: Any): - Сохраняет значение по ключу. - Если суммарный объем памяти, занимаемый всеми элементами, превышает лимит (например, 10 MB), автоматически удаляются наименее "ценные" элементы. - Метод get(key: str) -> Any: - Возвращает значение по ключу. - Увеличивает счётчик использования элемента. - Если элемент отсутствует — возвращает None. Что значит "ценность" элемента: - Ценность = количество обращений (`hit count`) к элементу. - При очистке кэша сначала удаляются элементы с наименьшим количеством обращений. Ограничения: - Класс должен корректно считать объём памяти, занимаемый элементами. - Нужно учитывать, что элементы могут быть сложными структурами (`dict`, list, вложенные объекты). - Решение должно быть эффективным: операции должны быть быстрыми даже при большом количестве элементов. --- ▪️ Подсказки: - Для оценки размера объектов можно использовать модуль sys.getsizeof, но для сложных вложенных структур нужен рекурсивный подсчет. - Для хранения частоты обращений стоит использовать дополнительную структуру данных (`collections.Counter` или `dict`). - При очистке лучше сначала группировать элементы по "ценности", а затем удалять самые "дешевые". --- ▪️ Что оценивается: - Умение работать с ограничениями по памяти. - Аккуратная обработка ссылок и размеров объектов. - Эффективность очистки кэша. - Чистота и читаемость кода. --- ▪️ Разбор возможного решения: Идея архитектуры: - Храним: - storage: словарь {key: value}. - hits: счётчик {key: hit_count}. - size: общий размер всех объектов. - При put(): - Добавляем элемент. - Пересчитываем суммарный размер. - Если размер превышает лимит: - Удаляем наименее популярные элементы до тех пор, пока не уложимся в лимит. - При get(): - Увеличиваем hit_count элемента. - Возвращаем значение или None. Оценка размера объектов: - Простого sys.getsizeof недостаточно для коллекций. - Нужна функция, рекурсивно подсчитывающая размер всех вложенных объектов. Мини-пример функции подсчета размера:

import sys

def deep_getsizeof(obj, seen=None):
    """Рекурсивно считает память объекта и его вложенных объектов"""
    size = sys.getsizeof(obj)
    if seen is None:
        seen = set()
    obj_id = id(obj)
    if obj_id in seen:
        return 0
    seen.add(obj_id)

    if isinstance(obj, dict):
        size += sum([deep_getsizeof(v, seen) + deep_getsizeof(k, seen) for k, v in obj.items()])
    elif isinstance(obj, (list, tuple, set, frozenset)):
        size += sum(deep_getsizeof(i, seen) for i in obj)
    return size
Мини-пример интерфейса `SmartCache`:

class SmartCache:
    def __init__(self, max_size_bytes):
        self.max_size = max_size_bytes
        self.storage = {}
        self.hits = {}
        self.total_size = 0

    def put(self, key, value):
        # добавить логику добавления и очистки при переполнении
        pass

    def get(self, key):
        # увеличить hit_count и вернуть значение
        pass
🔖 Дополнительные вопросы: - Как ускорить очистку кэша без полного перебора всех элементов? - Как сделать потокобезопасную версию кэша? - Как адаптировать SmartCache для распределённой архитектуры (кэш между несколькими машинами)? @python_job_interview