Python вопросы с собеседований
25K subscribers
513 photos
18 videos
17 files
411 links
Вопросы с собеседований по Python

@workakkk - админ

@machinelearning_interview - вопросы с собесдований по Ml

@pro_python_code - Python

@data_analysis_ml - анализ данных на Python

@itchannels_telegram - 🔥 главное в ит

РКН: clck.ru/3FmrFd
Download Telegram
This media is not supported in your browser
VIEW IN TELEGRAM
🖥 Хитрый способ изменить поведение цикла for — без изменения самого цикла

Можно ли сделать так, чтобы весь Python-код, использующий for x in ..., внезапно начал вести себя иначе — без изменения самого цикла?

Ответ: да, если переопределить поведение итератора. На экране показа — трюк, где обычный список «врет» в цикле и выдает неожиданные значения.

Трюк можно использовать и с dict, set и кастомными генераторами. Особенно удобно в юнит-тестах или визуализациях.


class FakeList(list):
def __iter__(self):
return iter(["test", "mock", "override"])

data = FakeList([1, 2, 3])
for x in data:
print(x) # выведет: test, mock, override


https://youtube.com/shorts/QhZtRx1ukoc?feature=share
Please open Telegram to view this post
VIEW IN TELEGRAM
8👍8🔥2🥰1
📥 Palanteer — инструмент для глубокого анализа производительности C++ и Python-приложений. Этот проект предлагает детальную телеметрию: от временных меток выполнения функций до отслеживания потребления памяти и переключений контекста.

Инструмент обладает минималистичной интеграцией: в C++ достаточно подключить один заголовочный файл, а Python-код анализируется автоматически. Визуализация в реальном времени включает временные графики, flame graphs и логи с наносекундным разрешением.

🤖 GitHub
3🔥1
🐍 Python-задача с подвохом: что напечатает код?


def extend_list(val, lst=[]):
lst.append(val)
return lst

list1 = extend_list(10)
list2 = extend_list(123, [])
list3 = extend_list('a')

print("list1 =", list1)
print("list2 =", list2)
print("list3 =", list3)


Варианты ответа:
1️⃣ list1 = [10], list2 = [123], list3 = ['a']
2️⃣ list1 = [10], list2 = [123], list3 = [10, 'a']
3️⃣ list1 = [10, 'a'], list2 = [123], list3 = [10, 'a']
4️⃣ list1 = [10, 'a'], list2 = [123], list3 = ['a']

---

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

---

Ответ:
list1 = [10, 'a']
list2 = [123]
list3 = [10, 'a']

🔎 Почему?
👉 Значение по умолчанию lst=[] создаётся один раз — при определении функции.
👉 Когда вызываем extend_list(10), значение 10 добавляется в этот общий список.
👉 Когда вызываем extend_list(123, []), передаём новый список, всё ок.
👉 Когда вызываем extend_list('a'), снова используется общий список из первого вызова.

Чтобы избежать этой ловушки:


def extend_list(val, lst=None):
if lst is None:
lst = []
lst.append(val)
return lst


🚀 Запомни: никогда не используй изменяемые объекты как значения по умолчанию для аргументов функции!

@python_job_interview
9
⚡️ Почему лучшие разработчики всегда на шаг впереди?

Потому что они знают, где брать настоящие инсайд!
Оставь “программирование в вакууме” в прошлом, выбирай свой стек — подпишись и погружайся в поток идей, лайфхаков и знаний, которые не найдёшь в открытом доступе.

ИИ: t.iss.one/ai_machinelearning_big_data
Python: t.iss.one/pythonl
Linux: t.iss.one/linuxacademiya
Мл собес t.iss.one/machinelearning_interview
C++ t.iss.one/cpluspluc
Docker: t.iss.one/DevopsDocker
Хакинг: t.iss.one/linuxkalii
МЛ: t.iss.one/machinelearning_ru
Devops: t.iss.one/DevOPSitsec
Data Science: t.iss.one/data_analysis_ml
Javascript: t.iss.one/javascriptv
C#: t.iss.one/csharp_ci
Java: t.iss.one/java_library
Базы данных: t.iss.one/sqlhub
Python собеседования: t.iss.one/python_job_interview
Мобильная разработка: t.iss.one/mobdevelop
Golang: t.iss.one/Golang_google
React: t.iss.one/react_tg
Rust: t.iss.one/rust_code
ИИ: t.iss.one/vistehno
PHP: t.iss.one/phpshka
Android: t.iss.one/android_its
Frontend: t.iss.one/front
Big Data: t.iss.one/bigdatai
МАТЕМАТИКА: t.iss.one/data_math
Kubernets: t.iss.one/kubernetc
Разработка игр: https://t.iss.one/gamedev
Физика: t.iss.one/fizmat
SQL: t.iss.one/databases_tg

Папка Go разработчика: t.iss.one/addlist/MUtJEeJSxeY2YTFi
Папка Python разработчика: t.iss.one/addlist/eEPya-HF6mkxMGIy
Папка ML: https://t.iss.one/addlist/2Ls-snqEeytkMDgy
Папка FRONTEND: https://t.iss.one/addlist/mzMMG3RPZhY2M2Iy

🎓954ГБ ОПЕНСОРС КУРСОВ: @courses
😆ИТ-Мемы: t.iss.one/memes_prog
🇬🇧Английский: t.iss.one/english_forprogrammers
🧠ИИ: t.iss.one/vistehno

🖥 Chatgpt для кода в тг: @Chatgpturbobot

