Python вопросы с собеседований
Вопросы с собеседований по Python @workakkk - админ @machinelearning_interview - вопросы с собесдований по Ml @pro_python_code - Python @data_analysis_ml - анализ данных на Python @itchannels_telegram - 🔥 главное в ит РКН: clck.ru/3FmrFd
Ko'proq ko'rsatish📈 Telegram kanali Python вопросы с собеседований analitikasi
Python вопросы с собеседований (@python_job_interview) Rus til segmentidagi kanali faol ishtirokchi. Hozirda hamjamiyat 24 966 obunachidan iborat bo'lib, Texnologiyalar & Aralashmalar toifasida 5 488-o'rinni va Rossiya mintaqasida 26 804-o'rinni egallagan.
📊 Auditoriya ko‘rsatkichlari va dinamika
невідомо sanasidan buyon loyiha tez o‘sib, 24 966 obunachiga ega bo‘ldi.
05 Iyun, 2026 dagi oxirgi ma’lumotlarga ko‘ra kanal barqaror faollikka ega. Oxirgi 30 kunda obunachilar soni -153 ga, so‘nggi 24 soatda esa -5 ga o‘zgardi va umumiy qamrov yuqori darajada qolmoqda.
- Tasdiqlash holati: Tasdiqlanmagan
- Jalb etish (ER): Auditoriya o‘rtacha 6.12% darajada jalb etiladi. Nashrdan keyingi dastlabki 24 soatda kontent odatda umumiy obunachilar sonining 3.05% ini tashkil etuvchi reaksiyalarni to‘playdi.
- Post qamrovi: Har bir post o‘rtacha 1 527 marta ko‘riladi; birinchi sutkada odatda 762 ta ko‘rish yig‘iladi.
- Reaksiyalar va o‘zaro ta’sir: Auditoriya faol: har bir postga o‘rtacha 8 ta reaksiya keladi.
- Tematik yo‘nalishlar: Kontent github, api, собеседование, git, docker kabi asosiy mavzularga jamlangan.
📝 Tavsif va kontent siyosati
Muallif resursni shaxsiy fikrni ifoda etish maydoni sifatida ta’riflaydi:
“Вопросы с собеседований по Python
@workakkk - админ
@machinelearning_interview - вопросы с собесдований по Ml
@pro_python_code - Python
@data_analysis_ml - анализ данных на Python
@itchannels_telegram - 🔥 главное в ит
РКН: clck.ru/3FmrFd”
Yuqori yangilanish chastotasi (oxirgi ma’lumot 06 Iyun, 2026 da olingan) sababli kanal doimo dolzarb va katta qamrovli bo‘lib qoladi. Analitika auditoriya kontent bilan faol hamkorlik qilishini, uni Texnologiyalar & Aralashmalar toifasidagi muhim ta’sir nuqtasiga aylantirishini ko‘rsatadi.
map, max, join — всё это написано на C и работает быстрее ручных циклов.
4. Пиши list/dict comprehensions и используй zip, enumerate
Это компактнее, читабельнее и часто быстрее классических for-циклов.
5. Генераторы вместо списков, где не нужен весь набор сразу
Снижают потребление памяти и ускоряют обработку.
6. Переход на PyPy или JIT‑ускорители
PyPy, Numba и Cython могут дать прирост производительности в 2–100 раз для тяжёлых вычислений.
7. Избегай преждевременной оптимизации
Оптимизируй только то, что реально тормозит. Профайлер покажет, где именно.
🧩 Быстрый чек-лист:
• Измерил ли я время выполнения?
• Подходящие ли структуры данных?
• Используются ли встроенные функции?
• Применены ли comprehensions и генераторы?
• Рассматривал ли я PyPy или JIT?
• Код по-прежнему читаемый?
✅ Вывод: даже новичок может писать быстрый и понятный Python-код. Главное — думать, замерять и улучшать без фанатизма.
▶️ Подробности с кодом
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]
Но фактически вывод будет:
python [1] [1, 2] [1, 2, 3]🔍 Почему так происходит? Параметр my_list=[] создаётся один раз — при определении функции. И он сохраняется между вызовами. То есть все вызовы функции используют один и тот же список по умолчанию. Это одна из самых частых ошибок в продакшене. ✅ Правильный способ — использовать 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]Каждый вызов получает новый список. ⚠️ Если вы работаете с функциями, которые принимают списки или словари — всегда проверяйте, не мутируется ли значение между вызовами.
torch, tensorflow`), но они не всегда нужны — не загружай их зря. Python позволяет **отложить импорт до первого использования**, через встроённый `importlib.
Вот как это выглядит на практике:
import importlib
# Обёртка для ленивого импорта
def lazy_import(name):
return importlib.util.LazyLoader(importlib.import_module(name))
# Использование
np = lazy_import('numpy')
# numpy ещё не загружен
# Теперь загрузится:
print(np.array([1, 2, 3]))
pip install gremllm
🔧 Пример:
from gremllm import Gremllm
counter = Gremllm('counter')
counter.value = 5
counter.increment()
print(counter.value) # → 6?
print(counter.to_roman_numerals()) # → VI?
🧩 Возможности:
– Динамическое поведение: всё определяется "на лету" с помощью LLM
– Поддержка OpenAI, Claude, Gemini, и локальных моделей
– Wet Mode: можно строить цепочки вызовов (методы возвращают объекты)
– Verbose Mode: выводит, какой код был сгенерирован
– Умная обработка ошибок и настройка через наследование
⚠️ Это экспериментальный инструмент. Не для продакшена. Но очень интересен для изучения LLM-интеграций в Python-код.
🔗 Репозиторий: https://github.com/ur-whitelab/gremllm
@pythonl
import functools
import logging
def log(level=logging.INFO):
def decorator(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
logging.log(level, f"Вызов {func.__name__} с args={args}, kwargs={kwargs}")
return func(*args, **kwargs)
return wrapper
return decorator
@log(logging.DEBUG)
def compute(x, y):
return x + y
✅ Зачем это нужно:
Декоратор гибко настраивается;
Подходит для трассировки в проде и отладки в деве;
Сохраняет сигнатуру и docstring благодаря @functools.wraps.
⚠️ Совет: избегай вложенности >2 уровней и всегда пиши тесты на поведение декоратора.
Python даёт инструменты, которые выглядят магией, но работают стабильно — если знаешь, как ими пользоваться.
pip install genai-processors
Открытый код, готовые компоненты и интеграция с API.
• Repo: https://github.com/google-gemini/genai-processors
• Blog: https://developers.googleblog.com/en/genai-processors/
@ai_machinelearning_big_data
#DeepMind #ai #mlimport 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 rewrite, который полностью перезаписывает кассеты, а не просто дополняет их. Также есть встроенная блокировка случайных сетевых запросов во время тестирования.
🤖 GitHub
@python_job_interviewsys.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()) # → "подмена работает"from array import array
data = array('f', [0.1] * 10_000_000) # вместо обычного list
# быстрая арифметика
for i in range(len(data)):
data[i] *= 2.5
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
Endi mavjud! Telegram Tadqiqoti 2025 — yilning asosiy insaytlari 
