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 967 مشتركاً، محتلاً المرتبة 5 488 في فئة التكنولوجيات والتطبيقات والمرتبة 26 804 في منطقة روسيا.
📊 مؤشرات الجمهور والحراك
منذ تأسيسه في невідомо، حقق المشروع نمواً سريعاً وجمع 24 967 مشتركاً.
بحسب آخر البيانات بتاريخ 05 يونيو, 2026، تحافظ القناة على نشاط مستقر. خلال آخر 30 يوماً تغيّر عدد الأعضاء بمقدار -153، وفي آخر 24 ساعة بمقدار -5، مع بقاء الوصول العام مرتفعاً.
- حالة التحقق: غير موثّقة
- معدل التفاعل (ER): يبلغ متوسط تفاعل الجمهور 6.12%. وخلال أول 24 ساعة من النشر يحصد المحتوى عادةً 3.05% من ردود الفعل نسبةً إلى إجمالي المشتركين.
- وصول المنشورات: يحصل كل منشور على متوسط 1 527 مشاهدة. وخلال اليوم الأول يجمع عادةً 762 مشاهدة.
- التفاعلات والاستجابة: يتفاعل الجمهور بانتظام؛ متوسط التفاعلات لكل منشور يبلغ 8.
- الاهتمامات الموضوعية: يركز المحتوى على مواضيع رئيسية مثل github, api, собеседование, git, docker.
📝 الوصف وسياسة المحتوى
يصف المؤلف القناة بأنها مساحة للتعبير عن الآراء الذاتية:
“Вопросы с собеседований по Python
@workakkk - админ
@machinelearning_interview - вопросы с собесдований по Ml
@pro_python_code - Python
@data_analysis_ml - анализ данных на Python
@itchannels_telegram - 🔥 главное в ит
РКН: clck.ru/3FmrFd”
بفضل وتيرة التحديث المرتفعة (أحدث البيانات بتاريخ 06 يونيو, 2026) تحافظ القناة على حداثتها ومستوى وصول مرتفع. وتُظهر التحليلات تفاعلاً نشطاً من الجمهور، ما يجعلها نقطة تأثير مهمة ضمن فئة التكنولوجيات والتطبيقات.
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=sharex, y, a, thing. Абстракция — залог путаницы.
def f(x, y, z=None):
a = x * 2
b = y + a if z else y - a
c = [i for i in range(a) if i % 2]
return sum(c) + b
2.🧠 Пихайте максимум логики в одну строку
Сложные тернарные выражения и вложенные list comprehension — всё в одной строке.
result = [x if x > 0 else (y if y < 0 else z) for x in data if x or y and not z]
3.⚠️ Используйте eval() и exec()
Это медленно, небезопасно и глупо — но зато эффектно.
eval("d['" + key + "']")
4.🔁 Переиспользуйте переменные с разными типами
Пусть одна переменная будет и строкой, и числом, и списком — динамическая типизация же!
value = "42"
value = int(value)
value = [value] * value
5.🌍 Используйте глобальные переменные
Изменяйте состояние приложения откуда угодно. Особенно изнутри функций.
counter = 0
def increment():
global counter
counter += 1
6.🔮 Используйте магические числа и строки
Без пояснений. Пусть коллеги гадают, почему именно 42 или "xyz".
if user.role == "xyz" and user.level > 42:
access_granted()
7.📏 Игнорируйте стиль и отступы
Никаких PEP8, никаких правил. Пиши, как хочешь.
def foo():print("start")
if True:
print("yes")
else:
print("no")
8.🧱 Копируйте код из Stack Overflow, не вникая
Ctrl+C — это тоже разработка.
def complex_logic(x):
return (lambda y: (lambda z: z**2)(y + 1))(x)
9.🧩 Придумывайте абстракции без надобности
Вместо простой функции — классы, фабрики и стратегии.
class HandlerFactory:
def get_handler(self):
class Handler:
def handle(self, x): return x
return Handler()
10. 💤 Добавляйте мёртвый код
Никогда не удаляй — вдруг пригодится. И пусть он грузится в каждый запуск.
def legacy_feature():
print("This feature is deprecated")
return
# нигде не вызывается
11.🔀 Не пишите документацию
Комментарии только мешают. Кто захочет — разберётся.
def a(x): return x+1
12.🧪 Пиши без тестов
Если код работает — зачем его проверять?
# Просто запускай и смотри глазами
process_user(data)
13. 🤖 Не используй AI и автодополнение
Только ручной кодинг, без подсказок. Ошибки — путь мастера.
🧠 Заключение
Все эти советы — примеры того, как не стоит писать код.
Если вы узнали себя — пора остановиться. Ведь Python задуман как язык, где важна читаемость, простота и явность.
"Beautiful is better than ugly.
Explicit is better than implicit.
Readability counts."
— The Zen of Python
@pythonlnpx https://github.com/google-gemini/gemini-cli
🔜 Анонс: https://blog.google/technology/developers/introducing-gemini-cli-open-source-ai-agent/
🔜 Github: https://github.com/google-gemini/gemini-cli/
@ai_machinelearning_big_data
#AI #ML #agent #Google
from functools import lru_cache
@lru_cache(maxsize=128)
def fib(n):
if n < 2:
return n
return fib(n - 1) + fib(n - 2)
print(fib(100))
📌 Что делает lru_cache:
• сохраняет результаты вызова функции
• повторные вызовы с теми же аргументами → мгновенный возврат
• maxsize ограничивает объём кэша (по принципу LRU — least recently used)
🔥 Без кеша fib(100) занимает минуты
⚡ С кешем — менее 1 секунды
🛠️ Применимо к:
• рекурсивным вычислениям
• функциям, вызывающим API
• любым дорогим операциям с неизменяемыми аргументами
🧠 Вывод: @lru_cache — это одна строка, которая превращает тяжёлую функцию в реактивную. Идеально для оптимизации без изменения логики.
def magic():
return [lambda: i for i in range(5)]
funcs = magic()
results = [f() for f in funcs]
print(results)
На первый взгляд, ты ожидаешь результат:
[0, 1, 2, 3, 4]
Но на деле вывод будет:
[4, 4, 4, 4, 4]
🔍 Что пошло не так
lambda: i не захватывает значение i, а замыкается на саму переменную i, которая одна и та же для всех лямбд.
К моменту вызова всех функций i = 4 (последнее значение цикла), и все лямбды возвращают одно и то же.
Это классический пример late binding — лямбда "вспоминает" переменную, а не её значение в момент создания.
✅ Как исправить
Способ 1: фиксируем значение i через аргумент по умолчанию
def magic():
return [lambda i=i: i for i in range(5)]
funcs = magic()
results = [f() for f in funcs]
print(results)
Теперь вывод:
[0, 1, 2, 3, 4]
Способ 2: functools.partial
from functools import partial
def f(x): return x
funcs = [partial(f, i) for i in range(5)]
results = [f() for f in funcs]
print(results)
🧠 Почему это важно
Такие баги встречаются:
- в колбэках и ивентах (например, при работе с GUI или CLI)
- в генерации функций внутри циклов
- в async-замыканиях и DSL-интерпретаторах
- в тестовых фреймворках, где создаются сценарии динамически
Понимание области видимости, замыканий и позднего связывания (late binding) — необходимый навык для confident-сеньора.
@python_interviewif __name__ == "__main__" + отложенный импорт, чтобы ускорить запуск и избежать лишней инициализации.
🔧 Пример:
# script.py
def main():
import argparse
import time
parser = argparse.ArgumentParser()
parser.add_argument("--sleep", type=int, default=1)
args = parser.parse_args()
print("Start sleeping...")
time.sleep(args.sleep)
print("Done.")
if __name__ == "__main__":
main()
📌 Почему это важно:
• Импорты происходят только при запуске, а не при импорте модуля из другого файла
• Снижается время запуска CLI-инструмента
• Уменьшается нагрузка при unit-тестировании, если main() не нужен
• Позволяет использовать файл как модуль и как скрипт
🛠️ Особенно эффективно при:
• больших CLI-инструментах (`argparse`, rich, pandas и др.)
• работе в средах, где startup time критичен (например, serverless)
🧠 Вывод: if __name__ == "__main__" + локальные импорты = чище, быстрее, гибче.def mystery(x, y):
if x == 0:
return y
else:
return mystery(x - 1, x + y)
result = mystery(3, 2)
print(result)
— Вопрос: что будет выведено в результате выполнения этого кода?
— Варианты ответов:
А. 5
B. 8
C. 11
D. Ошибка рекурсии
Правильный ответ: B.
Пояснение:
Функция mystery — это рекурсивная функция, которая накапливает сумму чисел от x до 1, прибавляя y в конце.
@python_job_interviews = set()
a = [1, 2, 3]
s.add(tuple(a))
print(s)
Списки изменяемы и не могут быть элементами множества, но кортежи — неизменяемы и хэшируемы, поэтому кортеж из списка успешно добавится во множество.rm -rf /, попытка выйти из контейнера, майнер или установка root-доступа?
🔥 Первый инстинкт: запустить в Docker. Кажется, контейнер спасёт?
⚠️ На самом деле — не всегда.
🛑 Docker ≠ песочница
Контейнеры по умолчанию не изолированы от ядра, сетей и сокетов хоста.
Даже простое docker run -it ubuntu запускает процесс с root-доступом внутри контейнера.
🛡️ Что делать, если код небезопасен:
# Запуск без root-доступа
docker run --user 1000:1000 my-image
# Только для чтения
docker run --read-only my-image
# Удалить все cap-привилегии ядра
docker run --cap-drop=ALL my-image
# Использовать seccomp-профиль
docker run --security-opt seccomp=default.json my-image
# Отключить сеть
docker run --network=none my-image
Также стоит:
• Настроить AppArmor / SELinux
• Запретить монтирование Docker сокета
• Ограничить доступ к /proc, /sys
💡 Вывод:
Docker — это удобный инструмент упаковки, но не синоним безопасной изоляции.
Если запускаете сторонний или user-generated код (плагины, CI-скрипты, sandbox-сервисы) — относитесь к нему как к потенциально опасному.
Безопасность — это не "чеклист", а постоянная практика.
#Docker #Security #Sandbox #DevOps #Isolation
results = []
def process_file(path):
for line in open(path):
if "error" in line:
results.append(line.strip())
# где-то в другом месте:
process_file("logs1.txt")
process_file("logs2.txt")
print(f"Total errors: {len(results)}")
Но после запуска ты получаешь:
Total errors: 0🙃 Хотя ты уверен, что в обоих файлах есть строки с
"error".
🧩 Задача:
1. Почему список results остаётся пустым?
2. Почему нет ошибки при обращении к results.append(...)?
3. Что будет, если вместо append() просто написать results = [...] внутри функции?
4. Как правильно модифицировать глобальную переменную?
5. Как сделать поведение явным и безопасным?
🛠 Решение:
🔸 Проблема в области видимости переменных:
Функция использует results, определённый вне функции, но не объявляет его как global.
Однако results.append(...) — это допустимая операция, так как она не переназначает переменную, а вызывает метод объекта.
Если бы внутри функции была строка results = [...], Python бы создал локальную переменную results, и тогда append бы вызывал UnboundLocalError.
🔸 Для ясности и чистоты кода лучше делать так:
def process_file(path, results):
for line in open(path):
if "error" in line:
results.append(line.strip())
results = []
process_file("logs1.txt", results)
process_file("logs2.txt", results)
Или, если обязательно нужно использовать глобальную переменную:
results = []
def process_file(path):
global results
for line in open(path):
if "error" in line:
results.append(line.strip())
🔸 Проверка:
- print(locals()) — покажет локальные переменные
- print(globals()) — покажет глобальные
📌 Вывод:
В Python изменение содержимого изменяемой глобальной переменной внутри функции возможно без global, но присваивание новой переменной требует явного global. Это тонкое поведение, которое часто приводит к ошибкам, особенно при работе со списками и словарями.
متاح الآن! بحث تيليغرام 2025 — أهم رؤى العام 