📕Ит-книги: https://t.iss.one/addlist/BkskQciUW_FhNjEy
💼ИТ-вакансии t.iss.one/addlist/_zyy_jQ_QUsyM2Vi

Подпишись, чтобы всегда знать, куда двигаться дальше!
Please open Telegram to view this post
VIEW IN TELEGRAM
1
This media is not supported in your browser
VIEW IN TELEGRAM
🧠 Ускоряй Python циклы без NumPy — через встроенный `array.array`

Если ты используешь большие списки чисел в Python и работаешь с ними в цикле — знай: list медленный и неэффективный по памяти.

Есть способ ускорить операции в 2–5 раз без внешних библиотек — просто используй array точка array. Попробуй и напиши в комментах результат, на сколько ускорились твои функции.

from array import array

data = array('f', [0.1] * 10_000_000) # вместо обычного list

# быстрая арифметика
for i in range(len(data)):
data[i] *= 2.5


@python_job_interview
9🔥4👍3
This media is not supported in your browser
VIEW IN TELEGRAM
⚙️ Подменяй любые импорты в Python “на лету” — без изменения кода

Если ты хочешь протестировать модуль, подменить зависимость, замокать внешний сервис или обмануть импорт — не обязательно редактировать исходники. Python позволяет перехватывать импорты прямо во время выполнения, через sys.modules.

Вот минимальный приём, который делает это прозрачно:


import sys
import types

# Создаём фейковый модуль
fake = types.SimpleNamespace()
fake.get_data = lambda: "подмена работает"

# Подменяем импорт
sys.modules['external_service'] = fake

# Теперь даже import будет работать
import external_service
print(external_service.get_data()) # → "подмена работает"
🔥53👍2🥰1
🎙️ pytest-recording — плагин для записи и воспроизведения HTTP-запросов в тестах. Полезный инструмент для Python-разработчиков, который помогает сделать тесты, зависящие от внешних API, более стабильными и быстрыми. Плагин использует VCR.py под капотом, позволяя записывать реальные HTTP-взаимодействия в YAML-кассеты и затем воспроизводить их локально.

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

🤖 GitHub

@python_job_interview
3👍2
🔍Открытое собеседование на Python-бекендера с разработчиком из Avito и Яндекс во вторник

10 июля(уже в четверг!) в 19:00 по мск приходи онлайн на открытое собеседование, чтобы посмотреть на настоящее интервью на Middle Python-разработчика.

Как это будет:
📂 Савва Демиденко, ТехЛид с опытом в Яндексе и Авито, будет задавать реальные вопросы и задачи разработчику-добровольцу
📂 Савва будет комментировать каждый ответ респондента, чтобы дать понять чего от вас ожидает собеседующий на интервью
📂 В конце можно будет задать любой вопрос Савве

Это бесплатно. Эфир проходит в рамках менторской программы от ШОРТКАТ для Python-разработчиков, которые хотят повысить свой грейд, ЗП и прокачать скиллы.

Переходи в нашего бота, чтобы получить ссылку на эфир → @shortcut_py_bot

Реклама. ООО "ШОРТКАТ", ИНН: 9731139396, erid: 2VtzqxjiWL7
Please open Telegram to view this post
VIEW IN TELEGRAM
3
📌 Сложная задача для собеседования на Python: «Асинхронный кэш с TTL и инвалидацией».

Условие:
Реализуйте потокобезопасный асинхронный кэш с временем жизни записей, поддержкой инвалидации по ключу и автоматическим удалением устаревших записей. Кэш должен:
1️⃣ Хранить значения не дольше указанного TTL (seconds)
2️⃣ Автоматически очищать устаревшие записи без блокировки основного потока
3️⃣ Поддерживать асинхронные операции get/set
4️⃣ Иметь механизм ручной инвалидации
5️⃣ Гарантировать потокобезопасность
6️⃣ Оптимизировать память

Ожидаемое решение:
import asyncio
import time
from collections import OrderedDict
from typing import Any, Optional
import threading

class AsyncTTLCache:
def __init__(self, maxsize: int = 1024, ttl: int = 60):
self._cache = OrderedDict()
self._maxsize = maxsize
self._ttl = ttl
self._lock = threading.Lock()
self._cleanup_task = asyncio.create_task(self._cleanup_expired())

async def get(self, key: str) -> Optional[Any]:
with self._lock:
if key not in self._cache:
return None
value, expiry = self._cache[key]
if time.time() > expiry:
del self._cache[key]
return None
# Move to end to mark as recently used
self._cache.move_to_end(key)
return value

async def set(self, key: str, value: Any) -> None:
with self._lock:
if key in self._cache:
self._cache.move_to_end(key)
self._cache[key] = (value, time.time() + self._ttl)
if len(self._cache) > self._maxsize:
self._cache.popitem(last=False)

async def invalidate(self, key: str) -> None:
with self._lock:
if key in self._cache:
del self._cache[key]

async def _cleanup_expired(self) -> None:
while True:
await asyncio.sleep(self._ttl)
with self._lock:
now = time.time()
expired_keys = [
k for k, (_, expiry) in self._cache.items()
if expiry <= now
]
for k in expired_keys:
del self._cache[k]

def __del__(self):
self._cleanup_task.cancel()


# Пример использования
async def main():
cache = AsyncTTLCache(ttl=2)

await cache.set("a", 1)
print(await cache.get("a")) # 1

await asyncio.sleep(3)
print(await cache.get("a")) # None

await cache.set("b", 2)
await cache.invalidate("b")
print(await cache.get("b")) # None

asyncio.run(main())

Предлагайте свои варианты решения в комментариях⏬️

@python_job_interview
🔥115👍2