TG Telegram Group Link
Channel: Python вопросы с собеседований
Back to Bottom
👩‍💻 Docker — лучший канал для ускоренного обучения DevOps.

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

Прокачать скиллы: hottg.com/DevopsDocker
Please open Telegram to view this post
VIEW IN TELEGRAM
👍54🔥1
🧠 Задача с подвохом: Что выведет код?


def extendList(val, list=[]):
list.append(val)
return list

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

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


Варианты ответа:

A.

list2 = [123]
list3 = ['a']


B.

list2 = [123]
list3 = [10, 'a']


C.

list2 = [123]
list3 = [10, 'a']


D.

list2 = [123]
list3 = ['a']


Как думаешь, какой ответ правильный и почему?

Подвох: аргументы по умолчанию в Python вычисляются один раз — при определении функции.
🔸 В extendList(val, list=[]) — этот list=[] сохраняется один и тот же объект списка для всех вызовов функции, где не передаётся list.



Что происходит:
list1 = extendList(10)
→ list=[] по умолчанию
→ list = [10]
→ list1 → [10]

list2 = extendList(123, [])
→ передали новый список
→ list = [123]
→ list2 → [123]

list3 = extendList('a')
→ снова использован тот же список, что и в list1
→ list = [10, 'a']
→ list3 → [10, 'a']
→ и list1 тоже теперь [10, 'a'], потому что это один и тот же объект

Вывод будет:

list1 = [10, 'a']
list2 = [123]
list3 = [10, 'a']
👍9🔥62
🧠 Python-хитрая задача + решение

🖍️ Условие:
У тебя есть список логов (user, login/logout).
Найди тех, кто зашел, но не вышел.

📜 Пример:

logs = [
("alice", "login"),
("bob", "login"),
("alice", "logout"),
("dave", "login"),
("bob", "logout"),
("carol", "login"),
("dave", "logout")
]


________
💻 Решение:

from collections import defaultdict

def find_stuck_users(logs):
counter = defaultdict(int)
for user, action in logs:
if action == "login":
counter[user] += 1
elif action == "logout":
counter[user] -= 1
return sorted([user for user, count in counter.items() if count > 0])


🛠Ответ: "carol"

#Python #Challenge #DevPuzzle

@python_job_interview
👍133🔥2
Задача: "Исчезающие процессы"

На сервере с Linux (Ubuntu 22.04) установлен некий демон (например, mydaemon), который запускается через systemd unit и, согласно логам, должен работать постоянно.

Но вот странность:

systemctl status mydaemon показывает, что сервис активен.

Однако при выполнении ps aux | grep mydaemon — процесса в списке нет.

top, htop, pgrep, pidof — тоже ничего не показывают.

Но при перезапуске systemd-сервиса (systemctl restart mydaemon) — в логах появляется запись о запуске, ошибок нет, а поведение не меняется.

Вопрос:
что происходит и как найти реальный процесс?


Подсказки:
Попробуйте посмотреть, какой тип сервиса указан в systemd unit-файле.

Изучите, куда уходит stdout/stderr
.

Подумайте, может ли ExecStart запускать shell-обёртку, а не сам процесс.

Что покажет
systemctl show -p MainPID mydaemon?

Подвох и решение:
Часто в unit-файле могут писать:

```ini
Type=simple
ExecStart=/bin/bash -c 'sleep 9999'```

Systemd считает, что bash — это основной процесс (MainPID), но он сразу завершается, передав выполнение sleep. Однако поскольку Type=simple, systemd не отслеживает дочерние процессы, и MainPID исчезает — ps и pgrep по имени mydaemon ничего не покажут, а дочерний процесс (sleep 9999) работает, но под другим именем.

Решение:

Либо указать Type=forking и использовать PIDFile.

Либо не использовать bash -c, а запускать нужный бинарь напрямую.

Либо использовать Type=exec (в systemd >240) или Type=notify с proper daemon tools.
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔7👍5
💡🐍 Задача на бинарный поиск на Python

— Входные данные

В первой строке входных данных содержатся
натуральные числа N и К (
0 < N, K ≤ 100 000).
Во второй строке задаются N элементов первого
массива, отсортированного по возрастанию, а в третьей строке - К элементов второго
массива. Элементы обоих массивов - целые числа, каждое из которых по модулю не превосходит 109


— Выходные данные

Требуется для каждого из К чисел вывести в отдельную строку "YES", если это число встречается в первом массиве, и "NO" в противном случае.


