Python | Вопросы собесов
12.8K subscribers
45 photos
5 videos
1 file
1.59K links
Сайт: https://easyoffer.ru/
Все каналы: t.me/+xGeAw6ckJ4liYzQy

Контакт для рекламы: @easyoffer_adv
Download Telegram
🤔 Что такое git stash?

git stash — это команда в Git, которая сохраняет незакоммиченные изменения во временное хранилище (stash) и очищает рабочую директорию.

🚩Когда это полезно?

Нужно переключиться на другую ветку, но есть незаконченные изменения. Хочешь сохранить текущую работу, но не коммитить её. Нужно экспериментировать, но без риска потерять код.

🚩Как использовать `git stash`?

Сохранить изменения в stash
git stash


Посмотреть список сохранённых изменений
git stash list


Выведет список всех stash-ов
stash@{0}: WIP on main: 1234567 Добавил новую фичу
stash@{1}: WIP on dev: 89abcde Исправил баг


Восстановить сохранённые изменения
git stash pop  # Восстановит изменения и удалит stash


ИЛИ
git stash apply  # Восстановит, но stash останется в списке


Удалить stash после применения
git stash drop stash@{0}  # Удалит конкретный stash
git stash clear # Удалит все stash'и


🚩Пример использования

Сценарий
- Ты работаешь в ветке main, но нужно срочно переключиться на dev.
- У тебя есть изменения, которые ты не хочешь коммитить.
Решение
git stash          # Сохраняем изменения
git checkout dev # Переключаемся на другую ветку
# Делаем нужную работу...
git checkout main # Возвращаемся в основную ветку
git stash pop # Восстанавливаем изменения


Ставь 👍 и забирай 📚 Базу знаний
🤔 Зачем нужны классы BaseExceptionGroup и ExceptionGroup?

В Python 3.11 были добавлены новые классы исключений BaseExceptionGroup и ExceptionGroup. Эти классы решают проблему одновременной обработки нескольких исключений, которые могут возникать в сложных ситуациях, таких как асинхронное программирование, многопоточность или обработка нескольких связанных ошибок. Давайте разберем, зачем они нужны, как их использовать и какие преимущества они дают.

🚩Зачем нужны `BaseExceptionGroup` и `ExceptionGroup`?

Ранее в Python было возможно выбросить только одно исключение за раз, и обработка нескольких исключений одновременно требовала сложного и неочевидного кода. Например:
При работе с асинхронными функциями или потоками может возникнуть сразу несколько ошибок, и их нужно корректно обработать.
В больших приложениях или библиотеках (например, при работе с asyncio) может быть необходимость передать сразу несколько исключений, которые произошли в разных местах, как единый объект.
BaseExceptionGroup и его подкласс ExceptionGroup позволяют группировать несколько исключений и выбрасывать их вместе в виде одного объекта. Это делает код более читаемым, упрощает обработку и исключает необходимость ручной агрегации ошибок.

🚩Разница между `BaseExceptionGroup` и `ExceptionGroup`

BaseExceptionGroup - это базовый класс для группировки исключений. Он наследуется от BaseException и, как правило, не используется напрямую.
ExceptionGroup - это подкласс, который наследуется от Exception. Этот класс используется для обработки групп исключений, которые возникают при обычных ошибках в коде (не фатальных).

🚩Как они работают?

Классы исключений BaseExceptionGroup и ExceptionGroup позволяют создать "группу исключений", которая содержит несколько отдельных исключений. Это полезно, когда вам нужно:
Указать несколько ошибок одновременно.
Позволить обработчику исключений работать с каждым из них.
def task_1():
raise ValueError("Ошибка в задаче 1")

def task_2():
raise TypeError("Ошибка в задаче 2")

try:
# Создаем группу исключений
raise ExceptionGroup(
"Ошибки в задачах",
[ValueError("Ошибка в задаче 1"), TypeError("Ошибка в задаче 2")]
)
except ExceptionGroup as eg:
for exc in eg.exceptions:
print(f"Обнаружено исключение: {exc}")


