и посмотреть медиа
Python Вопросы собесов - тесты
и посмотреть медиа
Вопросы, тесты и задачи для Python собеседований.
Вопросы, тесты и задачи для Python собеседований.
AI бот для озвучки текста и клонирования голоса в Telegram. Создавай аудио с помощью нейросети быстро и просто.
Канал с вопросами для собеседований по Python. Тесты, задачи и материалы для подготовки.
🤔 В чем отличие изменяемые / неизменяемые? В Python все данные делятся на изменяемые (mutable) и неизменяемые (immutable) 🚩Неизменяемые (`immutable`) типы После создания их нельзя изменить! x = 10 print(id(x)) # 140735598722544 (адрес в памяти) x = x + 5 # Создаётся новый объект! print(id(x)) # 140735598722704 (новый адрес) Пример: str неизменяемая s = "hello" print(id(s)) # 140735598723664 s = s + " world" # Создаётся новая строка! print(id(s)) # 140735598724240 (новый адрес) 🚩Изменяемые (`mutable`) типы Можно менять их содержимое без создания нового объекта. lst = [1, 2, 3] print(id(lst)) # 140735598722544 lst.append(4) # Изменяем список print(id(lst)) # 140735598722544 (адрес остался тот же!) Пример: dict изменяемый d = {"name": "Alice"} print(id(d)) # 140735598723664 d["age"] = 25 # Добавляем ключ print(id(d)) # 140735598723664 (адрес не изменился!) 🚩Почему это важно? Неизменяемые объекты безопаснее для ключей dict и set d = {} d[[1, 2, 3]] = "Ошибка!" # ❌ TypeError: unhashable type: 'list' Используем tuple вместо list (он неизменяемый) d[(1, 2, 3)] = "OK" Ошибки с изменяемыми значениями по умолчанию def add_item(lst=[]): # ❌ Опасный код! lst.append(1) return lst print(add_item()) # [1] print(add_item()) # [1, 1] ❌ Список не создаётся заново! Используем None вместо списка def add_item(lst=None): if lst is None: lst = [] lst.append(1) return lst 🚩Копирование объектов (`copy()` vs `deepcopy()`) copy() делает поверхностную копию (новый объект, но старые вложенные элементы). deepcopy() делает глубокую копию (всё новое). import copy lst1 = [[1, 2, 3], [4, 5, 6]] lst2 = copy.copy(lst1) # Поверхностная копия lst2[0][0] = 99 print(lst1) # [[99, 2, 3], [4, 5, 6]] ❌ Исходный список изменился! Используем deepcopy() для полной независимой копии lst3 = copy.deepcopy(lst1) lst3[0][0] = 100 print(lst1) # [[99, 2, 3], [4, 5, 6]] ✅ Не изменился! Ставь 👍 и забирай 📚 Базу знаний
Открыть канал и посмотреть медиа🔍Тестовое собеседование на Middle Python с разработчиком из Авито завтра вечером Уже завтра вечером в 19:00 по мск приходи онлайн на открытое собеседование, чтобы посмотреть на настоящее интервью на Middle Python-разработчика. Как это будет: 📂 Даня, старший разработчик в Авито, будет задавать реальные вопросы и задачи разработчику-добровольцу 📂 Даня будет комментировать каждый ответ респондента, чтобы дать понять чего от вас ожидает собеседующий на интервью 📂 В конце можно будет задать любой вопрос Дане Это бесплатно. Эфир проходит в рамках менторской программы от ШОРТКАТ для Python-разработчиков, которые хотят повысить свой грейд, ЗП и прокачать скиллы. Переходи в нашего бота, чтобы получить ссылку на эфир → @shortcut_py_bot Реклама. О рекламодателе.
Открыть канал и посмотреть медиа🤔 Что такое dict comprehensions? dict comprehension (генератор словаря) — это способ быстро создать словарь с помощью компактного синтаксиса, похожего на list comprehension. 🚩Простейший пример `dict comprehension` squares = {x: x**2 for x in range(1, 6)} print(squares) Вывод {1: 1, 2: 4, 3: 9, 4: 16, 5: 25} 🚩`dict comprehension` с условием (`if`) Оставляем только чётные числа: squares = {x: x**2 for x in range(1, 11) if x % 2 == 0} print(squares) Вывод {2: 4, 4: 16, 6: 36, 8: 64, 10: 100} 🚩Преобразование списка в словарь Создаём словарь из списка пар (name → длина слова) names = ["Alice", "Bob", "Charlie"] name_lengths = {name: len(name) for name in names} print(name_lengths) Вывод {'Alice': 5, 'Bob': 3, 'Charlie': 7} 🚩Обратный словарь (ключи и значения меняются местами) Инвертируем словарь {ключ: значение} → {значение: ключ} original = {"a": 1, "b": 2, "c": 3} inverted = {v: k for k, v in original.items()} print(inverted) Вывод {1: 'a', 2: 'b', 3: 'c'} 🚩Генерация словаря из `zip()` Объединяем два списка в словарь keys = ["name", "age", "city"] values = ["Alice", 25, "New York"] person = {k: v for k, v in zip(keys, values)} print(person) Вывод {'name': 'Alice', 'age': 25, 'city': 'New York'} 🚩`dict comprehension` с `if-else` Разделяем числа на чётные и нечётные numbers = range(1, 6) parity = {x: "чётное" if x % 2 == 0 else "нечётное" for x in numbers} print(parity) Вывод {1: 'нечётное', 2: 'чётное', 3: 'нечётное', 4: 'чётное', 5: 'нечётное'} Ставь 👍 и забирай 📚 Базу знаний
Открыть канал и посмотреть медиа🤔 Зачем нужен 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 # Удаление всех неиспользуемых томов Ставь 👍 и забирай 📚 Базу знаний
Открыть канал и посмотреть медиа🤔 Какие основные функции Python есть? Встроенные функции Python включают такие базовые инструменты, как len, type, print, input, int, str, list, dict, sum, max, min, zip, enumerate, range, map, filter и многие другие. Они обеспечивают широкий функционал без необходимости импортировать внешние библиотеки. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
Открыть канал и посмотреть медиа🤔 Что такое паттерн Мост (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 Ставь 👍 и забирай 📚 Базу знаний
Открыть канал и посмотреть медиа🤔 Какая сложность у пузырьковой сортировки? Пузырьковая сортировка (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] Ставь 👍 и забирай 📚 Базу знаний
Открыть канал и посмотреть медиа🤔 Что такое хранитель (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`: Восстанавливает предыдущее состояние редактора из истории. Ставь 👍 и забирай 📚 Базу знаний
Открыть канал и посмотреть медиа🤔 Что такое итерабельный объект? Это объект, у которого есть метод iter, возвращающий итератор. Такие объекты можно перебирать в цикле for. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
Открыть канал и посмотреть медиаТолько зарегистрированные пользователи могут делиться своим мнением.
Станьте первым, кто поделится своим впечатлением об этом ресурсе!