Python вопросы с собеседований
24.7K subscribers
510 photos
15 videos
17 files
406 links
Вопросы с собеседований по Python

@workakkk - админ

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

@pro_python_code - Python

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

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

РКН: clck.ru/3FmrFd
Download Telegram
🐍 Задача на внимательность и понимание области видимости в Python: «Почему список не заполняется?»

🎯 Цель: Найти, почему переменная ведёт себя не так, как ожидается

📍 Ситуация:

У тебя есть простой код, который должен собирать данные в список из файла:


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. Это тонкое поведение, которое часто приводит к ошибкам, особенно при работе со списками и словарями.
This media is not supported in your browser
VIEW IN TELEGRAM
Задача: Что делает эта странная функция teleport и почему она запускает цикл 32 раза?

🧠 Подсказка:
На первый взгляд это выглядит как хаотичная мешанина побитовых операций, но на самом деле здесь происходит реверс битов (bitwise reversal) — отражение битов справа налево.

Но вопрос — зачем делать это 32 раза подряд?

🔍 Что происходит:

Каждый шаг в теле цикла — это стандартная техника реверса битов через маски и сдвиги:

0xAAAAAAAA, 0xCCCCCCCC, и т.д. — маски по битовым паттернам

Итерация for _ in range(32) делает это снова и снова…

💣 Фишка: первый проход уже полностью отражает 32-битное число.
Остальные 31 повтор возвращают число в исходное состояние — но в побитово инвертированном порядке!

📌 То есть:

Чётное количество циклов — возвращает в исходную позицию

Нечётное — делает реверс

👉 Ответ на teleport(0x12345678) будет реверс битов этого числа.
Ожидаемое: 0x1e6a2c48 (в зависимости от реализации может отличаться).

🎯 Челлендж для продвинутых:

Упростите функцию до одного вызова (без цикла)

Напишите inverse_teleport(x), которая возвращает исходное число обратно

🧩 Эта техника используется в:
— алгоритмах FFT (быстрые преобразования Фурье)
— графике
— реверсировании хэшей
— low-level оптимизациях для SIMD
🎓 Модульный учебник по Python для Middle-разработчиков

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

🔧 Каждый модуль — это отдельный блок знаний: теория + реальные кейсы + трюки из индустрии.
🎯 Только то, что реально нужно миддлу: от дебага и профилирования до async, typing, CI/CD и LLM-интеграций.

Без воды. С кодом. По делу.

📚 Читать

@python_job_interview
🐳 Что если вам нужно запустить чужой (возможно небезопасный) код?

Представьте: вам прислали бинарник, Python-скрипт или npm-пакет, и его надо выполнить.
Вы не знаете, что внутри — а вдруг там 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
This media is not supported in your browser
VIEW IN TELEGRAM
Что выведет этот Python код ? #junior #python

Задача для новичков.

s = set()
a = [1, 2, 3]
s.add(tuple(a))
print(s)


Списки изменяемы и не могут быть элементами множества, но кортежи — неизменяемы и хэшируемы, поэтому кортеж из списка успешно добавится во множество.
🐍 Задача для собеседования на Python

Условие:
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_interview
👨‍💻 Executing — как заглянуть внутрь работающего Python-кода. Необычная библиотека, которая позволяет во время выполнения программы определить, какой именно AST-узел выполняется в данный момент. Это может быть полезно для отладки, анализа кода или создания инструментов вроде умных traceback'ов.

Проект использует хитрый трюк с модификацией AST и наблюдением за изменениями в байт-коде, чтобы точно определить текущую операцию. Хотя функционал кажется узкоспециализированным, его уже используют в нескольких известных инструментах: stack_data, snoop и даже IPython для улучшенного вывода ошибок.

🤖 GitHub

@python_interview
Forwarded from Machinelearning
This media is not supported in your browser
VIEW IN TELEGRAM
📚 ArXiv Research Agent — отличный помощник для научных исследований.

Агент самостоятельно:
• Найдёт релевантные статьи с arXiv, bioRxiv, medRxiv и Semantic Scholar
• Проведёт полноценный обзор и поиск нужных материалов
• Покажет, что упущено, и предложит, что добавить
• Даст инсайты и цитаты из миллионов научных работ
• Генерирует готовые конспекты
И др.