Результат
Обнаружено исключение: Ошибка в задаче 1
Обнаружено исключение: Ошибка в задаче 2


🚩Обработка групп исключений

При обработке ExceptionGroup можно использовать механизм фильтрации с помощью конструкции except*. Это нововведение в Python 3.11 позволяет обрабатывать разные типы исключений внутри группы по-разному.
try:
raise ExceptionGroup(
"Ошибки в задачах",
[ValueError("Ошибка 1"), TypeError("Ошибка 2"), ValueError("Ошибка 3")]
)
except* ValueError as ve:
print("Обрабатываем ValueError:", ve)
except* TypeError as te:
print("Обрабатываем TypeError:", te)


Результат
Обрабатываем ValueError: Ошибка 1
Обрабатываем ValueError: Ошибка 3
Обрабатываем TypeError: Ошибка 2


🚩Преимущества использования

Работа с несколькими исключениями одновременно.
Вы можете объединить связанные ошибки и передать их в одном объекте.
Четкое разграничение типов исключений.
Использование except* позволяет обработать каждое исключение из группы отдельно, не теряя гибкости.
Удобство при асинхронном программировании.
В асинхронных задачах (asyncio) часто возникает несколько ошибок одновременно, и их можно группировать для дальнейшей обработки.
Упрощение сложной логики.
Код становится проще и понятнее, так как не нужно вручную собирать и разбирать исключения.

🚩Когда использовать?

Когда вы работаете с несколькими задачами, которые могут порождать ошибки одновременно (например, асинхронный код).
Когда вы хотите сообщить о нескольких связанных ошибках, не выбрасывая каждую из них отдельно.
Когда требуется раздельная обработка разных типов ошибок.

Ставь 👍 и забирай 📚 Базу знаний
👍2
🤔 Зачем нужны схемы в БД?

Схема (schema) в базе данных — это логическая группировка объектов (таблиц, индексов, представлений и т. д.) внутри одной БД.

🚩Что такое схема в БД?

Схема — это контейнер для объектов БД (таблиц, индексов, процедур).
База данных (company_db)
├── Схема: public (по умолчанию)
│ ├── Таблица: employees
│ ├── Таблица: departments
├── Схема: hr
│ ├── Таблица: employees
│ ├── Таблица: salaries
├── Схема: sales
│ ├── Таблица: customers
│ ├── Таблица: orders


🚩Как создавать и использовать схемы?

Создание схемы (CREATE SCHEMA)
CREATE SCHEMA hr;  -- Создаём схему "hr"


Создание таблицы внутри схемы
CREATE TABLE hr.employees (
id SERIAL PRIMARY KEY,
name VARCHAR(100),
position VARCHAR(50)
);


Выбор схемы по умолчанию
SET search_path TO hr;


🚩Где полезны схемы?

🟠Разделение данных по модулям
Если в БД хранятся разные области бизнеса (кадры, продажи, финансы), их можно разделить по схемам:
- hr.employees, hr.salaries
- sales.orders, sales.customers

🟠Разные версии одной БД
Например, в PostgreSQL можно создать схему dev для тестов:
- dev.users — тестовая версия таблицы
- prod.users — продакшен-версия

🟠Безопасность и доступ пользователей
Можно дать доступ к разным схемам разным пользователям:
GRANT USAGE ON SCHEMA hr TO hr_manager;
GRANT SELECT ON ALL TABLES IN SCHEMA hr TO hr_manager;


Ставь 👍 и забирай 📚 Базу знаний
👍4
🤔 Что в python не является объектом?

В Python практически всё является объектом: числа, строки, функции, классы, модули и даже сам интерпретатор Python рассматривает их как объекты. Однако есть несколько вещей, которые объектами не являются:

🟠Операторы и синтаксические конструкции
Операторы (+, -, *, and, or, not и т. д.) сами по себе не являются объектами. Они — часть синтаксиса языка и не имеют представления в виде объектов в памяти.
   a = 10 + 5  # Оператор "+" выполняет сложение, но сам по себе не объект
