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

Контакт для рекламы: @easyoffer_adv
Download Telegram
🤔 Два способа создания класса

В 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