Python | Вопросы собесов
СтатистикаСайт: https://easyoffer.ru/ Все каналы: t.me/+xGeAw6ckJ4liYzQy Контакт для рекламы: @easyoffer_adv
- Последний пост
- 12:47
- Последнее чтение
- 14 авг.
- Постов за неделю
- 10
- Всего постов
- 24
- Тип
- открытый
- Язык
- русский
- Категория
- Технологии
- В каталоге с
- 12 авг.
- 1/24сутки в ленте
- 587
- 1/48двое суток
- 672
- 1/72трое суток
- 724
Медиана по постам, которые мы застали свежими и померили через сутки.
Посты
видео или голосовое, без подписи
видео или голосовое, без подписи
видео или голосовое, без подписи
видео или голосовое, без подписи
видео или голосовое, без подписи
видео или голосовое, без подписи
видео или голосовое, без подписи
🤔 Как понять, какие виды тестов нужны именно сейчас? Выбор типа тестирования зависит от целей, стадии разработки и текущих проблем. Чтобы определить, какие тесты нужны, стоит ответить на вопросы: Что тестируем? (код, API, UI, производительность и т. д.) Какие риски? (где может сломаться, критичность ошибки) Какой этап разработки? (новый код, рефакторинг, релиз) 🚩Как определить нужные тесты прямо сейчас? 🟠Только написали новый код Нужны: Юнит-тесты Тестируем функции и классы отдельно. def add(a, b): return a + b def test_add(): assert add(2, 3) == 5 # ✅ Юнит-тест 🟠Соединяем модули или работаем с API Нужны: Интеграционные тесты Проверяем работу всей системы вместе. def test_api(): response = requests.get("https://api.example.com/data") assert response.status_code == 200 🟠Перед релизом или деплоем Нужны: Функциональные и регрессионные тесты Проверяем ключевые сценарии и старый функционал. def test_login(): assert login("user", "password") == "Success" 🟠Изменили UI (например, фронтенд на React) Нужны: UI-тесты (Selenium, Playwright) Проверяем нажатие кнопок, формы и отображение страниц. from selenium import webdriver driver = webdriver.Chrome() driver.get("https://example.com") assert "Example" in driver.title 🟠Если проект должен выдерживать большую нагрузку Нужны: Нагрузочные тесты (Load Testing) Используем locust, JMeter, k6, чтобы проверить сколько пользователей выдержит сервер. from locust import HttpUser, task class MyUser(HttpUser): @task def test_homepage(self): self.client.get("/") Ставь 👍 и забирай 📚 Базу знаний
видео или голосовое, без подписи
🤔 Можно ли извлечь элемент генератора по индексу? Нет, генераторы не поддерживают индексацию. Их элементы можно получить только путём итерации. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
видео или голосовое, без подписи
🤔 Что такое 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: 'нечётное'} Ставь 👍 и забирай 📚 Базу знаний
видео или голосовое, без подписи
🤔 Зачем нужны схемы в БД? Схема (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; Ставь 👍 и забирай 📚 Базу знаний
🤔 Какие есть минусы у Monkey Patch если использовать не в тесте? Monkey Patching — это изменение или замена кода существующих классов и функций во время выполнения программы. Хотя этот метод бывает полезен, особенно в тестировании, его использование в продакшене может привести к опасным и непредсказуемым последствиям 🚩Ломает предсказуемость кода Когда ты изменяешь поведение встроенных библиотек или сторонних модулей на лету, программисты, читающие код, не смогут понять, почему стандартные функции ведут себя не так, как ожидалось. import datetime # Меняем поведение метода now() def fake_now(): return datetime.datetime(2000, 1, 1) datetime.datetime.now = fake_now # Monkey Patch print(datetime.datetime.now()) # Выведет 2000-01-01 00:00:00 🚩Может вызвать неожиданные ошибки после обновления библиотек Если библиотека обновится, и её внутренняя логика изменится, Monkey Patch может перестать работать или, что ещё хуже, привести к багам. Ты сделал Monkey Patch метода json.dumps, а потом библиотека json обновилась и поменяла его сигнатуру. Теперь твой патч сломается или будет работать некорректно. 🚩Трудно отлаживать и поддерживать Monkey Patching меняет поведение кода в скрытом режиме, поэтому сложно понять, почему что-то работает не так. Если баг возник из-за патча, отладка может занять часы или даже дни. Ты исправил баг с str.split(), заменив его через Monkey Patch, но через 6 месяцев разработчик обновил код, забыл про патч, и всё сломалось. 🚩Может затронуть весь код проекта (глобальное изменение) Monkey Patching меняет поведение для всей программы, а не только в одном модуле или файле. Это делает код хрупким и непредсказуемым. Если ты изменишь метод dict.get(), он будет вести себя по-другому во всех модулях программы. Это может привести к критическим ошибкам. original_get = dict.get def patched_get(self, key, default=None): print(f"Запрашивается ключ: {key}") return original_get(self, key, default) dict.get = patched_get # Monkey Patch d = {"a": 10} print(d.get("a")) # Работает, но теперь с побочным эффектом 🚩Нет гарантии, что это сработает во всех окружениях Monkey Patch может работать на одной версии Python или библиотеки, но сломаться на другой. В продакшене, где есть разные серверы и окружения, это может вызвать непредсказуемые ошибки. Ставь 👍 и забирай 📚 Базу знаний
🤔 Какие есть виды файловых объектов? В Python существует несколько типов файловых объектов, которые используются для работы с различными типами данных. Рассмотрим основные виды файловых объектов и их особенности. 🟠Текстовые файлы (`TextIOWrapper`) Это самый распространённый тип файловых объектов. Такие файлы используются для работы с текстовыми данными и поддерживают строковые операции. with open("example.txt", "w", encoding="utf-8") as file: file.write("Привет, мир!") # Записываем текст в файл with open("example.txt", "r", encoding="utf-8") as file: content = file.read() # Читаем текст из файла print(content) 🟠Бинарные файлы (`BufferedReader`, `BufferedWriter`) Эти файлы используются для работы с двоичными данными (изображениями, видео, аудиофайлами и т. д.). with open("image.jpg", "rb") as file: binary_data = file.read() # Читаем файл в бинарном режиме print(binary_data[:10]) # Выведем первые 10 байтов with open("copy.jpg", "wb") as file: file.write(binary_data) # Записываем данные в новый файл 🟠Файлы ввода-вывода в памяти (`io.StringIO`, `io.BytesIO`) Эти объекты представляют собой файловые буферы, которые хранят данные в оперативной памяти, а не на диске. from io import StringIO file = StringIO() file.write("Привет, мир!") # Запись данных в буфер file.seek(0) # Перемещаем указатель в начало print(file.read()) # Читаем данные из буфера Пример работы с BytesIO: from io import BytesIO file = BytesIO() file.write(b"Binary data") # Запись бинарных данных file.seek(0) print(file.read()) # Чтение данных 🟠Файловые объекты на основе сокетов, пайпов и других источников Python позволяет работать с файловыми объектами, полученными из нестандартных источников, например, сокетов или каналов связи (pipes). import socket s = socket.socket() s.connect(("example.com", 80)) s.sendall(b"GET / HTTP/1.1\r\nHost: example.com\r\n\r\n") response = s.makefile("r", encoding="utf-8") # Создание файлового объекта print(response.readline()) # Читаем первую строку HTTP-ответа s.close() Ставь 👍 и забирай 📚 Базу знаний
🤔 Разница кэш и куки? - Кэш — это временное хранилище файлов и ответов, чтобы ускорить загрузку (изображения, стили, скрипты, запросы). - Cookie — это небольшие данные о пользователе, сохраняемые браузером и автоматически передаваемые серверу (например, для авторизации, настроек, корзин). Кэш ускоряет работу, cookie — хранят состояние пользователя? Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
🤔 Зачем нужен 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 # Удаление всех неиспользуемых томов Ставь 👍 и забирай 📚 Базу знаний
🤔 Что такое Docker container? Docker container — это запущенный экземпляр образа, изолированный процесс с собственным файловым пространством, сетью и конфигурацией. Контейнеры можно останавливать, перезапускать, удалять и масштабировать. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
🤔 Как происходит наследование моделей в Django? В Django можно наследовать модели, используя стандартное наследование классов. Это помогает повторно использовать код, организовывать данные и добавлять общие поля в несколько моделей. Django поддерживает три основных типа наследования: 🟠Абстрактные модели Абстрактные модели используются, когда нужно создать базовый класс с полями и методами, которые должны быть унаследованы, но сам класс не должен создавать таблицу в базе данных. Создается базовый класс с abstract = True в Meta. Дочерние классы наследуют его поля и методы, но не его саму в виде отдельной таблицы. from django.db import models class BaseModel(models.Model): created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) class Meta: abstract = True # Указывает, что это абстрактная модель class Post(BaseModel): title = models.CharField(max_length=255) content = models.TextField() class Comment(BaseModel): text = models.TextField() 🟠Многоуровневое (конкретное) наследование Этот тип наследования создаёт отдельные таблицы для каждой модели. Используется, когда дочерний класс должен представлять отдельную сущность, но при этом иметь доступ к полям родительского класса. Django создаёт отдельные таблицы в БД для родительской и дочерней модели. Дочерняя модель автоматически получает OneToOneField на родительскую. class Person(models.Model): name = models.CharField(max_length=255) class Employee(Person): # Отдельная таблица employee salary = models.DecimalField(max_digits=10, decimal_places=2) 🟠Прокси-модели (Proxy Models) Используются, когда нужно изменить поведение модели без изменения структуры базы данных. Прокси-модель наследует поля родительской модели. В Meta указывается proxy = True. Можно переопределять методы, добавлять новые, но не менять поля. class Person(models.Model): name = models.CharField(max_length=255) class Manager(Person): class Meta: proxy = True # Указываем, что это прокси-модель def get_uppercase_name(self): return self.name.upper() Ставь 👍 и забирай 📚 Базу знаний