print(type(+)) # Ошибка: нельзя получить тип оператора


🟠Ключевые слова (keywords)
Встроенные ключевые слова Python (if, else, while, for, def, class, return и т. д.) не являются объектами. Они зарезервированы интерпретатором и используются для управления потоком выполнения кода.
   print(type(if))  # Ошибка: ключевое слово не является объектом


🟠Идентификаторы переменных
Хотя переменные ссылаются на объекты, сами идентификаторы (имена переменных) — это просто ссылки, а не объекты.
   x = 42  # x — это имя, а не объект
print(type(x)) # Это целое число, но само имя "x" объектом не является


🟠Аннотации типов во время компиляции
Аннотации типов в Python, такие как list[str], не создают объекты во время компиляции кода. Они интерпретируются только на уровне анализа типов.
   def func(x: int) -> str:
return str(x)


Ставь 👍 и забирай 📚 Базу знаний
🤔 Что быстрее python или c++?

C++ быстрее Python, потому что:
C++ — компилируемый язык, а Python — интерпретируемый.
C++ работает ближе к "железу", а Python использует абстракции.
C++ использует статическую типизацию, а Python динамическую (дополнительные проверки замедляют код).

🚩Разница в скорости выполнения

Простой пример: сложение чисел в цикле
Python (медленно)
import time

start = time.time()
s = 0
for i in range(10_000_000):
s += i
end = time.time()

print("Python:", end - start, "сек")


Результат
Python: 0.8 сек


C++ (быстро)
#include <iostream>
#include <chrono>

int main() {
auto start = std::chrono::high_resolution_clock::now();

long long s = 0;
for (int i = 0; i < 10000000; i++) {
s += i;
}

auto end = std::chrono::high_resolution_clock::now();
std::cout << "C++: "
<< std::chrono::duration<double>(end - start).count()
<< " сек" << std::endl;
}


Результат
C++: 0.05 сек


🚩3. Когда Python может быть быстрее?

🟠Если используются сторонние библиотеки (NumPy, Pandas, TensorFlow)
Они написаны на C/C++ и работают очень быстро. Пример: numpy.sum(arr) быстрее, чем sum(list), потому что работает на C.

🟠Разработка в Python быстрее (меньше кода, проще отладка)
Python код пишется в 2-5 раз быстрее, чем C++. Важно для стартапов и прототипов.

🟠Python лучше для обработки текста, веб-разработки, автоматизации
Например, парсинг HTML, обработка логов, работа с API.

🚩Когда C++ лучше?

🟠 Высокая производительность (игры, 3D, движки)
Игры, графика (Unreal Engine, Unity, CryEngine). Разработка операционных систем (Windows, Linux).

🟠Алгоритмы и математика (С++ быстрее Python в 10-100 раз)
Быстрая обработка данных, алгоритмы (sorting, graph, machine learning). Например, если нужно перемножить матрицы размером 10 000 × 10 000, C++ справится в разы быстрее.

🟠Работа с железом (Embedded, драйверы, робототехника)
Python слишком медленный для реального времени, а C++ используется в Arduino, автопилотах, микроконтроллерах.

Ставь 👍 и забирай 📚 Базу знаний
🤔 Зачем нужен wraps?

Функция wraps из модуля functools сохраняет оригинальное имя, документацию и сигнатуру оборачиваемой функции. Без неё у функции-декоратора теряется контекст.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍3
🤔 Что такое SDLC?

Это методология управления процессом создания программного обеспечения, которая включает в себя последовательность этапов и действий, необходимых для разработки, тестирования, развертывания и поддержки программных продуктов. Цель SDLC — обеспечить структурированный и эффективный подход к разработке ПО, минимизируя риски и повышая качество конечного продукта.

🚩Основные этапы SDLC