Вскоре обещают добавить поддержку MCP.

🔜 Попробовать: https://www.alphaxiv.org/assistant

@ai_machinelearning_big_data


#agent #ArXiv #ai #ml
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥 7 000+ упражнений на 76 языках программирования

Exercism — бесплатная платформа для прокачки навыков программирования с нуля. Каждый язык — отдельный путь, наполненный практическими задачами.

Главный плюс — обратная связь от опытных менторов. Ответы здесь не быстрые, зато по делу и без токсичности, как это бывает на Stack Overflow.

https://exercism.org/
🐍 Python-совет: ускоряй импорт и запуск с помощью `__main__` guard и lazy imports

Когда ты пишешь утилиту или CLI‑скрипт, важно не загружать всё сразу. Используй if __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__" + локальные импорты = чище, быстрее, гибче.
🐍 Хитрая задача для опытных Python-разработчиков
Почему этот код не работает как ожидается?


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_interview
🐍 Python-совет: используй `functools.lru_cache` для ускорения "дорогих" функций

Если у тебя есть функция, результат которой зависит только от входных данных, — кешируй её! Это может ускорить программы в 10–1000 раз, особенно при рекурсии или повторяющихся запросах.

🔧 Пример:


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 — это одна строка, которая превращает тяжёлую функцию в реактивную. Идеально для оптимизации без изменения логики.
Forwarded from Machinelearning
This media is not supported in your browser
VIEW IN TELEGRAM
🖥 Теперь официально Google выпустили Gemini CLI - AI-агента для работы прямо в терминале

• Лёгкий и мощный инструмент для разработки в командной строке
• Работает на базе Gemini 2.5 Pro
• Код агента в открытом доступе (Apache 2.0)
• Поддержка контекста в 1 миллион токенов
• Бесплатный тариф: до 60 запросов в минуту и 1000 в день
Привязка к Google Search
• Поддержка плагинов и скриптов
• Интеграция с VS Code (Gemini Code Assist)

Запуск в cli: npx 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
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Как написать худший возможный Python-код

Иногда проще показать, как не надо, чем объяснять, как надо.
Вот список «правил», которые помогут вам гарантированно испортить любой Python-проект.

1. 🔒 Используйте непонятные имена переменных
Называйте переменные x, 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

@pythonl
Please open Telegram to view this post
VIEW IN TELEGRAM
🔍 SQLAlchemy-Filters — удобный инструмент для динамической фильтрации, сортировки и пагинации SQLAlchemy-запросов. Этот проект особенно полезен при разработке REST API, где клиенту нужно гибко управлять выборкой данных.

Библиотека поддерживает сложные условия фильтрации, автоматические джойны связанных моделей и работу с гибридными свойствами. Фильтры задаются простыми словарями, что упрощает интеграцию с фронтендом.

🤖 GitHub

@python_job_interview
Python — это фундамент, на котором можно построить карьеру в аналитике данных.

Современные компании все чаще ищут специалистов, способных не просто писать код, но и извлекать из данных полезные для бизнеса инсайты. И если вы уже владеете Python, у вас есть серьезная фора перед другими кандидатами.

3 июля в 19:00 (мск) Анастасия Зеленова, team lead аналитики в Raiffeisen CIB, расскажет, кто такие аналитики и какие навыки и инструменты необходимы для работы, а также покажет повседневные задачи аналитика на реальных примерах.

Присоединяйтесь к бесплатному онлайн-вебинару: https://clc.to/erid_2W5zFHErDXE 

Реклама. ООО "КАРПОВ КУРСЫ". ИНН 7811764627. erid: 2W5zFHErDXE
🔦 VulnHuntr — ИИ-детектор уязвимостей в Python-коде. Этот инструмент от ProtectAI использует LLM для поиска сложных цепочек уязвимостей, которые традиционные статические анализаторы часто пропускают.

Инструмент анализирует полный путь от пользовательского ввода до опасных операций, выявляя даже многошаговые эксплойты вроде RCE или SSRF. Работает через поэтапный анализ: сначала LLM изучает README, затем исследует код с наращиванием контекста, и наконец формирует отчёт с PoC-эксплойтом и оценкой уверенности.

🤖 GitHub

@python_job_interview