— Примеры:
входные данные
10 5
123 4 5 6 7 8 9 10
-2 0 4 9 12

выходные данные
NO
NO
YES
YES
NO


Скидывайте свои решения в комментарии🧐

@python_job_interview
2👍2❤‍🔥1🔥1
Forwarded from Python/ django
🖥 Новинка в Python 3.14: t-строки — типобезопасные f-строки

Python 3.14 вводит t"..." — новый синтаксис для строк, ориентированных на безопасность типов и интеграцию с системами шаблонов, SQL, HTML и др.

🔹 Что такое t-строка?
t"..." — это как f"...", но:

- интерполяция ограничена и контролируема;
- поддерживается строгое соответствие шаблону;
- можно передавать переменные явно, предотвращая SQL-инъекции и XSS.

🔸 Пример:

name = "Alice"
greeting = t"Hello, {name}!" # t-строка
Вместо немедленной подстановки, как в f"...", t"..." создает шаблон с выражениями как параметрами.


🔐 Зачем это нужно?
Безопасность при генерации SQL, HTML, JSON

Улучшение инструментов и проверки типов (через static analysis)

Контроль над контекстом исполнения (больше нельзя просто вставить переменную как есть — нужно передать её явно)

📦 Использование:
t-строки — это первый шаг к "template string literals" как в TypeScript.

Можно использовать с функциями:


def html(template: T[str]) -> SafeHTML:
...

html(t"<div>{user_input}</div>")


💡 Почему это важно?
Старый код:


f"SELECT * FROM users WHERE name = '{user_name}'"
может привести к SQL-инъекциям и XSS.
t-строки — безопасная альтернатива с встроенной защитой.


🛡 Пример: безопасный HTML

template = t"<p>{user_input}</p>"
html_output = html(template)
# <p>&lt;script&gt;alert('bad')&lt;/script&gt;</p>

Функция html() может вернуть не просто строку, а полноценный HTMLElement.
Больше никакой "грязи" — всё чисто и типобезопасно.

🔍 Работа с шаблоном
t-строки позволяют получить доступ к содержимому:


template = t"Hello {name}!"
template.strings # ("Hello ", "!")
template.values # (name,)
template.interpolations[0].format_spec # ">8"

Можно и вручную собрать шаблон:


Template("Hello ", Interpolation(value="World", expression="name"), "!")


🚀 Вывод:
t"..." — шаг к безопасным шаблонам и типизации строк в Python.
Готовься к будущему Python — безопасному по умолчанию.

📌 Подробнее здесь

@pythonl
Please open Telegram to view this post
VIEW IN TELEGRAM
👍17🔥65
🚀 Python-разработчик — от основ до синьора.

Если вы ищете структурированный roadmap в бэкенд-разработке на Python, обратите внимание на дорожную карту от Boot.dev. Она начинается с базовых навыков (Linux, Git, ООП) и ведёт к сложным темам: алгоритмы, HTTP-серверы, безопасность и DevOps-инструменты.

Создатели сделали акцент на практике. После каждого теоретического блока предлагается создать проект: от простого бота до агрегатора блогов с использованием SQL и облачных хранилищ.

🤖 GitHub

@python_job_interview
4👍1🔥1
👾 Задача на работу с множествами в Python

— Входные данные

В первой строке заданы два натуральных числа N и M (0 < N, M ≤ 100 000).
Во второй строке перечислены N элементов первого множества (целые числа через пробел).
В третьей строке — M элементов второго множества (целые числа через пробел).
Все числа по модулю не превышают 10<sup>9</sup>.


— Выходные данные

Для каждого из M чисел выведите в отдельной строке:
- "IN", если число присутствует в обоих множествах
- "OUT", если число есть только в одном из множеств
- "MISS", если числа нет ни в одном множестве


— Примеры:

Входные данные:
5 4
10 20 30 40 50
20 25 40 60


Выходные данные:
IN
OUT
IN
MISS


Жду ваших вариантов решений 📝 @python_job_interview
2👍2🔥1
⚡️Легкий способ получать свежие обновления и следить за трендами в разработке на вашем языке. Находите свой стек и подписывайтесь:

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

💼 Папка с вакансиями: hottg.com/addlist/_zyy_jQ_QUsyM2Vi
Папка Go разработчика: hottg.com/addlist/MUtJEeJSxeY2YTFi
Папка Python разработчика: hottg.com/addlist/eEPya-HF6mkxMGIy
Папка ML: https://hottg.com/addlist/2Ls-snqEeytkMDgy
Папка FRONTEND: https://hottg.com/addlist/mzMMG3RPZhY2M2Iy