🟠Планирование и анализ требований (Planning and Requirements Analysis)
На этом этапе определяются цели проекта, анализируются потребности и требования к системе. Включает сбор требований от заинтересованных сторон, анализ бизнес-процессов и создание документации с описанием требований.
Встречи с клиентами и пользователями для определения функций системы. Документирование функциональных и нефункциональных требований.

🟠Проектирование (Design)
На этапе проектирования разрабатывается архитектура системы и ее компоненты. Создаются технические спецификации, включая схемы базы данных, диаграммы классов и интерфейсов, а также детализируется план реализации.Разработка диаграмм UML.Создание прототипов пользовательского интерфейса.Проектирование архитектуры системы.

🟠Разработка (Implementation or Coding)
На этом этапе осуществляется непосредственная разработка программного обеспечения на основе спецификаций, созданных на предыдущем этапе. Кодирование выполняется в соответствии с выбранными языками программирования и инструментами разработки. Написание кода для модулей и компонентов системы. Интеграция различных компонентов системы. Регулярное использование систем контроля версий (например, Git).

🟠Тестирование (Testing)
Этап тестирования включает проверку и валидацию системы для обнаружения и исправления ошибок. Тестирование проводится в различных формах, включая юнит-тестирование, интеграционное тестирование, системное тестирование и приемочное тестирование. Автоматизированное тестирование с использованием фреймворков, таких как pytest или JUnit. Ручное тестирование функциональности и пользовательского интерфейса. Тестирование производительности и безопасности.

🟠Развертывание (Deployment)
На этом этапе программное обеспечение разворачивается в рабочей среде и становится доступным пользователям. Включает настройку серверов, развертывание баз данных и настройку инфраструктуры. Развертывание на облачных платформах, таких как AWS или Azure. Настройка и конфигурация серверов и сетей. Миграция данных и начальная загрузка данных.

🟠Поддержка и сопровождение (Maintenance)
Этап поддержки и сопровождения включает в себя обслуживание и улучшение системы после ее развертывания. Включает исправление ошибок, обновление функциональности и оптимизацию производительности. Обновление системы безопасности. Внесение изменений на основе отзывов пользователей. Обслуживание серверов и баз данных.

Ставь 👍 и забирай 📚 Базу знаний
👍2
🤔 Почему не рекомендуется авторизовываться через GET?

Потому что:
- Данные передаются в URL, и могут попасть в историю браузера, логи, прокси.
- Это небезопасно, особенно для логинов, паролей и токенов.
- GET предназначен для чтения, а не отправки чувствительных данных.
POST — безопаснее, так как данные передаются в теле запроса, а не в адресной строке.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍1
🤔 Два способа создания класса

В Python можно создать класс двумя основными способами:
Через class (обычный способ)
Через type() (динамическое создание класса)

🚩Обычное создание класса через `class`

Это стандартный способ, который мы используем чаще всего.
class Person:
def __init__(self, name):
self.name = name

def say_hello(self):
return f"Привет, я {self.name}!"

p = Person("Алиса")
print(p.say_hello()) # Привет, я Алиса!


🚩Динамическое создание класса через `type()`

Функция type() позволяет создать класс "на лету".
Person = type("Person", (object,), {
"__init__": lambda self, name: setattr(self, "name", name),
"say_hello": lambda self: f"Привет, я {self.name}!"
})

p = Person("Боб")
print(p.say_hello()) # Привет, я Боб!


Ставь 👍 и забирай 📚 Базу знаний
🤔 Что такое итерабельный объект?

Это объект, у которого есть метод iter, возвращающий итератор. Такие объекты можно перебирать в цикле for.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍2
🤔 Что такое хранитель (Memento)?

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

🚩Зачем нужен?

🟠Сохранение состояния:
Позволяет сохранять текущее состояние объекта и восстанавливать его позже.
🟠Инкапсуляция:
Обеспечивает сохранение состояния объекта без нарушения его инкапсуляции. Внутренние детали объекта остаются скрытыми от других объектов.
🟠Отмена и повтор операций:
Поддерживает функциональность отмены и повтора операций, так как позволяет возвращать объект к предыдущим состояниям.
Пример реализации
class Memento:
def __init__(self, state: str):
self._state = state

