Python вопросы с собеседований
Вопросы с собеседований по Python @workakkk - админ @machinelearning_interview - вопросы с собесдований по Ml @pro_python_code - Python @data_analysis_ml - анализ данных на Python @itchannels_telegram - 🔥 главное в ит РКН: clck.ru/3FmrFd
إظهار المزيد📈 نظرة تحليلية على قناة تيليجرام Python вопросы с собеседований
تُعد قناة Python вопросы с собеседований (@python_job_interview) في القطاع اللغوي الروسية لاعباً نشطاً. يضم المجتمع حالياً 24 822 مشتركاً، محتلاً المرتبة 5 258 في فئة التكنولوجيات والتطبيقات والمرتبة 26 472 في منطقة روسيا.
📊 مؤشرات الجمهور والحراك
منذ تأسيسه في невідомо، حقق المشروع نمواً سريعاً وجمع 24 822 مشتركاً.
بحسب آخر البيانات بتاريخ 25 أغسطس, 2026، تحافظ القناة على نشاط مستقر. خلال آخر 30 يوماً تغيّر عدد الأعضاء بمقدار -44، وفي آخر 24 ساعة بمقدار 0، مع بقاء الوصول العام مرتفعاً.
- حالة التحقق: غير موثّقة
- معدل التفاعل (ER): يبلغ متوسط تفاعل الجمهور 6.01%. وخلال أول 24 ساعة من النشر يحصد المحتوى عادةً 2.76% من ردود الفعل نسبةً إلى إجمالي المشتركين.
- وصول المنشورات: يحصل كل منشور على متوسط 1 492 مشاهدة. وخلال اليوم الأول يجمع عادةً 684 مشاهدة.
- التفاعلات والاستجابة: يتفاعل الجمهور بانتظام؛ متوسط التفاعلات لكل منشور يبلغ 6.
- الاهتمامات الموضوعية: يركز المحتوى على مواضيع رئيسية مثل github, api, собеседование, git, docker.
📝 الوصف وسياسة المحتوى
يصف المؤلف القناة بأنها مساحة للتعبير عن الآراء الذاتية:
“Вопросы с собеседований по Python
@workakkk - админ
@machinelearning_interview - вопросы с собесдований по Ml
@pro_python_code - Python
@data_analysis_ml - анализ данных на Python
@itchannels_telegram - 🔥 главное в ит
РКН: clck.ru/3FmrFd”
بفضل وتيرة التحديث المرتفعة (أحدث البيانات بتاريخ 28 أغسطس, 2026) تحافظ القناة على حداثتها ومستوى وصول مرتفع. وتُظهر التحليلات تفاعلاً نشطاً من الجمهور، ما يجعلها نقطة تأثير مهمة ضمن فئة التكنولوجيات والتطبيقات.
itertools.groupby — но не забудьте предварительно отсортировать данные по этому ключу, иначе группы будут неправильными.
from itertools import groupby
from operator import itemgetter
data = [
{"user": "alice", "score": 8},
{"user": "bob", "score": 5},
{"user": "alice", "score": 7},
{"user": "bob", "score": 9},
]
# Сортируем по ключу
data.sort(key=itemgetter("user"))
# Группируем и считаем средний балл
for user, items in groupby(data, key=itemgetter("user")):
scores = [i["score"] for i in items]
print(user, "avg score:", sum(scores) / len(scores))
#Python #itertools #groupby #lifehackwith open() вместо ручного закрытия файлов
Начинающие часто пишут так:
f = open("data.txt", "r")
data = f.read()
f.close()
Код рабочий, но если внутри произойдёт ошибка — файл может не закрыться. Это приведёт к утечкам ресурсов.
🚀 Правильный способ — использовать контекстный менеджер with open()
with open("data.txt", "r") as f:
data = f.read()
💡 Преимущества:
Файл закрывается автоматически, даже если произойдёт ошибка
Код становится короче и чище
Работает одинаково для чтения, записи и бинарных файлов
📊 Пример записи:
with open("output.txt", "w") as f:
f.write("Hello, Python!")
После выхода из блока with файл гарантированно закрыт, ничего вручную делать не нужно.
📌 Итог
Используйте with open() всегда, когда работаете с файлами. Это безопаснее, чище и надёжнее, чем open() + close().
import os
import pickle
import hashlib
def disk_cache(path="cache.pkl"):
def deco(func):
def wrapper(*a, **kw):
# Формируем ключ на основе байткода функции и аргументов
key = hashlib.md5(
pickle.dumps((func.__code__.co_code, a, kw))
).hexdigest()
# Проверка наличия кэша
if os.path.exists(path):
cache = pickle.load(open(path, "rb"))
if key in cache:
return cache[key]
else:
cache = {}
# Вычисление и сохранение результата
res = func(*a, **kw)
cache[key] = res
pickle.dump(cache, open(path, "wb"))
return res
return wrapper
return deco
@disk_cache()
def heavy_calc(x):
print("Вычисляю...")
return x ** 2
if __name__ == "__main__":
print(heavy_calc(10)) # первый вызов — вычисляет
print(heavy_calc(10)) # второй вызов — берёт из кэшаprint() для отладки: просто добавьте декоратор @snoop к функции, и он покажет пошаговое выполнение кода с значениями переменных.
Интегрируется с Jupyter, поддерживает глубину вложенных вызовов (depth=2) и даже умеет взрывать сложные структуры данных (watch_explode). Не требует сложной настройки — достаточно pip install snoop.
🤖 GitHub
@python_job_interview
a = 256
b = 256
print(a is b)
x = 257
y = 257
print(x is y)
❓Ожидаешь True в обоих случаях? Не всё так просто.
📌 В Python целые числа от -5 до 256 кешируются.
То есть a и b указывают на один и тот же объект → a is b → True
Но x и y — это уже разные объекты, потому что 257 не кешируется → x is y → False
⚠️ is сравнивает объекты, а не значения.
Если хочешь сравнить значения — используй ==
💡 Вывод: даже базовые типы могут вести себя неожиданно, если сравнивать их через is.Проблема поиска кратчайшего пути от одной вершины до всех остальных (SSSP) — одна из фундаментальных в теории графов, и её история тянется с 50-х годов прошлого века. Классический алгоритм Дейкстры, в связке с продвинутыми структурами данных, решает эту задачу за время, которое примерно пропорционально сумме числа рёбер и произведения числа вершин на логарифм от их же числа. Именно этот множитель - число вершин, умноженное на логарифм, долгое время считался теоретическим минимумом, так как в своей основе алгоритм Дейкстры побочно сортирует вершины по расстоянию от источника. Этот предел известен как «барьер сортировки» и казался непреодолимым.🟡Основная идея работы - гибрид из алгоритма Дейкстры и алгоритма Беллмана-Форда. Алгоритм Дейкстры на каждом шаге выбирает из "границы" - множества еще не обработанных вершин ту, что находится ближе всего к источнику. Это и создает узкое место, так как размер границы может достигать величины, сопоставимой с общим числом вершин в графе, и на каждом шаге требуется находить минимум. Алгоритм Беллмана-Форда, в свою очередь, не требует сортировки, но его сложность пропорциональна числу ребер, умноженному на количество шагов, что слишком долго. 🟡Новый подход использует рекурсию. Вместо того чтобы поддерживать полную отсортированную границу, алгоритм фокусируется на ее сокращении. А если граница слишком велика, то запускается несколько шагов алгоритма Беллмана-Форда из ее вершин. Это позволяет найти точное расстояние до некоторой части вершин, чьи кратчайшие пути коротки. Длинные же пути должны проходить через одну из "опорных" вершин, которых оказывается значительно меньше, чем вершин в исходной границе. Таким образом, сложная работа концентрируется только на этом небольшом наборе опорных точек. 🟡Принцип "разделяй и властвуй". Он рекурсивно разбивает задачу на несколько уровней. На каждом уровне применяется вышеописанная техника сокращения границы, что позволяет значительно уменьшить объем работы на каждую вершину, поскольку логарифмический множитель эффективно делится на другой, более медленно растущий логарифмический член. В итоге, путем подбора внутренних параметров алгоритма, которые являются специфическими функциями от логарифма числа вершин, и достигается итоговая временная сложность, пропорциональная числу ребер, умноженному на этот новый, более медленно растущий логарифмический множитель. ✔️ Зачем это нужно — Быстрее решаются задачи в навигации, графах дорог, сетях и планировании. — Доказано, что Дейкстра — не предел, и можно ещё ускорять поиск кратчайших путей. 🟡Arxiv @ai_machinelearning_big_data #AI #ML #Sorting #Graphs #Algorithm
pip install flet
Flet — фреймворк, предоставляющий Flutter компоненты для разработки кроссплатформенных приложений на Python (разработчики обещают расширять список поддерживаемых языков).
Flet не использует какие-то SDK, не компилирует код Python в код Dart и весь UI отображается с помощью встроенного Web сервера.
🖥 GitHub
🟡 Доки asyncio и декораторов:
import asyncio
def cache(func):
cache = {}
async def wrapper(*args):
if args not in cache:
cache[args] = await func(*args)
return cache[args]
return wrapper
@cache
async def expensive_operation(x):
await asyncio.sleep(1)
return x * 2
async def main():
tasks = [expensive_operation(i) for i in range(3)]
results = await asyncio.gather(*tasks)
print(results)
asyncio.run(main())
Вопрос:
Что будет выведено в консоль и почему?
Варианты ответов:
1) [0, 2, 4] — вывод корректный, кеширование работает
2) RuntimeError — возникает из-за неправильного использования await в декораторе
3) [0, 0, 0] — возникает ошибка кеширования
4) [2, 2, 2] — декоратор мешает асинхронности
Правильный ответ: 3)
Пояснение:
1️⃣ Проблема в декораторе: обычный def-декоратор не совместим с асинхронными функциями. При вызове await func(args) внутри wrapper, декоратор не дожидается выполнения корутины, возвращая None.
2️⃣ Почему [0, 0, 0]:
— cache[args] сохраняет не результат, а корутину (<coroutine object...>).
— При повторном обращении к кешу возвращается эта корутина, но await вне декоратора не применяется.
— Фактически, все задачи получают первую сохраненную корутину (для x=0), которая всегда возвращает 0.
3️⃣ Чтобы исправить код нужно использовать functools.wraps и сделать декоратор асинхронным.
Пишите свои варианты решения в комментариях 🔽
@python_job_interviewpandas → %load_ext cudf.pandas
- polars → .collect(engine="gpu")
- scikit-learn → %load_ext cuml.accel
- xgboost → device="cuda"
- umap → %load_ext cuml.accel
- hdbscan → %load_ext cuml.accel
- networkx → %env NX_CUGRAPH_AUTOCONFIG=True
🚀 Плюсы:
- Минимальные изменения кода (API почти идентичен).
- GPU-ускорение: от 10х до 100х быстрее на больших данных.
- Отлично подходит для ETL, ML и обработки сигналов.
Если ты работаешь с большими данными в Python, достаточно «заменить импорт» и получить колоссальный прирост скорости без боли и переписывания кода.
🚀 Подробнее: developer.nvidia.com/blog/7-drop-in-replacements-to-instantly-speed-up-your-python-data-science-workflows
@data_analysis_ml
import sys, os
from contextlib import contextmanager
@contextmanager
def suppress_print():
saved = sys.stdout
sys.stdout = open(os.devnull, 'w')
yield
sys.stdout.close()
sys.stdout = saved
Пример:
print("Это видно")
with suppress_print():
print("А это — нет")
print("Снова видно")asyncio вызывает боль? Потому что даже простая ошибка может сломать всю цепочку задач.
🐍 tinyio — это минималистичный event loop для Python (всего ~200 строк), который работает через yield, а не await, и делает асинхронность прозрачной.
Что умеет:
• yield вместо await: проще отлаживать и понимать
• Параллельный запуск: yield [task1(), task2()]
• Фоновые задачи: yield {task1(), task2()}
• Прерывание всех задач при одной ошибке
• Встроенные Lock, Semaphore, Event, timeout
Пример:
def slow_add(x):
yield tinyio.sleep(1)
return x + 1
def main():
a, b = yield [slow_add(1), slow_add(2)]
return a + b
Loop().run(main()) # → 5
Когда нужно просто и понятно — tinyio делает то, что должен. Никакой магии.
🔗 https://github.com/patrick-kidger/tinyio
@pythonl
# Медленно: обращение к свойствам объекта в цикле
class Processor:
def __init__(self, data):
self.data = data
def compute(self):
total = 0
for item in self.data:
total += item * item
return total
# Быстрее: кэшируем ссылку на data как локальную переменную
class Processor:
def __init__(self, data):
self.data = data
def compute(self):
data = self.data # локальная переменная
total = 0
for item in data:
total += item * item
return total
# Прирост в скорости особенно заметен при больших объёмах данных```