😆ИТ-Мемы: hottg.com/memes_prog
🇬🇧Английский: hottg.com/english_forprogrammers
🧠ИИ: hottg.com/vistehno

🎓954ГБ ОПЕНСОРС КУРСОВ: @courses
📕Ит-книги бесплатно: https://hottg.com/addlist/BkskQciUW_FhNjEy
2👍1
🖥Задача: "Динамическое кэширование с ограничением памяти и частотой запросов"

🔖 Условие:

Реализуйте класс SmartCache, который работает следующим образом:

- Метод put(key: str, value: Any):
- Сохраняет значение по ключу.
- Если суммарный объем памяти, занимаемый всеми элементами, превышает лимит (например, 10 MB), автоматически удаляются наименее "ценные" элементы.

- Метод get(key: str) -> Any:
- Возвращает значение по ключу.
- Увеличивает счётчик использования элемента.
- Если элемент отсутствует — возвращает None.

Что значит "ценность" элемента:
- Ценность = количество обращений (`hit count`) к элементу.
- При очистке кэша сначала удаляются элементы с наименьшим количеством обращений.

Ограничения:
- Класс должен корректно считать объём памяти, занимаемый элементами.
- Нужно учитывать, что элементы могут быть сложными структурами (`dict`, list, вложенные объекты).
- Решение должно быть эффективным: операции должны быть быстрыми даже при большом количестве элементов.

---

▪️ Подсказки:

- Для оценки размера объектов можно использовать модуль sys.getsizeof, но для сложных вложенных структур нужен рекурсивный подсчет.
- Для хранения частоты обращений стоит использовать дополнительную структуру данных (`collections.Counter` или `dict`).
- При очистке лучше сначала группировать элементы по "ценности", а затем удалять самые "дешевые".

---

▪️ Что оценивается:

- Умение работать с ограничениями по памяти.
- Аккуратная обработка ссылок и размеров объектов.
- Эффективность очистки кэша.
- Чистота и читаемость кода.

---

▪️ Разбор возможного решения:

Идея архитектуры:

- Храним:
- storage: словарь {key: value}.
- hits: счётчик {key: hit_count}.
- size: общий размер всех объектов.
- При put():
- Добавляем элемент.
- Пересчитываем суммарный размер.
- Если размер превышает лимит:
- Удаляем наименее популярные элементы до тех пор, пока не уложимся в лимит.
- При get():
- Увеличиваем hit_count элемента.
- Возвращаем значение или None.

Оценка размера объектов:

- Простого sys.getsizeof недостаточно для коллекций.
- Нужна функция, рекурсивно подсчитывающая размер всех вложенных объектов.

Мини-пример функции подсчета размера:


import sys

def deep_getsizeof(obj, seen=None):
"""Рекурсивно считает память объекта и его вложенных объектов"""
size = sys.getsizeof(obj)
if seen is None:
seen = set()
obj_id = id(obj)
if obj_id in seen:
return 0
seen.add(obj_id)

if isinstance(obj, dict):
size += sum([deep_getsizeof(v, seen) + deep_getsizeof(k, seen) for k, v in obj.items()])
elif isinstance(obj, (list, tuple, set, frozenset)):
size += sum(deep_getsizeof(i, seen) for i in obj)
return size


Мини-пример интерфейса `SmartCache`:


class SmartCache:
def __init__(self, max_size_bytes):
self.max_size = max_size_bytes
self.storage = {}
self.hits = {}
self.total_size = 0

def put(self, key, value):
# добавить логику добавления и очистки при переполнении
pass

def get(self, key):
# увеличить hit_count и вернуть значение
pass


🔖 Дополнительные вопросы:

- Как ускорить очистку кэша без полного перебора всех элементов?
- Как сделать потокобезопасную версию кэша?
- Как адаптировать SmartCache для распределённой архитектуры (кэш между несколькими машинами)?

@python_job_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
👍72🔥2🤡2
🖥 Linux — топ среди обучающих каналов для быстрого погружения Linux.

Наглядные картинки и короткие видео - мы расскажем о всех секртетах Linux администрирования.

Подписаться: hottg.com/linuxacademiya
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍1
HTML Embed Code:
2025/07/09 21:05:05
Back to Top