def get_state(self) -> str:
return self._state

class TextEditor:
def __init__(self):
self._state = ""
self._history = []

def type(self, text: str):
self._save_state()
self._state += text

def _save_state(self):
self._history.append(Memento(self._state))

def undo(self):
if not self._history:
return
memento = self._history.pop()
self._state = memento.get_state()

def get_content(self) -> str:
return self._state

# Клиентский код для использования паттерна Хранитель
def main():
editor = TextEditor()

editor.type("Hello, ")
editor.type("world!")
print(editor.get_content()) # Hello, world!

editor.undo()
print(editor.get_content()) # Hello,

editor.undo()
print(editor.get_content()) #

if __name__ == "__main__":
main()


1⃣`Memento`:
Сохраняет состояние объекта. Он предоставляет методы для получения сохраненного состояния, но не предоставляет методов для изменения состояния, что обеспечивает неизменность.

2⃣`TextEditor`:
Создает и использует объекты Memento для сохранения и восстановления своего состояния. Методы type и undo позволяют редактировать текст и отменять изменения.

3⃣`_save_state`:
Сохраняет текущее состояние редактора в истории перед каждым изменением.

4⃣`undo`:
Восстанавливает предыдущее состояние редактора из истории.

Ставь 👍 и забирай 📚 Базу знаний
🤔 Какая сложность у пузырьковой сортировки?

Пузырьковая сортировка (Bubble Sort) — это один из самых простых, но неэффективных алгоритмов сортировки.

🚩Как работает пузырьковая сортировка?

1. Проходим по массиву несколько раз.
2. На каждой итерации сравниваем соседние элементы и меняем их местами, если они идут не в том порядке.
3. После первого прохода наибольший элемент оказывается в конце массива.
4. Повторяем процесс, пока массив не отсортируется.

🚩Рассчёт сложности (`O(n²)`)

Количество сравнений в худшем случае:
- На первой итерации: n-1 сравнений
- На второй: n-2 сравнений
- На третьей: n-3 сравнений
- …
- Всего: (n-1) + (n-2) + ... + 1 = O(n²)
Количество обменов (swap) в худшем случае:
- Если массив полностью перевёрнут, на каждой итерации будет максимальное количество перестановок → O(n²).

🚩Оптимизированная пузырьковая сортировка (`O(n)`)
Если на проходе по массиву не было перестановок, значит массив уже отсортирован.
def bubble_sort(arr):
n = len(arr)
for i in range(n):
swapped = False # Флаг, отслеживающий перестановки
for j in range(n - i - 1):
if arr[j] > arr[j + 1]: # Если элементы в неправильном порядке, меняем местами
arr[j], arr[j + 1] = arr[j + 1], arr[j]
swapped = True
if not swapped:
break # Если перестановок не было, завершаем сортировку

arr = [1, 2, 3, 4, 5] # Уже отсортированный массив
bubble_sort(arr)
print(arr) # [1, 2, 3, 4, 5]


Ставь 👍 и забирай 📚 Базу знаний
🔥3
🤔 Что такое паттерн Мост (Bridge)?

Паттерн "Мост" (Bridge) является структурным паттерном проектирования, который предназначен для разделения абстракции и реализации так, чтобы они могли изменяться независимо друг от друга. Этот паттерн полезен, когда класс должен работать с различными платформами или когда нужно избежать жесткой связки между абстракцией и ее реализацией.

🚩 Зачем нужен

🟠Разделение абстракции и реализации:
Он позволяет отделить абстракцию от ее реализации, что упрощает поддержку и расширение системы.
🟠Уменьшение количества подклассов:
Без применения этого паттерна, если у нас есть несколько вариантов абстракции и несколько вариантов реализации, то нам пришлось бы создавать классы для всех возможных комбинаций, что приводит к взрывному росту количества классов.
🟠Гибкость:
Это позволяет изменять и абстракцию, и реализацию независимо друг от друга.

