Python вопросы с собеседований
Вопросы с собеседований по Python @workakkk - админ @machinelearning_interview - вопросы с собесдований по Ml @pro_python_code - Python @data_analysis_ml - анализ данных на Python @itchannels_telegram - 🔥 главное в ит РКН: clck.ru/3FmrFd
Mostrar más📈 Análisis del canal de Telegram Python вопросы с собеседований
El canal Python вопросы с собеседований (@python_job_interview) en el segmento lingüístico de Ruso es un actor destacado. Actualmente la comunidad reúne a 24 824 suscriptores, ocupando la posición 5 383 en la categoría Tecnologías y Aplicaciones y el puesto 26 629 en la región Rusia.
📊 Métricas de audiencia y dinámica
Desde su creación el невідомо, el proyecto ha mostrado un crecimiento acelerado, reuniendo a 24 824 suscriptores.
Según los últimos datos del 13 julio, 2026, el canal mantiene una actividad estable. En los últimos 30 días la variación de miembros fue de -86, y en las últimas 24 horas de -10, conservando un alto alcance.
- Estado de verificación: No verificado
- Tasa de interacción (ER): El promedio de interacción de la audiencia es 7.20%. Durante las primeras 24 horas tras publicar, el contenido suele obtener 3.24% de reacciones respecto al total de suscriptores.
- Alcance de las publicaciones: Cada publicación recibe en promedio 1 787 visualizaciones. En el primer día suele acumular 805 visualizaciones.
- Reacciones e interacción: La audiencia responde de forma activa: el promedio de reacciones por publicación es 8.
- Intereses temáticos: El contenido se centra en temas clave como github, api, собеседование, git, docker.
📝 Descripción y política de contenido
El autor describe el recurso como un espacio para expresar opiniones subjetivas:
“Вопросы с собеседований по Python
@workakkk - админ
@machinelearning_interview - вопросы с собесдований по Ml
@pro_python_code - Python
@data_analysis_ml - анализ данных на Python
@itchannels_telegram - 🔥 главное в ит
РКН: clck.ru/3FmrFd”
Gracias a la alta frecuencia de actualizaciones (últimos datos recibidos el 14 julio, 2026), el canal mantiene la vigencia y un amplio alcance. La analítica demuestra que la audiencia interactúa activamente con el contenido, lo que lo convierte en un punto de referencia dentro de la categoría Tecnologías y Aplicaciones.
regex 1.13 появился макрос regex!.
Важно: это не compile-time regex.
Он не компилирует регулярку на этапе сборки.
Смысл другой: макрос закрывает частый паттерн, когда вы используете что-то вроде std::sync::LazyLock, чтобы регулярное выражение компилировалось примерно один раз, а не при каждом вызове.
То есть вместо ручной обёртки вокруг lazy-инициализации теперь есть более удобный встроенный способ.
PR: github.com/rust-lang/regex/pull/1371
t = ([],)
try:
t[0] += [1]
except TypeError as e:
print("Ошибка:", type(e).__name__)
print(t)
Многие думают:
Ошибка: TypeError
([],)
Но Python выведет:
Ошибка: TypeError
([1],)
Почему?
`t` — tuple, его нельзя менять.
Но внутри tuple лежит список, а список менять можно.
Оператор `+=` сначала мутирует список:
```python
[] -> [1]
```
А потом Python пытается записать результат обратно в tuple:
```python
t[0] = ...
```
И вот тут падает `TypeError`.
Итог странный: ошибка была, но данные уже изменились.
Главный урок:
immutable-контейнер не делает вложенные объекты immutable.
Если внутри tuple лежит list, этот list всё ещё можно изменить.
funcs = []
for i in range(3):
funcs.append(lambda: i)
print([f() for f in funcs])
Многие думают:
[0, 1, 2]
Но Python выведет:
[2, 2, 2]
Почему?
`lambda` не запоминает значение `i` в момент создания.
Она запоминает саму переменную.
Когда цикл закончился, `i` уже равно `2`.
Поэтому все функции смотрят на одно и то же последнее значение.
Правильный фикс:
```python
funcs = []
for i in range(3):
funcs.append(lambda i=i: i)
print([f() for f in funcs])
```
Теперь будет:
```python
[0, 1, 2]
```
Хитрость простая:
если создаёшь функцию в цикле — фиксируй значение через аргумент по умолчанию.iter() только для списков, но у него есть второй режим:
iter(callable, sentinel)
Он вызывает функцию снова и снова, пока она не вернёт sentinel.
Например, читать большой файл кусками без while True:
with open("video.mp4", "rb") as f:
for chunk in iter(lambda: f.read(8192), b""):
process(chunk)
Что происходит:
• lambda читает по 8192 байта
• когда файл закончится, read() вернёт b""
• цикл сам остановится
Выглядит мелко, но это чистый и питоновский способ убрать вечные:
while True:
chunk = f.read(8192)
if not chunk:
break
Редкая штука, которую приятно знать.pip install, лицензия MIT.
https://github.com/kjgpta/tracesagerequest_id, user_id или trace_id были доступны в любом месте кода, но без прокидывания через 20 функций?
Не делай так:
current_user = None
В async-приложении это ловушка. Один запрос может перезаписать данные другого.
Правильнее использовать contextvars:
from contextvars import ContextVar
request_id = ContextVar("request_id", default="-")
async def handler(req):
token = request_id.set(req.headers["X-Request-ID"])
try:
await process_order()
finally:
request_id.reset(token)
async def process_order():
print("trace:", request_id.get())
Почему это круто:
1. значение живёт внутри текущего async-контекста
2. параллельные запросы не смешиваются
3. не нужно таскать request_id по всем функциям
4. идеально для логов, tracing, middleware и background tasks
Особенно полезно в FastAPI, aiohttp, Celery-like воркерах и сервисах с большим количеством async-задач.
threading.local() был норм для потоков.
contextvars - нормальный инструмент для современного async Python.fig.text().
Пример:
import matplotlib.pyplot as plt
fig = plt.figure(figsize=(5, 8))
fig.text(
1, 0.15,
"Mouse vs Python",
fontsize=45,
color="blue",
ha="right",
va="bottom",
alpha=0.4,
rotation=25
)
plt.show()
Что здесь важно:
* fig.text() добавляет текст на всю фигуру, а не внутрь конкретной оси
* alpha=0.4 делает watermark полупрозрачным
* rotation=25 поворачивает надпись
* ha и va управляют привязкой текста по горизонтали и вертикали
Полезно для отчётов, графиков в блогах, внутренних дашбордов и картинок, которые могут разойтись без контекста.lambda:
q = lambda x: x and q([i for i in x[1:] if i <= x[0]]) + [x[0]] + q([i for i in x[1:] if i > x[0]])
Что тут происходит:
* берём первый элемент как pivot
* всё, что меньше или равно ему, рекурсивно сортируем слева
* сам pivot ставим в центр
* всё, что больше, рекурсивно сортируем справа
* если список пустой, возвращается пустой список
Работает красиво, но в продакшен так писать не надо. Это скорее пример того, насколько гибким может быть Python, чем нормальный стиль кода.
Минусы очевидные: плохая читаемость, рекурсия, лишние списки на каждом шаге и риск упереться в лимит рекурсии.
Но как демонстрация идеи quicksort в одну строку — выглядит эффектно.O(m log^(2/3) n)
Это первое улучшение для направленных разреженных графов со времён Fibonacci heap в 1987 году.
Tsinghua, Stanford, Max Planck. 17 страниц, которые ломают старое интуитивное объяснение про «Дейкстру быстрее нельзя».f_obj = open(path, 'w')
f_obj.write(some_data)
f_obj.close()
Код короткий, выглядит понятно, но есть проблема: если между open() и close() что-то упадёт, файл может остаться незакрытым.
Поэтому приходилось руками оборачивать всё в try / finally, следить за закрытием ресурса и не забывать cleanup на ошибках.
Потом в Python появился with, и этот бытовой ад стал намного чище:
with open(path, 'w') as f_obj:
f_obj.write(some_data)
Теперь файл закроется автоматически, даже если внутри блока случится исключение.
Это одна из тех фич Python, которые выглядят мелко, но сильно меняют стиль кода. with убирает ручное управление ресурсами и делает намерение очевидным: вот ресурс, вот область, где он нужен, после выхода из блока его надо корректно закрыть.
Используется не только для файлов:
- соединения с базой
- lock'и
- временные файлы
- сетевые подключения
- транзакции
- любые объекты с контекстным менеджером
Хороший Python-код часто начинается с простого правила: если ресурс надо открыть и потом закрыть, почти всегда нужен with.
#pythonlen()
- list.append()
- dict.get()
- sum()
- сортировка
- операции со строками
- часть работы со списками и словарями
Когда вы вызываете list.append(), Python не крутит всю логику добавления элемента на уровне байткода. Он платит небольшой overhead за вызов, а дальше попадает в C-функцию внутри CPython.
Медленный путь начинается там, где мы вручную гоняем данные по одному элементу:
total = 0
for x in data:
total += x
На каждой итерации интерпретатор должен выполнить байткод, достать объект, проверить типы, сделать операцию, обновить значение и перейти к следующему элементу. Для маленьких списков это незаметно. Для миллионов элементов это уже цена, которую вы платите за каждую итерацию.
Быстрый путь выглядит иначе:
total = sum(data)
Здесь цикл проталкивается внутрь реализации. Python остаётся удобной оболочкой, а основная работа выполняется ближе к нативному коду.
С NumPy та же идея, только ещё жёстче:
total = np.sum(data)
Внутренний цикл почти не возвращается в Python. Массив обрабатывается внутри оптимизированного нативного кода, а обратно приходит уже готовый результат.
Поэтому фраза «Python медленный» слишком грубая.
Точнее так:
Python-циклы дорогие
C-циклы дешёвые
built-in функции часто быстрее ручного кода
NumPy быстрый не из-за синтаксиса, а потому что не гоняет каждый элемент через интерпретатор
хороший Python-код старается как можно дольше оставаться внутри готовых операций и библиотек
Оптимизация Python часто начинается не с переписывания проекта на Go или Rust, а с простого вопроса:
можно ли убрать ручной цикл и отдать работу тому коду, который уже написан на C, C++ или Rust?
Python хорош не как самый быстрый исполнитель каждой операции.
Он хорош как удобный слой управления над быстрыми нативными кусками.