🚩Как используется

🟠Абстракция (Abstraction):
Определяет интерфейс и хранит ссылку на объект Implementor.
🟠Расширенная абстракция (RefinedAbstraction):
Наследует Abstraction и расширяет интерфейс.
🟠Реализатор (Implementor):
Определяет интерфейс для всех реализаций.
🟠Конкретный реализатор (ConcreteImplementor):
Реализует интерфейс Implementor.

Допустим, у нас есть программа для управления различными типами устройств (например, телевизор и радио), которые можно включать и выключать. Мы хотим, чтобы способ управления устройствами мог изменяться независимо от типов устройств.
# Implementor
class Device:
def is_enabled(self):
pass

def enable(self):
pass

def disable(self):
pass

# ConcreteImplementor
class TV(Device):
def __init__(self):
self._on = False

def is_enabled(self):
return self._on

def enable(self):
self._on = True

def disable(self):
self._on = False

class Radio(Device):
def __init__(self):
self._on = False

def is_enabled(self):
return self._on

def enable(self):
self._on = True

def disable(self):
self._on = False

# Abstraction
class RemoteControl:
def __init__(self, device):
self._device = device

def toggle_power(self):
if self._device.is_enabled():
self._device.disable()
else:
self._device.enable()

# RefinedAbstraction
class AdvancedRemoteControl(RemoteControl):
def mute(self):
print("Device is muted.")

# Клиентский код
tv = TV()
remote = RemoteControl(tv)
remote.toggle_power() # Включает TV

radio = Radio()
advanced_remote = AdvancedRemoteControl(radio)
advanced_remote.toggle_power() # Включает Radio
advanced_remote.mute() # Заглушает Radio


Ставь 👍 и забирай 📚 Базу знаний
👍3
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Какие основные функции Python есть?

Встроенные функции Python включают такие базовые инструменты, как len, type, print, input, int, str, list, dict, sum, max, min, zip, enumerate, range, map, filter и многие другие. Они обеспечивают широкий функционал без необходимости импортировать внешние библиотеки.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
💊1
🤔 Зачем нужен volume в docker?

В Docker volume (том) — это специальное место для хранения данных контейнера, которое не исчезает при перезапуске или удалении контейнера.

🚩Зачем нужен `volume`?

Данные не теряются при удалении контейнера
Общий доступ: несколько контейнеров могут использовать один и тот же volume
Производительность: тома быстрее, чем хранение внутри контейнера
Разделение кода и данных: удобно для баз данных и логов

🚩Как создать `volume`?

Способ 1: Автоматическое создание при запуске контейнера
docker run -d -v my_volume:/app/data my_container


Способ 2: Создать том отдельно и подключить его
docker volume create my_volume
docker run -d -v my_volume:/app/data my_container


Способ 3: Использовать путь на хосте (bind-mount)
docker run -d -v /home/user/data:/app/data my_container


🚩Как посмотреть список томов?

docker volume ls  # Покажет все тома
docker volume inspect my_volume # Информация о томе


🚩Как удалить `volume`?

Важно: при удалении тома данные удаляются безвозвратно!
docker volume rm my_volume  # Удаление одного тома
docker volume prune # Удаление всех неиспользуемых томов


Ставь 👍 и забирай 📚 Базу знаний
👍1
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥 Осталось 3 дня!

Пожизненный easyoffer PRO по цене одного года. Покупаешь один раз – пользуешься всю жизнь.

Что входит в PRO:
– Вопросы и задачи с реальных собеседований в конкретных компаниях
– Лучшие ответы и видео-примеры от middle/senior специалистов
– Записи реальных собеседований
– Обход фильтров ATS с топ-30 ключевых слов в резюме
– Автоотклики на hh
– Тренажёры и симуляторы для идеальной подготовки к интервью

Акция действует только до 2 сентября 23:59 по МСК

👉 Забрать PRO со скидкой 70%: https://easyoffer.ru/pro
💊1
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔1💊1