Python | Вопросы собесов @python_easy_ru Channel on Telegram

Python | Вопросы собесов

@python_easy_ru


Номер заявления: № 4982734310
+7 921 632 6117

Реклама: @easyoffer_adv
Решай тесты - t.me/+20tRfhrwPpM4NDQy

Нарешивай задачи - t.me/+nsl4meWmhfQwNDVi
Ищи работу - t.me/+cXGKkrOY2-w3ZTky

Python | Вопросы собесов (Russian)

Добро пожаловать в канал Python | Вопросы собесов! Здесь мы разбираем вопросы, которые могут встретиться на собеседованиях для Python разработчиков. Если вы интересуетесь Django, Flask, или FastApi, то вы попали по адресу. На нашем канале вы найдете полезные материалы, советы и рекомендации по подготовке к собеседованию. Мы поможем вам успешно пройти собеседование и получить желаемую работу в сфере Python разработки. Кроме того, на нашем канале есть возможность размещения рекламы, а также ссылки на тесты, задачи и вакансии для Python разработчиков. Присоединяйтесь к нам и станьте профессионалом в области Python разработки!

Python | Вопросы собесов

18 Jan, 16:10


🤔 Как устроены переменные

Это ссылки на объекты, хранящиеся в памяти.
1. Переменная не содержит сам объект, а указывает на него.
2. Тип объекта определяется автоматически, а его управление памятью осуществляется сборщиком мусора.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний

Python | Вопросы собесов

18 Jan, 09:10


🤔 Что можете сказать о конструкции import package.item?

Конструкция import package.item используется для импорта конкретного подмодуля или элемента из пакета в Python.

🚩Пакеты и Подмодули

Пакет — это каталог, который содержит файл __init__.py и может содержать подкаталоги и модули. Подкаталоги в пакете также могут содержать файлыия import py, что делает их под-пакетами. Пример структуры пакета:
package/


вероятность
py
item.py
subpackage/


Конструкции
py
subitem.py


🚩Импорт Подмодуля

Конструкция import package.item позволяет импортировать подмодуль item из пакета package. Например:
import package.item

# Теперь вы можете использовать функции и классы из package.item
package.item.some_function()


🚩Почему это важно?

🟠Организация кода
Пакеты позволяют структурировать код в иерархическую систему, что делает его более организованным и модульным.

🟠Избежание конфликтов имен
Использование пакетов помогает избежать конфликтов имен, так как разные модули могут иметь одинаковые имена, но располагаться в разных пакетах.

🟠Управление зависимостями
Пакеты упрощают управление зависимостями между различными частями кода.

Структура каталога
math_operations/


init.
py
addition.py
subtraction.py


Код вort package.ite
def add(a, b):
return a + b


Код вport package.item
def subtract(a, b):
return a - b


Использование в скрипте
import math_operations.addition
import math_operations.subtraction

result_add = math_operations.addition.add(5, 3)
result_subtract = math_operations.subtraction.subtract(5, 3)

print("Addition:", result_add) # Выведет: Addition: 8
print("Subtraction:", result_subtract) # Выведет: Subtraction: 2


Ставь 👍 и забирай 📚 Базу знаний

Python | Вопросы собесов

17 Jan, 16:10


🤔 В чем разница между процессом и потоком?

1. Процесс — это независимая единица выполнения с собственной памятью.
2. Поток — это часть процесса, использующая общую память с другими потоками того же процесса.
3. Потоки легче создаются, но менее изолированы, чем процессы.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний

Python | Вопросы собесов

17 Jan, 09:10


🤔 Что такое RESTful?

Это подход к проектированию веб-сервисов, основанный на архитектурном стиле REST (*Representational State Transfer*). Это не протокол или стандарт, а набор принципов и ограничений, которые используются для создания систем, взаимодействующих через HTTP. Если API соответствует этим принципам, его называют RESTful.

🚩 Основные принципы REST

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

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

🟠Унифицированный интерфейс
RESTful API использует единый, стандартный интерфейс для взаимодействия. Это достигается следующими средствами:
Идентификация ресурсов через URI: Каждый ресурс имеет уникальный адрес (URI).

GET https://api.example.com/users/123

Использование стандартных HTTP-методов:
GET — для получения данных.
POST — для создания новых данных.
PUT или PATCH — для обновления данных.
DELETE — для удаления данных.
Ресурсы как представления: Ресурсы передаются в формате JSON, XML или другом формате.

🟠Кэширование
Ответы сервера могут быть кэшируемыми. Это уменьшает нагрузку на сервер и ускоряет работу клиента.

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

🟠Код по требованию (опционально)
Иногда сервер может передавать исполняемый код (например, JavaScript) клиенту, чтобы расширить его функциональность. Это не обязательно.

🚩Почему RESTful важен?

RESTful архитектура позволяет:
🟠Сделать API простым и понятным
Клиенты легко понимают, как обращаться к ресурсам (используя стандартные методы и адреса).
🟠Обеспечить гибкость
Клиенты и серверы могут развиваться независимо друг от друга.
🟠Поддерживать масштабируемость
RESTful API легко масштабируются, так как все запросы независимы друг от друга (статичность).
🟠Облегчить интеграцию
RESTful API поддерживают стандартизированные протоколы (HTTP), что делает интеграцию с другими сервисами проще.

Ставь 👍 и забирай 📚 Базу знаний

Python | Вопросы собесов

16 Jan, 16:10


🤔 В чем разница между `copy()` и `deepcopy()`?

1. copy() создаёт поверхностную копию, при которой вложенные объекты остаются общими с оригиналом.
2. deepcopy() создаёт глубокую копию, рекурсивно копируя все вложенные объекты.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний

Python | Вопросы собесов

16 Jan, 09:10


🤔 Зачем нужны классы 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) часто возникает несколько ошибок одновременно, и их можно группировать для дальнейшей обработки.
Упрощение сложной логики.
Код становится проще и понятнее, так как не нужно вручную собирать и разбирать исключения.

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

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

Ставь 👍 и забирай 📚 Базу знаний

Python | Вопросы собесов

15 Jan, 16:10


🤔 Что такое итерируемый объект

Это объект, который можно перебрать с помощью цикла for.
1. Он должен реализовывать метод __iter__, возвращающий итератор.
2. Примеры: списки, строки, словари, множества.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний

Python | Вопросы собесов

15 Jan, 09:10


🤔 Чем асинхронность отличается от многопоточности?

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

🚩Асинхронность

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

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

🟠Ожидание через "event loop"
Асинхронный подход использует цикл событий (event loop), который управляет выполнением задач. Если задача блокируется, цикл событий переключается на следующую задачу.

🟠Неблокирующий ввод/вывод
Асинхронный код не простаивает в ожидании завершения операций ввода/вывода (I/O). Вместо этого такие операции сигнализируют о завершении через "обещание" (например, Future или asyncio.Task).

import asyncio

async def fetch_data():
print("Начинаем загрузку данных...")
await asyncio.sleep(2) # Асинхронная пауза (имитирует длительную операцию)
print("Данные загружены!")
return {"data": "some data"}

async def main():
print("Старт программы")
data = await fetch_data()
print(f"Результат: {data}")
print("Конец программы")

# Запуск цикла событий
asyncio.run(main())


🚩Многопоточность
Это способ выполнения нескольких задач одновременно с использованием нескольких потоков. Потоки — это "легковесные" процессы, которые разделяют одну и ту же память, но могут выполняться независимо друг от друга.

🟠Несколько потоков
Программа создает несколько потоков, каждый из которых выполняет свою задачу.
🟠Параллельное выполнение
Если у процессора несколько ядер, потоки могут выполняться действительно параллельно.
🟠Блокирующий код
В отличие от асинхронного подхода, потоки часто блокируются в ожидании завершения операций (например, I/O).

import threading
import time

def task(name):
print(f"Начало задачи {name}")
time.sleep(2) # Имитация длительной операции
print(f"Конец задачи {name}")

# Создаем и запускаем потоки
thread1 = threading.Thread(target=task, args=("A",))
thread2 = threading.Thread(target=task, args=("B",))

thread1.start()
thread2.start()

# Ожидаем завершения потоков
thread1.join()
thread2.join()
print("Все задачи завершены")


Ставь 👍 и забирай 📚 Базу знаний

Python | Вопросы собесов

14 Jan, 16:10


🤔 Что такое поверхностная копия

Поверхностная копия (shallow copy) создаёт новый объект, но копирует ссылки на вложенные объекты.
1. Изменение вложенных данных в копии отразится на оригинале.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний

Python | Вопросы собесов

14 Jan, 09:10


🤔 Как отсортировать список словарей по определенному полю?

Для сортировки списка словарей по определенному полю в Python удобно использовать функцию sorted() или метод sort(). Оба подхода позволяют указать ключ сортировки с помощью параметра key, где можно передать либо функцию, либо лямбда-выражение, которое извлекает значение из словаря для сортировки.

🚩Почему это важно?

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

🚩Как это сделать?

🟠Использование функции `sorted()`
Эта функция возвращает новый отсортированный список.
   employees = [
{"name": "Alice", "age": 30, "salary": 70000},
{"name": "Bob", "age": 25, "salary": 50000},
{"name": "Charlie", "age": 35, "salary": 120000}
]

# Сортировка по возрасту
sorted_employees = sorted(employees, key=lambda x: x["age"])

print(sorted_employees)


Результат
   [{'name': 'Bob', 'age': 25, 'salary': 50000},
{'name': 'Alice', 'age': 30, 'salary': 70000},
{'name': 'Charlie', 'age': 35, 'salary': 120000}]


🟠Использование метода `sort()`
Этот метод изменяет существующий список.
   employees = [
{"name": "Alice", "age": 30, "salary": 70000},
{"name": "Bob", "age": 25, "salary": 50000},
{"name": "Charlie", "age": 35, "salary": 120000}
]

# Сортировка по зарплате
employees.sort(key=lambda x: x["salary"])

print(employees)


Результат
   [{'name': 'Bob', 'age': 25, 'salary': 50000},
{'name': 'Alice', 'age': 30, 'salary': 70000},
{'name': 'Charlie', 'age': 35, 'salary': 120000}]


🟠Сортировка в обратном порядке
Установите параметр reverse=True, чтобы отсортировать в порядке убывания.
   sorted_employees_desc = sorted(employees, key=lambda x: x["age"], reverse=True)
print(sorted_employees_desc)


🟠Использование функции `itemgetter` из модуля `operator`
Это более эффективный способ, чем лямбда-функция, особенно для больших данных.
   from operator import itemgetter

sorted_employees = sorted(employees, key=itemgetter("age"))
print(sorted_employees)


🚩Обработка отсутствующих значений

Если поле может отсутствовать в некоторых словарях, можно использовать параметр key для обработки таких ситуаций.
employees = [
{"name": "Alice", "age": 30},
{"name": "Bob"},
{"name": "Charlie", "age": 35}
]

sorted_employees = sorted(employees, key=lambda x: x.get("age", 0))
print(sorted_employees)


Результат
[{'name': 'Bob'},
{'name': 'Alice', 'age': 30},
{'name': 'Charlie', 'age': 35}]


Ставь 👍 и забирай 📚 Базу знаний

Python | Вопросы собесов

13 Jan, 16:10


🤔 Что такое глубокая копия

Глубокая копия (deep copy) создаёт новый объект и рекурсивно копирует все вложенные объекты.
1. Используется, чтобы избежать изменения оригинала при работе с вложенными структурами данных.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний

Python | Вопросы собесов

13 Jan, 09:10


🤔 Какие есть методы у классов ?

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

🟠Обычные методы (Instance Methods)
Работают с экземплярами класса и могут изменять состояние объекта. Они принимают как первый аргумент self, который ссылается на экземпляр класса.
class MyClass:
def __init__(self, value):
self.value = value

def increment(self):
self.value += 1

# Использование
obj = MyClass(10)
obj.increment()
print(obj.value) # Вывод: 11


🟠Методы класса (Class Methods)
Работают с самим классом, а не с экземплярами. Они принимают как первый аргумент cls, который ссылается на класс. Методы класса обозначаются декоратором @classmethod.
class MyClass:
count = 0

def __init__(self):
MyClass.count += 1

@classmethod
def get_count(cls):
return cls.count

# Использование
obj1 = MyClass()
obj2 = MyClass()
print(MyClass.get_count()) # Вывод: 2


🟠Статические методы (Static Methods)
Не зависят ни от экземпляра класса, ни от самого класса. Они не принимают self или cls в качестве первого аргумента. Статические методы обозначаются декоратором @staticmethod.
class MyClass:
@staticmethod
def greet(name):
return f"Hello, {name}!"

# Использование
print(MyClass.greet("Alice")) # Вывод: Hello, Alice!


🚩Специальные методы (Special Methods или Magic Methods)

Специальные методы определяют поведение объектов при использовании встроенных функций и операций. Они включают такие методы, как init, str, repr, len, getitem, setitem, delitem, call, enter, exit, и многие другие.

🟠init
Конструктор класса, вызываемый при создании нового экземпляра.
        class MyClass:
def init(self, value):
self.value = value

obj = MyClass(10)



🟠str
Определяет строковое представление объекта для функции str() и оператора print.
        class MyClass:
def init(self, value):
self.value = value

def str(self):
return f"MyClass with value: {self.value}"

obj = MyClass(10)
print(obj) # Вывод: MyClass with value: 10


🟠__getitem__, __setitem__, __delitem__
Определяют поведение объекта при доступе к элементам по индексу (для коллекций).
    class MyList:
def __init__(self, items):
self.items = items

def __getitem__(self, index):
return self.items[index]

def __setitem__(self, index, value):
self.items[index] = value

def __delitem__(self, index):
del self.items[index]

lst = MyList([1, 2, 3])
print(lst[1]) # Вывод: 2
lst[1] = 20
print(lst[1]) # Вывод: 20
del lst[1]
print(lst.items) # Вывод: [1, 3]


🟠
__enter__, __exit__
Определяют поведение объекта в контексте оператора with.
    ```python
class ManagedResource:
def enter(self):
print("Entering the context")
return self

def exit(self, exc_type, exc_value, traceback):
print("Exiting the context")
return False

with ManagedResource():
print("Inside the context")


Ставь 👍 и забирай 📚 Базу знаний

Python | Вопросы собесов

12 Jan, 16:10


🤔 Что такое аннотации типов

Это синтаксис для указания типов данных переменных, аргументов и возвращаемого значения функции.
1. Они служат для повышения читаемости кода и статической проверки типов, но не влияют на выполнение.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний

Python | Вопросы собесов

12 Jan, 09:10


🤔 Расскажи о методах eq, ne, lt, le, qt, qe?

Методы eq, ne, lt, le, gt, и ge являются специальными методами, которые позволяют определять, как объекты пользовательских классов будут сравниваться друг с другом. Эти методы обеспечивают перегрузку операторов сравнения, таких как ==, !=, <, <=, >, и >=.

🟠Метод eq
Используется для перегрузки оператора равенства (==). Он вызывается, когда нужно проверить, равны ли два объекта.
class Person:
def __init__(self, name, age):
self.name = name
self.age = age

def __eq__(self, other):
if isinstance(other, Person):
return self.name == other.name and self.age == other.age
return False

# Использование
p1 = Person("Alice", 30)
p2 = Person("Alice", 30)
p3 = Person("Bob", 25)

print(p1 == p2) # Вывод: True
print(p1 == p3) # Вывод: False


🟠Метод name, age
Используется для перегрузки оператора неравенства (!=). Он вызывается, когда нужно проверить, не равны ли два объекта.
class Person:
def __init__(self, name, age):
self.name = name
self.age = age

def __ne__(self, other):
if isinstance(other, Person):
return self.name != other.name or self.age != other.age
return True

# Использование
p1 = Person("Alice", 30)
p2 = Person("Alice", 30)
p3 = Person("Bob", 25)

print(p1 != p2) # Вывод: False
print(p1 != p3) # Вывод: True


🟠Метод age
Используется для перегрузки оператора "меньше чем" (<). Он вызывается, когда нужно проверить, меньше ли один объект другого.
class Person:
def __init__(self, name, age):
self.name = name
self.age = age

def __lt__(self, other):
if isinstance(other, Person):
return self.age < other.age
return NotImplemented

# Использование
p1 = Person("Alice", 30)
p2 = Person("Bob", 25)

print(p1 < p2) # Вывод: False
print(p2 < p1) # Вывод: True


🟠Метод ass
Используется для перегрузки оператора "меньше или равно" (<=). Он вызывается, когда нужно проверить, меньше ли или равен один объект другому.
class Person:
def __init__(self, name, age):
self.name = name
self.age = age

def __le__(self, other):
if isinstance(other, Person):
return self.age <= other.age
return NotImplemented

# Использование
p1 = Person("Alice", 30)
p2 = Person("Bob", 25)
p3 = Person("Charlie", 30)

print(p1 <= p2) # Вывод: False
print(p2 <= p1) # Вывод: True
print(p1 <= p3) # Вывод: True


Ставь 👍 и забирай 📚 Базу знаний

Python | Вопросы собесов

11 Jan, 16:10


🤔 Что такое `kwargs`

Это способ передачи произвольного количества именованных аргументов.
1. Указывается как **kwargs в объявлении функции.
2. Аргументы передаются в виде словаря.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний

Python | Вопросы собесов

11 Jan, 09:10


🤔 Расскажи о методе bool?

Метод __bool__ является специальным методом, который позволяет определить, как объект будет оцениваться в логическом контексте. Этот метод должен возвращать булево значение (True или False), которое указывает на истинность или ложность объекта.

🚩Основное предназначение

Используется для реализации логического поведения объектов при использовании встроенной функции bool() и в условиях (например, в инструкциях if и while). Если объект не имеет метода bool, Python вызывает метод len, и если len возвращает ноль, объект считается ложным.
class Box:
def __init__(self, items):
self.items = items

def __bool__(self):
return bool(self.items)

def __repr__(self):
return f"Box({self.items})"

# Использование
box1 = Box([1, 2, 3])
box2 = Box([])

print(bool(box1)) # Вывод: True
print(bool(box2)) # Вывод: False

if box1:
print("box1 is not empty") # Вывод: box1 is not empty

if not box2:
print("box2 is empty") # Вывод: box2 is empty


🚩Использование метода len для логического контекста

Если метод bool не определён, Python использует метод len для определения логического значения объекта. Если метод len возвращает 0, объект считается ложным, в противном случае — истинным.
class Box:
def __init__(self, items):
self.items = items

def __len__(self):
return len(self.items)

def __repr__(self):
return f"Box({self.items})"

# Использование
box1 = Box([1, 2, 3])
box2 = Box([])

print(bool(box1)) # Вывод: True
print(bool(box2)) # Вывод: False

if box1:
print("box1 is not empty") # Вывод: box1 is not empty

if not box2:
print("box2 is empty") # Вывод: box2 is empty


Ставь 👍 и забирай 📚 Базу знаний

Python | Вопросы собесов

10 Jan, 16:10


🤔 Что такое `args`

Это сокращение для передачи произвольного количества позиционных аргументов в функцию.
1. Указывается как *args в объявлении функции.
2. Позволяет обрабатывать переменное количество аргументов в виде кортежа.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний

Python | Вопросы собесов

10 Jan, 09:10


🤔 Расскажи о методах add , mul , sub , truediv?

Методы add, mul, sub и truediv являются специальными методами (или "магическими методами"), которые позволяют объектам пользовательских классов взаимодействовать с операциями сложения, умножения, вычитания и деления соответственно. Эти методы обеспечивают удобную и интуитивно понятную интеграцию пользовательских классов с арифметическими операциями Python.

🟠Метод add
Используется для реализации оператора сложения (+). Он вызывается, когда используется оператор + между двумя объектами.
class Vector:
def __init__(self, x, y):
self.x = x
self.y = y

def __add__(self, other):
return Vector(self.x + other.x, self.y + other.y)

def __repr__(self):
return f"Vector({self.x}, {self.y})"

# Использование
v1 = Vector(1, 2)
v2 = Vector(3, 4)
v3 = v1 + v2
print(v3) # Вывод: Vector(4, 6)


🟠Метод mul
Используется для реализации оператора умножения (*). Он вызывается, когда используется оператор * между двумя объектами.
class Vector:
def __init__(self, x, y):
self.x = x
self.y = y

def __mul__(self, scalar):
return Vector(self.x * scalar, self.y * scalar)

def __repr__(self):
return f"Vector({self.x}, {self.y})"

# Использование
v = Vector(1, 2)
v2 = v * 3
print(v2) # Вывод: Vector(3, 6)


🟠Метод sub
Используется для реализации оператора вычитания (-). Он вызывается, когда используется оператор - между двумя объектами.
class Vector:
def __init__(self, x, y):
self.x = x
self.y = y

def __sub__(self, other):
return Vector(self.x - other.x, self.y - other.y)

def __repr__(self):
return f"Vector({self.x}, {self.y})"

# Использование
v1 = Vector(5, 7)
v2 = Vector(2, 3)
v3 = v1 - v2
print(v3) # Вывод: Vector(3, 4)


🟠Метод truediv
Используется для реализации оператора деления (/). Он вызывается, когда используется оператор / между двумя объектами.
class Vector:
def __init__(self, x, y):
self.x = x
self.y = y

def __truediv__(self, scalar):
return Vector(self.x / scalar, self.y / scalar)

def __repr__(self):
return f"Vector({self.x}, {self.y})"

# Использование
v = Vector(6, 8)
v2 = v / 2
print(v2) # Вывод: Vector(3.0, 4.0)


Ставь 👍 и забирай 📚 Базу знаний

Python | Вопросы собесов

09 Jan, 16:10


🤔 Для чего подходят асинхронные операции?

1. Асинхронные операции подходят для задач с высокой задержкой: сетевые запросы, доступ к базам данных, ввод/вывод файлов.
2. Они повышают производительность за счёт параллельного выполнения задач, не блокируя основной поток.
3. Особенно полезны для приложений с большим числом одновременно обслуживаемых клиентов (например, веб-серверы).


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний

Python | Вопросы собесов

09 Jan, 12:56


📊 Реклама в сети телеграм каналов easyoffer
✈️ Для заказа пишите @easyoffer_adv

easyoffer
Backend

Python | Вопросы
Python | Удалёнка
Python | LeetCode
Python | Тесты

Frontend | Вопросы
Frontend | Удалёнка
JavaScript | LeetCode
Frontend | Тесты

Java | Вопросы
Java | Удалёнка
Java | LeetCode
Java | Тесты

Тестировщик | Вопросы
Тестировщик | Удалёнка
Тестировщик | Тесты

Data Science | Вопросы
Data Science | Удалёнка
Data Science | Тесты

C# | Вопросы
C# | Удалёнка
C# | LeetCode
C# | Тесты

C/C++ | Вопросы
C/C++ | Удалёнка
C/C++ | LeetCode
C/C++ | Тесты

Golang | Вопросы
Golang | Удалёнка
Golang | LeetCode
Golang | Тесты

DevOps | Вопросы
DevOps | Удалёнка
DevOps | Тесты

PHP | Вопросы
PHP | Удалёнка
PHP | LeetCode
PHP | Тесты

Kotlin | Вопросы
Kotlin | Удалёнка
Kotlin | LeetCode
Kotlin | Тесты

Swift | Вопросы
Swift | Удалёнка
Swift | LeetCode
Swift | Тесты

📊 Реклама в сети телеграм каналов easyoffer
✈️ Для заказа пишите @easyoffer_adv

Python | Вопросы собесов

07 Jan, 16:10


🤔 Для чего можно использовать Celery?

1. Это инструмент для выполнения задач в фоновом режиме.
2. Используется для отправки уведомлений, обработки данных, построения отчётов и выполнения длительных операций вне основного потока.
3. Поддерживает планирование задач и распределённую обработку через брокеры, такие как RabbitMQ или Redis.


Ставь 👍 и забирай 📚 Базу знаний

Python | Вопросы собесов

07 Jan, 09:10


🤔 Что такое конструктор класса ?

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

🚩Конструктор

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

def display(self):
print(f"Name: {self.name}, Age: {self.age}")

# Создание экземпляра класса Person
person1 = Person("Alice", 30)
person1.display() # Вывод: Name: Alice, Age: 30

person2 = Person("Bob", 25)
person2.display() # Вывод: Name: Bob, Age: 25


🚩Основные функции

🟠Инициализация атрибутов
Инициализирует атрибуты объекта начальными значениями.

🟠Выполнение необходимой логики
Может выполнять любые действия, необходимые при создании объекта (например, проверка входных данных).

🟠Управление ресурсами
Может выполнять действия по управлению ресурсами, такие как открытие файлов или подключение к базе данных.

🚩Перегрузка

Перегрузка конструктора не поддерживается напрямую, но можно использовать аргументы по умолчанию или конструкцию args и kwargs для имитации перегрузки.
#include <iostream>
using namespace std;

class Person {
public:
string name;
int age;

// Конструктор по умолчанию
Person() {
name = "Unknown";
age = 0;
}

// Конструктор с параметрами
Person(string n, int a) {
name = n;
age = a;
}

void display() {
cout << "Name: " << name << ", Age: " << age << endl;
}
};

int main() {
Person person1;
person1.display(); // Вывод: Name: Unknown, Age: 0

Person person2("Alice", 30);
person2.display(); // Вывод: Name: Alice, Age: 30

return 0;
}


Ставь 👍 и забирай 📚 Базу знаний

Python | Вопросы собесов

06 Jan, 16:10


🤔 Что такое async?

Это ключевое слово, используемое для создания асинхронных функций, которые работают в неблокирующем режиме.
1. Асинхронные операции позволяют выполнять другие задачи, пока ожидается завершение медленных операций, таких как запросы к сети или доступ к файлам.
2. Async используется с await для управления асинхронным кодом.

Ставь 👍 и забирай 📚 Базу знаний

Python | Вопросы собесов

06 Jan, 09:10


🤔 Когда нельзя линеаризовать ?

Это процесс определения порядка разрешения методов (Method Resolution Order, MRO), который используется для поиска методов и атрибутов в иерархии классов при множественном наследовании.

🚩Когда нельзя линеаризовать иерархию классов

🟠Несоответствие принципам C3-линеаризации
Python использует алгоритм C3-линеаризации для определения MRO. Если иерархия классов не соответствует принципам C3-линеаризации, то линеаризация невозможна.

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

🟠Несовместимые суперклассы
Если классы в иерархии имеют несовместимые или пересекающиеся зависимости, это может сделать линеаризацию невозможной.

class A:
pass

class B(A):
pass

class C(A):
pass

class D(B, C):
pass


🚩Как определяется

Python использует C3-линеаризацию для определения порядка разрешения методов. Этот алгоритм соблюдает порядок наследования классов, учитывая при этом принципы монотонности и консистентности.
class A:
def method(self):
print("A")

class B(A):
def method(self):
print("B")

class C(A):
def method(self):
print("C")

class D(B, C):
pass

d = D()
d.method() # Вывод: B


Ставь 👍 и забирай 📚 Базу знаний

Python | Вопросы собесов

05 Jan, 16:10


🤔 Что такое HTTP и HTTPS?

1. HTTP (HyperText Transfer Protocol): протокол передачи данных между клиентом и сервером, передаёт данные в открытом виде.
2. HTTPS: расширение HTTP, использующее шифрование через SSL/TLS для защиты передаваемых данных.
3. HTTPS обеспечивает конфиденциальность, целостность данных и аутентификацию сервера.


Ставь 👍 и забирай 📚 Базу знаний

Python | Вопросы собесов

05 Jan, 09:10


🤔 Что такое проблема наследования ?

Наследование является мощным механизмом в ООП, но оно также может привести к ряду проблем, которые следует учитывать при проектировании и разработке программного обеспечения. Вот основные проблемы, связанные с наследованием:

🚩Основные проблемы

🟠Жёсткая связь (Tight Coupling)
Классы-наследники зависят от родительских классов. Изменения в родительских классах могут потребовать изменений в классах-наследниках. Если метод в родительском классе изменяет свою сигнатуру или поведение, все классы-наследники должны быть проверены и, возможно, изменены. Решение: Использование композиции вместо наследования, когда это возможно.

🟠Проблема повторного использования (Fragile Base Class Problem)
Изменения в базовом классе могут непредсказуемо повлиять на поведение классов-наследников. Добавление нового метода в базовый класс может конфликтовать с существующим методом в классе-наследнике. Решение: Ограничение изменений в базовом классе, тщательное проектирование и тестирование.

🟠Проблемы с множественным наследованием
Может привести к конфликтам имен методов и атрибутов, а также к сложности разрешения порядка вызовов методов (MRO — Method Resolution Order). Если два родительских класса имеют методы с одинаковыми именами, класс-наследник может неясно указывать, какой метод использовать. Решение: Использование интерфейсов (в языках, поддерживающих интерфейсы) или композиций. В Python использовать миксины.

🟠Избыточность интерфейсов
Классы-наследники наследуют все методы и атрибуты родительских классов, даже если они не нужны. Класс-наследник может быть перегружен ненужными методами и свойствами, которые ему не требуются. Решение: Использование композиции для включения только нужных функциональностей.

🟠Нарушение инкапсуляции
Классы-наследники могут получить доступ к защищённым (protected) и приватным (private) членам родительского класса, что может нарушить инкапсуляцию. Класс-наследник может изменить состояние родительского класса, вызывая неожиданные побочные эффекты. Решение: Строгое следование принципам инкапсуляции, использование методов доступа (геттеров и сеттеров).
class A:
def method(self):
print("Method from class A")

class B:
def method(self):
print("Method from class B")

class C(A, B):
pass

c = C()
c.method() # Вывод: Method from class A (MRO выбрал метод из класса A)


🚩Решение проблем наследования

🟠Композиция вместо наследования
Предлагает включение объектов других классов в качестве членов, предоставляя больше гибкости и меньшую связанность по сравнению с наследованием.
      class Engine:
def start(self):
print("Engine started")

class Car:
def __init__(self):
self.engine = Engine()

def start(self):
self.engine.start()
print("Car started")

car = Car()
car.start()


🟠Использование интерфейсов и абстрактных классов
Могут помочь определить строгие контракты для классов-наследников без предоставления реализации.

🟠Миксины
Это классы, которые предназначены для предоставления дополнительной функциональности через множественное наследование, но они не предназначены для инстанцирования напрямую.

Ставь 👍 и забирай 📚 Базу знаний

Python | Вопросы собесов

04 Jan, 16:10


🤔 Чем хорош FastAPI?

1. Высокая производительность: использует Starlette и Pydantic, обеспечивая быстрый отклик.
2. Асинхронность: поддерживает async/await для обработки множества запросов одновременно.
3. Автогенерация документации: автоматически создаёт OpenAPI-спецификации и Swagger UI.
4. Удобство валидации: встроенная поддержка проверки данных.


Ставь 👍 и забирай 📚 Базу знаний

Python | Вопросы собесов

04 Jan, 09:10


🤔 Расскажи о методах enter и exit ?

Методы __enter__ и exit являются частью протокола менеджера контекста. Они позволяют объектам определять поведение в контексте оператора with. Эти методы обеспечивают безопасное и автоматическое управление ресурсами, такими как файлы, сетевые соединения и другие объекты, которые требуют явного открытия и закрытия.

🚩Протокол менеджера контекста

🟠__enter__(self)
Выполняется в начале блока with и возвращает объект, который будет присвоен переменной, указанной после as.
🟠__exit__(self, exc_type, exc_value, traceback)
Выполняется в конце блока with, независимо от того, произошло исключение или нет. Он используется для очистки и освобождения ресурсов.

class ManagedResource:
def __enter__(self):
print("Entering the context")
return self

def __exit__(self, exc_type, exc_value, traceback):
print("Exiting the context")
if exc_type:
print(f"Exception type: {exc_type}")
print(f"Exception value: {exc_value}")
print(f"Traceback: {traceback}")
return True # True указывает на то, что исключение было обработано

# Использование
with ManagedResource() as resource:
print("Inside the context")

print("Outside the context")


Пример управления файлом с использованием менеджера контекста
class FileManager:
def __init__(self, filename, mode):
self.filename = filename
self.mode = mode

def __enter__(self):
self.file = open(self.filename, self.mode)
return self.file

def __exit__(self, exc_type, exc_value, traceback):
self.file.close()
if exc_type:
print(f"Exception type: {exc_type}")
print(f"Exception value: {exc_value}")
print(f"Traceback: {traceback}")
return True

# Использование
with FileManager("example.txt", "w") as f:
f.write("Hello, World!")

print("File operation completed")


Ставь 👍 и забирай 📚 Базу знаний

Python | Вопросы собесов

03 Jan, 16:10


🤔 Как работает хеш-таблица?

Хеш-таблица хранит данные в формате ключ-значение, используя хеш-функцию для быстрого доступа.
1. Хеш-функция преобразует ключ в индекс массива.
2. Если возникают коллизии (два ключа дают одинаковый хеш), используются методы разрешения коллизий, например, цепочки (chaining) или открытая адресация.
3. В среднем сложность доступа — O(1), но может быть хуже при большом количестве коллизий.


Ставь 👍 и забирай 📚 Базу знаний

Python | Вопросы собесов

03 Jan, 09:10


🤔 Расскажи о методах getitem и setitem и delitem?

Методы getitem, setitem и delitem являются специальными методами, которые позволяют пользовательским объектам взаимодействовать с операциями получения, установки и удаления элементов по индексу или ключу. Эти методы обеспечивают интеграцию пользовательских классов с операциями индексирования, делая их поведение аналогичным встроенным типам данных, таким как списки и словари.

🚩Метод getitem

Используется для получения значения элемента по индексу или ключу. Он вызывается, когда используется оператор индексирования (obj[key]).
class CustomList:
def __init__(self, items):
self.items = items

def __getitem__(self, index):
return self.items[index]

# Использование
my_list = CustomList([1, 2, 3, 4, 5])
print(my_list[2]) # Вывод: 3


🚩Метод titem и delit

Используется для установки значения элемента по индексу или ключу. Он вызывается, когда используется оператор присваивания с индексированием (obj[key] = value).
class CustomList:
def __init__(self, items):
self.items = items

def __setitem__(self, index, value):
self.items[index] = value

# Использование
my_list = CustomList([1, 2, 3, 4, 5])
my_list[2] = 10
print(my_list.items) # Вывод: [1, 2, 10, 4, 5]


🚩Метод delitem

Используется для удаления элемента по индексу или ключу. Он вызывается, когда используется оператор удаления с индексированием (del obj[key]).
class CustomList:
def __init__(self, items):
self.items = items

def __delitem__(self, index):
del self.items[index]

# Использование
my_list = CustomList([1, 2, 3, 4, 5])
del my_list[2]
print(my_list.items) # Вывод: [1, 2, 4, 5]


Полный пример пользовательского класса
class CustomDict:
def __init__(self):
self.items = {}

def __getitem__(self, key):
return self.items[key]

def __setitem__(self, key, value):
self.items[key] = value

def __delitem__(self, key):
del self.items[key]

def __repr__(self):
return f"{self.items}"

# Использование
my_dict = CustomDict()
my_dict['a'] = 1
my_dict['b'] = 2
print(my_dict['a']) # Вывод: 1
print(my_dict) # Вывод: {'a': 1, 'b': 2}
del my_dict['a']
print(my_dict) # Вывод: {'b': 2}


Ставь 👍 и забирай 📚 Базу знаний

Python | Вопросы собесов

02 Jan, 16:10


🤔 Какие инструменты для виртуального окружения используются?

1. venv: встроенный инструмент Python для создания изолированных окружений.
2. virtualenv: популярное расширение с дополнительными функциями для управления виртуальными окружениями.
3. conda: используется в научных вычислениях и анализе данных, управляет не только Python, но и библиотеками C/C++.
4. Poetry: создаёт и управляет зависимостями через автоматическое создание виртуальных окружений.


Ставь 👍 и забирай 📚 Базу знаний

Python | Вопросы собесов

02 Jan, 09:10


🤔 Что такое JWT?

Это компактный, URL-безопасный способ представления заявок между двумя сторонами. JWT широко используется для аутентификации и авторизации в веб-приложениях.

🚩Основные характеристики

🟠Компактность
JWT — это компактный формат, который легко передавать через URL, заголовки HTTP или внутри тела запроса.

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

🟠Безопасность
JWT может быть подписан с использованием алгоритмов HMAC или RSA, что обеспечивает целостность и подлинность данных.

🚩Структура

🟠Header (Заголовок)
Заголовок обычно содержит два поля
Тип токена (typ), который для JWT равен "JWT".
Алгоритм подписи (alg), например, HMAC SHA256 или RSA.
{
"alg": "HS256",
"typ": "JWT"
}


🟠Payload (Полезная нагрузка)
Полезная нагрузка содержит набор заявок (claims). Заявки бывают трех типов: Registered claims (Зарегистрированные заявки): Зарезервированные ключи, такие как iss (issuer), exp (expiration time), sub (subject), и aud (audience).
Public claims (Публичные заявки): Пользовательские ключи, определенные в спецификации IANA JSON Web Token Registry или согласованные между сторонами.
Private claims (Частные заявки): Пользовательские ключи, уникальные для конкретного приложения.
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}


🟠Signature (Подпись)
Подпись создается путем кодирования заголовка и полезной нагрузки с использованием Base64URL и их объединения. Затем применяется алгоритм, указанный в заголовке, к объединенной строке с использованием секретного ключа.
HMACSHA256(
base64UrlEncode(header) + "." + base64UrlEncode(payload),
secret
)


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

1⃣Установка библиотеки
pip install pyjwt


2⃣Создание JWT
import jwt
import datetime

# Секретный ключ
secret_key = "your-256-bit-secret"

# Заголовок
header = {
"alg": "HS256",
"typ": "JWT"
}

# Полезная нагрузка
payload = {
"sub": "1234567890",
"name": "John Doe",
"admin": True,
"exp": datetime.datetime.utcnow() + datetime.timedelta(seconds=30) # Время истечения действия токена
}

# Создание JWT
token = jwt.encode(payload, secret_key, algorithm="HS256", headers=header)
print(token)


3⃣Декодирование JWT
import jwt

# Секретный ключ
secret_key = "your-256-bit-secret"

# Декодирование JWT
try:
decoded_payload = jwt.decode(token, secret_key, algorithms=["HS256"])
print(decoded_payload)
except jwt.ExpiredSignatureError:
print("Signature has expired")
except jwt.InvalidTokenError:
print("Invalid token")


Ставь 👍 и забирай 📚 Базу знаний

Python | Вопросы собесов

01 Jan, 16:16


– Помощь с pet-проектом
– Составление roadmap
– Общая консультация
– Проведение код-ревью и mock-собеседования
– Помощь с трудоустройством

Все это и многое другое может Ментор. Он обеспечит вам необходимый boost, ускорит и упростит вход в IT.

🔥 Здесь размещен список менторов, и многие из них предлагают бесплатную первую консультацию

Python | Вопросы собесов

01 Jan, 16:10


🤔 Как работает хеш-таблица?

Это структура данных, которая хранит пары ключ-значение и использует хеш-функцию для вычисления индекса.
Хеширование: ключ преобразуется в числовое значение (хеш).
Размещение: хеш определяет индекс, куда сохраняется значение.
Коллизии: если два ключа имеют одинаковый хеш, используется метод разрешения коллизий (связанный список, открытая адресация).
Хеш-таблицы обеспечивают быстрый доступ (O(1)) к данным при правильной реализации.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний

Python | Вопросы собесов

01 Jan, 09:10


🤔 Расскажи о методе call ?

Метод __call__ является специальным методом, который позволяет экземплярам классов вести себя как функции. Если объект класса имеет данный метод, то этот объект можно вызывать, как если бы он был функцией. Это может быть полезно для создания объектов, которые действуют как замыкания, для реализации паттернов проектирования и других сценариев, требующих функциональности.

🚩Основное предназначение

Позволяет объекту вести себя как функция. Он вызывается, когда экземпляр класса вызывается как функция.
class Counter:
def __init__(self):
self.count = 0

def __call__(self):
self.count += 1
return self.count

# Использование
counter = Counter()
print(counter()) # Вывод: 1
print(counter()) # Вывод: 2
print(counter()) # Вывод: 3


🚩Применение метода

🟠Функциональные объекты
Позволяет создавать объекты, которые можно вызывать как функции, что полезно для создания замыканий и функций высшего порядка.

🟠Кеширование
Используется для реализации механизмов кеширования в классах, когда результат вычисления может быть закеширован и повторно использован.

🟠Паттерны проектирования: Полезен для реализации различных паттернов проектирования, таких как синглтон, декоратор и фабрика.

class Multiplier:
def __init__(self, factor):
self.factor = factor

def __call__(self, value):
return value * self.factor

# Использование
double = Multiplier(2)
triple = Multiplier(3)

print(double(5)) # Вывод: 10
print(triple(5)) # Вывод: 15


Пример кеширования
class CachedFibonacci:
def __init__(self):
self.cache = {}

def __call__(self, n):
if n in self.cache:
return self.cache[n]
if n <= 1:
return n
self.cache[n] = self(n - 1) + self(n - 2)
return self.cache[n]

# Использование
fibonacci = CachedFibonacci()
print(fibonacci(10)) # Вывод: 55
print(fibonacci(15)) # Вывод: 610


Ставь 👍 и забирай 📚 Базу знаний

Python | Вопросы собесов

31 Dec, 16:10


🤔 Как реализован many-to-many?

Связь many-to-many создаётся с помощью модели, которая автоматически генерирует промежуточную таблицу. Вы можете управлять этой таблицей напрямую или добавить её кастомизацию с помощью through.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний

Python | Вопросы собесов

31 Dec, 09:10


🤔 Что такое сокеты?

Это механизм, который позволяет программам обмениваться данными по сети. Они являются одним из основных способов коммуникации между устройствами в сетях, таких как интернет или локальная сеть (LAN). Сокеты используются для реализации различных сетевых протоколов, таких как TCP (Transmission Control Protocol) и UDP (User Datagram Protocol).

🚩Основные характеристики

🟠Сетевые сокеты
Сокеты используются для связи между двумя устройствами по сети, такие как клиент и сервер.

🟠Типы сокетов
TCP-сокеты (стриминговые сокеты): Обеспечивают надежное, установочное соединение с проверкой целостности данных и управлением потоком. Пример использования — веб-серверы и клиенты.
UDP-сокеты (датаграммные сокеты): Обеспечивают безустановочное соединение с меньшей задержкой, но без гарантии доставки данных. Пример использования — видеостриминг, игры в реальном времени.

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

TCP-сокеты
Сервер
import socket

# Создание TCP-сокета
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# Привязка сокета к адресу и порту
server_socket.bind(('localhost', 12345))

# Ожидание входящих соединений
server_socket.listen()

print('Сервер ожидает соединения...')

while True:
# Принятие нового соединения
client_socket, client_address = server_socket.accept()
print(f'Подключение от {client_address}')

# Получение данных от клиента
data = client_socket.recv(1024).decode()
print(f'Получено: {data}')

# Отправка ответа клиенту
client_socket.sendall('Hello, Client!'.encode())

# Закрытие соединения
client_socket.close()


Клиент
import socket

# Создание TCP-сокета
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# Подключение к серверу
client_socket.connect(('localhost', 12345))

# Отправка данных серверу
client_socket.sendall('Hello, Server!'.encode())

# Получение ответа от сервера
data = client_socket.recv(1024).decode()
print(f'Получено: {data}')

# Закрытие соединения
client_socket.close()


UDP-сокеты
Сервер
import socket

# Создание UDP-сокета
server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# Привязка сокета к адресу и порту
server_socket.bind(('localhost', 12345))

print('UDP сервер ожидает сообщений...')

while True:
# Получение данных от клиента
data, client_address = server_socket.recvfrom(1024)
print(f'Получено от {client_address}: {data.decode()}')

# Отправка ответа клиенту
server_socket.sendto('Hello, Client!'.encode(), client_address)


Клиент
import socket

# Создание UDP-сокета
client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# Отправка данных серверу
client_socket.sendto('Hello, Server!'.encode(), ('localhost', 12345))

# Получение ответа от сервера
data, server_address = client_socket.recvfrom(1024)
print(f'Получено: {data.decode()}')

# Закрытие сокета
client_socket.close()


🚩Плюсы и минусы

Гибкость
Сокеты предоставляют низкоуровневый доступ к сетевым операциям, позволяя разрабатывать различные сетевые протоколы.
Надежность (TCP)
Обеспечивают надежную передачу данных с управлением потоком и проверкой целостности.
Простота (UDP)
Позволяют быстро передавать данные с минимальной задержкой.
Сложность реализации
Работа с сокетами требует понимания сетевых протоколов и управления соединениями.
Отсутствие гарантий доставки (UDP)
Данные могут теряться или приходить в неправильном порядке.

Ставь 👍 и забирай 📚 Базу знаний

Python | Вопросы собесов

30 Dec, 16:10


🤔 Что означает, что querySet() ленивый?

QuerySet в Django является ленивым, что означает, что запросы к базе данных выполняются только при необходимости (например, при итерации или вызове методов вроде .all() или .filter()). Это позволяет оптимизировать работу с данными и предотвращать лишние запросы.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний

Python | Вопросы собесов

30 Dec, 09:10


🤔 Какие есть варианты определения модели пользователя в Django?

В Django существует несколько вариантов определения модели пользователя. По умолчанию Django предоставляет базовую модель пользователя, но если требуется кастомизация, можно создать свою модель пользователя.

🟠Использование стандартной модели пользователя (`User`)
Django предоставляет стандартную модель пользователя через django.contrib.auth.models.User. Эта модель включает в себя все основные поля и методы для работы с пользователями.
from django.contrib.auth.models import User

# Создание нового пользователя
user = User.objects.create_user(username='john', password='password123')

# Аутентификация пользователя
from django.contrib.auth import authenticate, login

user = authenticate(username='john', password='password123')
if user is not None:
login(request, user)


🚩Расширение стандартной модели пользователя с помощью `UserProfile`

1⃣Создание модели профиля пользователя
from django.db import models
from django.contrib.auth.models import User

class UserProfile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
bio = models.TextField(blank=True)
birth_date = models.DateField(null=True, blank=True)

# Сигналы для автоматического создания и сохранения профиля пользователя
from django.db.models.signals import post_save
from django.dispatch import receiver

@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
if created:
UserProfile.objects.create(user=instance)

@receiver(post_save, sender=User)
def save_user_profile(sender, instance, **kwargs):
instance.userprofile.save()


2⃣Использование профиля пользователя
# Получение и изменение профиля пользователя
user = User.objects.get(username='john')
profile = user.userprofile
profile.bio = "Hello, I'm John!"
profile.save()


3⃣Замена стандартной модели пользователя кастомной моделью (`CustomUser`)
Если необходимо полностью изменить модель пользователя, можно создать кастомную модель пользователя и указать Django использовать её вместо стандартной.
from django.contrib.auth.models import AbstractBaseUser, BaseUserManager
from django.db import models

class CustomUserManager(BaseUserManager):
def create_user(self, email, password=None, **extra_fields):
if not email:
raise ValueError('The Email field must be set')
email = self.normalize_email(email)
user = self.model(email=email, **extra_fields)
user.set_password(password)
user.save(using=self._db)
return user

def create_superuser(self, email, password=None, **extra_fields):
extra_fields.setdefault('is_staff', True)
extra_fields.setdefault('is_superuser', True)

return self.create_user(email, password, **extra_fields)

class CustomUser(AbstractBaseUser):
email = models.EmailField(unique=True)
first_name = models.CharField(max_length=30, blank=True)
last_name = models.CharField(max_length=30, blank=True)
is_active = models.BooleanField(default=True)
is_staff = models.BooleanField(default=False)

objects = CustomUserManager()

USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['first_name', 'last_name']

def __str__(self):
return self.email


Ставь 👍 и забирай 📚 Базу знаний

Python | Вопросы собесов

29 Dec, 16:10


🤔 Что такое миграция?

Это способ управления изменениями в структуре базы данных через код. Django генерирует файлы миграций на основе изменений в моделях, а затем применяет их к базе данных, синхронизируя её структуру с кодом.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний

Python | Вопросы собесов

29 Dec, 09:10


🤔 Для чего используется IntegerChoices?

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

🚩Основные плюсы

Читаемость кода
Значения выбора имеют человекочитаемые названия, что делает код более понятным.
Поддержка валидации
Django автоматически проверяет, что значение поля соответствует одному из допустимых значений.
Удобство использования в админке
В Django admin интерфейсе выпадающий список с человекочитаемыми названиями делает работу с данными удобнее.

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

1⃣Создание класса IntegerChoices
from django.db import models

class Status(models.IntegerChoices):
PENDING = 1, 'Pending'
APPROVED = 2, 'Approved'
REJECTED = 3, 'Rejected'


2⃣Использование IntegerChoices в модели
from django.db import models

class Application(models.Model):
status = models.IntegerField(choices=Status.choices, default=Status.PENDING)
name = models.CharField(max_length=100)
submitted_at = models.DateTimeField(auto_now_add=True)

def __str__(self):
return f"{self.name} - {self.get_status_display()}"


3⃣Пример работы с моделью
# Создание новой записи
app = Application.objects.create(name='John Doe')

# Проверка статуса
print(app.status) # 1
print(app.get_status_display()) # 'Pending'

# Изменение статуса
app.status = Status.APPROVED
app.save()

# Проверка обновленного статуса
print(app.status) # 2
print(app.get_status_display()) # 'Approved'


🚩Дополнительные методы и атрибуты

Вы можете добавлять дополнительные методы и атрибуты в класс выбора для расширенной функциональности.
from django.db import models

class Status(models.IntegerChoices):
PENDING = 1, 'Pending'
APPROVED = 2, 'Approved'
REJECTED = 3, 'Rejected'

@classmethod
def get_choices(cls):
return [(choice.value, choice.label) for choice in cls]

# Пример использования
print(Status.get_choices()) # [(1, 'Pending'), (2, 'Approved'), (3, 'Rejected')]


Использование в фильтрах и запросах
# Фильтрация записей по статусу
pending_apps = Application.objects.filter(status=Status.PENDING)
for app in pending_apps:
print(app.name)

# Фильтрация записей по множеству статусов
approved_or_rejected_apps = Application.objects.filter(status__in=[Status.APPROVED, Status.REJECTED])
for app in approved_or_rejected_apps:
print(app.name)


Ставь 👍 и забирай 📚 Базу знаний

Python | Вопросы собесов

28 Dec, 16:10


🤔 Отличия rebase от merge?

1. merge: объединяет две ветки, создавая дополнительный коммит слияния, который сохраняет историю обеих веток. Это удобно для сохранения полного контекста изменений.
2. rebase: перемещает изменения текущей ветки поверх другой, переписывая историю. Это делает историю линейной и более чистой, но может привести к конфликтам и проблемам при совместной работе.
merge используется для сохранения полной истории, а rebase — для её упрощения.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний

Python | Вопросы собесов

28 Dec, 09:10


🤔 Что такое JSON?

Это легковесный формат обмена данными, который легко читается и пишется человеком, а также легко парсится и генерируется машинами. JSON используется для передачи данных между клиентом и сервером, особенно в веб-приложениях.

🚩Основные характеристики

🟠Простота и легкость
JSON простой и легкий для понимания, что делает его удобным для обмена данными.

🟠Является текстовым форматом
JSON представлен в текстовом формате, что позволяет легко его читать и отлаживать.

🟠Язык-независимость
Хотя JSON основан на подмножестве языка JavaScript, он поддерживается многими языками программирования, включая Python, Java, C#, PHP и другие.

🚩JSON состоит из двух основных структур

🟠Объекты
Набор пар "ключ-значение", заключенный в фигурные скобки {}. Ключи должны быть строками, а значения могут быть различными типами данных.
🟠Массивы
Упорядоченные списки значений, заключенные в квадратные скобки [].
{
"name": "John Doe",
"age": 30,
"isStudent": false,
"courses": ["Math", "Science", "History"],
"address": {
"street": "123 Main St",
"city": "Anytown",
"zip": "12345"
}
}


🚩Типы данных

🟠Строки
Последовательности символов, заключенные в двойные кавычки.
"name": "John Doe"    


🟠Числа
Целые числа и числа с плавающей запятой.
"age": 30    


🟠Булевы значения
true или false.
"isStudent": false    


🟠Массивы
Упорядоченные списки значений.
"courses": ["Math", "Science", "History"]    


🟠Объекты
Наборы пар "ключ-значение".
"address": {
"street": "123 Main St",
"city": "Anytown",
"zip": "12345"
}


🟠Null
Значение null.
"middleName": null    


Преобразование Python объектов в JSON (сериализация)
import json

data = {
"name": "John Doe",
"age": 30,
"isStudent": False,
"courses": ["Math", "Science", "History"],
"address": {
"street": "123 Main St",
"city": "Anytown",
"zip": "12345"
}
}

# Преобразование Python объекта в JSON строку
json_string = json.dumps(data, indent=4)
print(json_string)


Преобразование JSON в Python объекты (десериализация)
import json

json_string = '''
{
"name": "John Doe",
"age": 30,
"isStudent": false,
"courses": ["Math", "Science", "History"],
"address": {
"street": "123 Main St",
"city": "Anytown",
"zip": "12345"
}
}
'''

# Преобразование JSON строки в Python объект
data = json.loads(json_string)
print(data)
print(data['name']) # John Doe


🚩Пример чтения и записи JSON в файл

Запись JSON в файл
import json

data = {
"name": "John Doe",
"age": 30,
"isStudent": False,
"courses": ["Math", "Science", "History"],
"address": {
"street": "123 Main St",
"city": "Anytown",
"zip": "12345"
}
}

with open('data.json', 'w') as file:
json.dump(data, file, indent=4)


Чтение JSON из файла
import json

with open('data.json', 'r') as file:
data = json.load(file)
print(data)
print(data['name']) # John Doe


Ставь 👍 и забирай 📚 Базу знаний

Python | Вопросы собесов

27 Dec, 16:10


🤔 Что такое BigO notation?

Это способ оценки эффективности алгоритмов в терминах времени выполнения или использования памяти в зависимости от размера входных данных.
•Например: O(1) (константное время), O(n) (линейное), O(log n) (логарифмическое).
Она помогает сравнивать алгоритмы и выбирать наиболее оптимальный для конкретной задачи.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний

Python | Вопросы собесов

27 Dec, 09:10


🤔 Что такое интроспекция?

Это способность программы исследовать и изменять свою структуру и поведение во время выполнения. Интроспекция позволяет получить информацию о типах данных, структурах, объектах и их атрибутах динамически, то есть в процессе выполнения программы.

🚩Основные аспекты интроспекции

🟠Получение типа объекта
С помощью функции type() можно узнать тип любого объекта.
x = 10
print(type(x)) # <class 'int'>


🟠Проверка наличия атрибутов и методов
Функции hasattr(), getattr() и setattr() позволяют проверять и манипулировать атрибутами объектов.
class MyClass:
def __init__(self, value):
self.value = value

obj = MyClass(5)

# Проверка наличия атрибута
print(hasattr(obj, 'value')) # True

# Получение значения атрибута
print(getattr(obj, 'value')) # 5

# Установка значения атрибута
setattr(obj, 'value', 10)
print(getattr(obj, 'value')) # 10


🟠Исследование структуры класса
Модуль inspect предоставляет функции для получения информации о классах, методах и функциях.
import inspect

class MyClass:
def method(self):
pass

# Получение всех методов класса
methods = inspect.getmembers(MyClass, predicate=inspect.isfunction)
print(methods) # [('method', <function MyClass.method at 0x...>)]


🟠Список атрибутов и методов объекта
Встроенная функция dir() возвращает список всех атрибутов и методов объекта.
class MyClass:
def method(self):
pass

obj = MyClass()

print(dir(obj))
# ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__',
# '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__',
# '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'method']


🟠Работа с модулем `inspect`
Модуль inspect предоставляет функции для получения информации о живых объектах, включая функции, методы, классы и модули.
import inspect

def my_function():
pass

# Получение информации о функции
print(inspect.getmembers(my_function))


🚩Плюсы и минусы

Гибкость
Позволяет писать более общие и гибкие функции, которые могут работать с различными типами данных.
Отладка и тестирование
Облегчает отладку и тестирование кода, предоставляя средства для анализа объектов и их состояния.
Сложность
Может сделать код более сложным для понимания и сопровождения.
Производительность
Интроспекция может повлиять на производительность, особенно при частом использовании в критически важных участках кода.

Ставь 👍 и забирай 📚 Базу знаний

Python | Вопросы собесов

26 Dec, 16:10


🤔 Что такое querySet() в Django?

Это объект в Django ORM, представляющий запрос к базе данных. Он позволяет фильтровать, сортировать и манипулировать данными, возвращаемыми из базы. Например, Model.objects.all() возвращает QuerySet, содержащий все объекты модели, а filter() позволяет извлекать только нужные данные.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний

Python | Вопросы собесов

26 Dec, 09:10


🤔 Что такое IP адрес и доменное имя?

Это два важных понятия в контексте работы интернета и компьютерных сетей. Они используются для идентификации устройств и ресурсов в сети, а также для упрощения доступа к ним.

🚩IP-адрес (Internet Protocol Address)

Это уникальный числовой идентификатор, присваиваемый каждому устройству, подключенному к сети, использующей протокол IP (Internet Protocol). IP-адреса используются для маршрутизации пакетов данных между устройствами в сети.

🟠IPv4 (Internet Protocol version 4)
Формат: 32-битные числа, записанные в виде четырех десятичных чисел, разделенных точками (например, 192.168.1.1). Пример: 192.168.0.1, 8.8.8.8

🟠IPv6 (Internet Protocol version 6)
Формат: 128-битные числа, записанные в виде восьми групп шестнадцатеричных чисел, разделенных двоеточиями (например, 2001:0db8:85a3:0000:0000:8a2e:0370:7334). Пример: 2001:0db8:85a3:0000:0000:8a2e:0370:7334, ::1 (loopback адрес)

🚩Доменное имя

Это удобочитаемое имя, используемое для идентификации IP-адреса на уровне пользователя. Доменные имена упрощают доступ к ресурсам в интернете, так как их легче запомнить и использовать, чем числовые IP-адреса.

🟠Top-Level Domain (TLD)
Верхний уровень, например, .com, .org, .net.
🟠Second-Level Domain (SLD)
Основная часть доменного имени, например, example в example.com.
🟠Subdomain
Дополнительные уровни, например, www в www.example.com.

🚩Преобразование доменных имен в IP-адреса

Для преобразования доменных имен в IP-адреса используется система доменных имен (DNS, Domain Name System). DNS-серверы выполняют роль "телефонной книги" интернета, переводя доменные имена в соответствующие им IP-адреса.

Ставь 👍 и забирай 📚 Базу знаний

Python | Вопросы собесов

25 Dec, 09:10


🤔 Какие бывают поля моделей в Django?

Это класс, который представляет структуру и логику данных приложения. Модели определяют поля и поведение данных, которые будут храниться в базе данных. Django предоставляет множество типов полей и встроенных методов для создания мощных и гибких моделей.

🚩Основные типы полей в моделях Django

🟠Поле AutoField
Поле для автоматического увеличения целого числа, которое обычно используется для первичных ключей.
id = models.AutoField(primary_key=True)    


🟠Поле CharField
Поле для хранения строк с фиксированной максимальной длиной.
name = models.CharField(max_length=100)    


🟠Поле TextField
Поле для хранения длинных текстов.
description = models.TextField()    


🟠Поле IntegerField
Поле для хранения целых чисел.
age = models.IntegerField()    


🟠Поле FloatField
Поле для хранения чисел с плавающей запятой.
price = models.FloatField()    


🟠Поле BooleanField
Поле для хранения булевых значений (True/False).
is_active = models.BooleanField(default=True)    


🟠Поле DateTimeField
Поле для хранения даты и времени.
created_at = models.DateTimeField(auto_now_add=True)    


🟠Поле ForeignKey
Поле для создания связи "многие к одному" с другой моделью.
author = models.ForeignKey('Author', on_delete=models.CASCADE)    


🟠Поле ManyToManyField
Поле для создания связи "многие ко многим" с другой моделью.
categories = models.ManyToManyField('Category')    


🟠Поле OneToOneField
Поле для создания связи "один к одному" с другой моделью.
profile = models.OneToOneField('Profile', on_delete=models.CASCADE)    


Ставь
👍 и забирай 📚 Базу знаний

Python | Вопросы собесов

24 Dec, 16:10


🤔 Что быстрее, словарь или список?

Словарь быстрее для поиска элементов (O(1) в среднем) по сравнению со списком, где поиск занимает O(n).

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний

Python | Вопросы собесов

24 Dec, 09:10


🤔 Что такое кастомный менеджер модели?

В Django, кастомный менеджер модели — это способ расширения стандартного менеджера модели (класса Manager), чтобы добавить дополнительные методы для выполнения более сложных запросов к базе данных. Менеджеры используются для работы с наборами запросов (QuerySets) и предоставляют интерфейс для выполнения операций с базой данных.

🚩Зачем использовать кастомный менеджер модели?

🟠Повторное использование кода
Вынесение часто используемых запросов в методы менеджера позволяет избежать дублирования кода.

🟠Организация логики запросов
Логика сложных запросов инкапсулируется в методы менеджера, делая код моделей и представлений более чистым и удобочитаемым.

🟠Расширение функциональности
Добавление новых методов к менеджеру позволяет выполнять специфичные для приложения операции с данными.

🚩Пример создания кастомного менеджера модели

1⃣Создание кастомного менеджера
from django.db import models
from django.utils import timezone

class BookManager(models.Manager):
def by_author(self, author_name):
return self.filter(author__name=author_name)

def published_recently(self):
one_month_ago = timezone.now() - timezone.timedelta(days=30)
return self.filter(publication_date__gte=one_month_ago)


2⃣Использование кастомного менеджера в модели
from django.db import models

class Author(models.Model):
name = models.CharField(max_length=100)

class Book(models.Model):
title = models.CharField(max_length=200)
author = models.ForeignKey(Author, on_delete=models.CASCADE)
publication_date = models.DateTimeField()

# Подключение кастомного менеджера
objects = BookManager()


3⃣Пример использования кастомного менеджера
# Получение книг по автору
books_by_author = Book.objects.by_author('John Doe')
for book in books_by_author:
print(book.title)

# Получение книг, опубликованных за последний месяц
recent_books = Book.objects.published_recently()
for book in recent_books:
print(book.title)


Ставь 👍 и забирай 📚 Базу знаний

Python | Вопросы собесов

23 Dec, 16:10


🤔 Что такое транзакция?

Транзакция — это набор операций с базой данных, выполняющихся как единое целое. Она гарантирует выполнение принципов ACID (атомарность, согласованность, изолированность, долговечность). При сбое все изменения откатываются.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний

Python | Вопросы собесов

23 Dec, 09:10


🤔 Какие есть 6 этапов разработки продукта?

Процесс разработки продукта включает в себя несколько ключевых этапов, которые помогают структурировать и упорядочить работу над проектом.

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

🟠Проектирование
На этапе проектирования создается архитектура будущего продукта. Это включает:
Разработка высокоуровневой архитектуры системы.
Детальное проектирование отдельных компонентов и модулей.
Создание схем баз данных, диаграмм классов и других архитектурных диаграмм.
Разработка прототипов пользовательского интерфейса.

🟠Разработка (кодирование)
Этот этап включает в себя непосредственное написание кода и реализацию функциональности согласно разработанным спецификациям и проектам. Включает:
Разработка модулей и компонентов системы.
Интеграция различных частей системы.
Использование систем контроля версий для управления кодом.
Постоянная проверка кода на соответствие стандартам и требованиям.

🟠Тестирование
Тестирование необходимо для обеспечения качества продукта и выявления ошибок до его развертывания. Включает:
Юнит-тестирование отдельных компонентов.
Интеграционное тестирование для проверки взаимодействия компонентов.
Системное тестирование для проверки всей системы в целом.
Приемочное тестирование для проверки соответствия требованиям клиента.

🟠Развертывание
На этапе развертывания продукт готовится к запуску и становится доступным пользователям. Включает:
Настройка серверов и инфраструктуры.
Развертывание приложений в производственной среде.
Проведение окончательных проверок и тестов в реальной среде.
Подготовка и выпуск документации для пользователей и администраторов.

🟠Поддержка и сопровождение
После развертывания продукта начинается этап его поддержки и сопровождения, чтобы обеспечить его бесперебойную работу и внедрение улучшений. Включает:
Мониторинг работы системы и исправление возникающих ошибок.
Выпуск обновлений и патчей для устранения уязвимостей и улучшения функциональности.
Поддержка пользователей и обработка их запросов.
Планирование и внедрение новых функций и улучшений.

Ставь 👍 и забирай 📚 Базу знаний

Python | Вопросы собесов

22 Dec, 16:10


🤔 Что знаешь про ORM?

ORM (Object-Relational Mapping) — это технология, которая позволяет работать с реляционными базами данных через объектно-ориентированные модели. Она автоматически преобразует объекты в SQL-запросы и обратно, упрощая работу с данными. Популярные ORM включают Hibernate, SQLAlchemy и Django ORM.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний

Python | Вопросы собесов

22 Dec, 09:10


🤔 Что такое SRP?

Это один из пяти принципов SOLID, которые формулируют правила для написания чистого и поддерживаемого кода в объектно-ориентированном программировании. Согласно SRP, класс или модуль должен иметь только одну причину для изменения, что означает, что он должен выполнять только одну задачу или иметь одну ответственность.

🚩Основные аспекты

🟠Единственная ответственность
Класс должен решать одну конкретную задачу.
🟠Одна причина для изменения
Если необходимо внести изменения в код, это должно быть вызвано только одной причиной. Это упрощает поддержку и тестирование кода.

🚩Пример нарушения

class User:
def __init__(self, name, email):
self.name = name
self.email = email

def save(self):
# Сохранение данных пользователя в базу данных
print(f"Saving user {self.name} to the database.")

def send_welcome_email(self):
# Отправка приветственного сообщения на электронную почту
print(f"Sending welcome email to {self.email}.")


🚩Пример соблюдения

Для соблюдения принципа SRP разделим класс User на два отдельных класса: один для управления данными пользователя, другой для отправки сообщений электронной почты.
class User:
def __init__(self, name, email):
self.name = name
self.email = email

class UserRepository:
def save(self, user):
# Сохранение данных пользователя в базу данных
print(f"Saving user {user.name} to the database.")

class EmailService:
def send_welcome_email(self, user):
# Отправка приветственного сообщения на электронную почту
print(f"Sending welcome email to {user.email}.")

# Использование классов
user = User("Alice", "[email protected]")
user_repository = UserRepository()
email_service = EmailService()

user_repository.save(user)
email_service.send_welcome_email(user)


🚩Плюсы

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

Ставь 👍 и забирай 📚 Базу знаний

Python | Вопросы собесов

21 Dec, 16:10


🤔 Какие основные HTTP методы знаешь?

Основные методы: GET для получения данных, POST для отправки данных, PUT для обновления или создания ресурса, DELETE для удаления. Также используются PATCH для частичного обновления, HEAD для получения заголовков и OPTIONS для определения доступных методов.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний

Python | Вопросы собесов

21 Dec, 09:10


🤔 Что такое изоморфное приложение?

Это веб-приложение, в котором как клиентская, так и серверная часть используют один и тот же код, обычно написанный на JavaScript или TypeScript. Это позволяет рендерить страницы на сервере и на клиенте, улучшая производительность и SEO.

🚩Основные преимущества изоморфных приложений

🟠Улучшенная производительность
Первоначальный рендеринг выполняется на сервере, что уменьшает время загрузки и улучшает пользовательский опыт, особенно на медленных соединениях.
🟠Лучший SEO
Поисковые системы лучше индексируют страницы, которые уже отрендерены на сервере, что улучшает SEO по сравнению с чисто клиентскими приложениями.
🟠Повышенная удобочитаемость кода
Использование одного и того же кода как на клиенте, так и на сервере упрощает поддержку и развитие приложения.

🚩Как работает изоморфное приложение

🟠Серверный рендеринг
Когда пользователь запрашивает страницу, сервер рендерит HTML и отправляет его пользователю. Это обеспечивает быстрый первый рендер и делает контент доступным для поисковых систем.

🟠Гидратация (Hydration)
После получения HTML от сервера, клиентская часть "гидратирует" (или "активирует") рендеренные элементы, добавляя интерактивность с помощью JavaScript. Это позволяет приложениям работать как одностраничные приложения (SPA) после начальной загрузки.

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

🚩Пример изоморфного приложения с использованием React и Next.js

Установка Next.js
npx create-next-app@latest my-isomorphic-app
cd my-isomorphic-app
npm run dev


Создание страницы с серверным рендерингом
// pages/index.js
import React from 'react';

const Home = ({ message }) => (
<div>
<h1>{message}</h1>
</div>
);

export async function getServerSideProps() {
return {
props: {
message: 'Hello from the server!',
},
};
}

export default Home;


Ставь 👍 и забирай 📚 Базу знаний

Python | Вопросы собесов

20 Dec, 09:10


🤔 Что такое SDLC?

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

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

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

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

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

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

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

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

Ставь 👍 и забирай 📚 Базу знаний

Python | Вопросы собесов

19 Dec, 16:10


🤔 Что такое git?

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

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний

Python | Вопросы собесов

19 Dec, 09:10


🤔 Виды наследования?

В объектно-ориентированном программировании наследование позволяет одному классу (называемому подклассом или наследником) унаследовать атрибуты и методы другого класса (называемого суперклассом или родительским классом).

🟠Одиночное наследование (Single Inheritance)
Одиночное наследование — это когда класс наследует только один родительский класс.
class Animal:
def speak(self):
return "Some sound"

class Dog(Animal):
def speak(self):
return "Woof!"

dog = Dog()
print(dog.speak()) # Woof!


🟠Множественное наследование (Multiple Inheritance)
Множественное наследование — это когда класс наследует несколько родительских классов.
class Animal:
def eat(self):
return "Eating"

class Pet:
def play(self):
return "Playing"

class Dog(Animal, Pet):
def speak(self):
return "Woof!"

dog = Dog()
print(dog.eat()) # Eating
print(dog.play()) # Playing
print(dog.speak()) # Woof!


🟠Многоуровневое наследование (Multilevel Inheritance)
Многоуровневое наследование — это когда класс наследует другой класс, который в свою очередь наследует другой класс.
class Animal:
def eat(self):
return "Eating"

class Mammal(Animal):
def walk(self):
return "Walking"

class Dog(Mammal):
def speak(self):
return "Woof!"

dog = Dog()
print(dog.eat()) # Eating
print(dog.walk()) # Walking
print(dog.speak()) # Woof!


🟠Иерархическое наследование (Hierarchical Inheritance)
Иерархическое наследование — это когда несколько классов наследуют один и тот же родительский класс.
class Animal:
def speak(self):
return "Some sound"

class Dog(Animal):
def speak(self):
return "Woof!"

class Cat(Animal):
def speak(self):
return "Meow!"

dog = Dog()
cat = Cat()
print(dog.speak()) # Woof!
print(cat.speak()) # Meow!


🟠Гибридное наследование (Hybrid Inheritance)
Гибридное наследование — это комбинация двух или более типов наследования. Это может быть сложная структура, включающая одиночное, множественное, многоуровневое и иерархическое наследование.
class Animal:
def eat(self):
return "Eating"

class Mammal(Animal):
def walk(self):
return "Walking"

class Bird(Animal):
def fly(self):
return "Flying"

class Bat(Mammal, Bird):
def use_sonar(self):
return "Using sonar"

bat = Bat()
print(bat.eat()) # Eating
print(bat.walk()) # Walking
print(bat.fly()) # Flying
print(bat.use_sonar()) # Using sonar


Ставь 👍 и забирай 📚 Базу знаний

Python | Вопросы собесов

18 Dec, 16:10


🤔 Что такое Docker?

Docker — это платформа для контейнеризации, которая изолирует приложения и их зависимости в контейнерах. Контейнеры запускаются поверх ядра хоста, что делает их лёгкими и портативными. Это упрощает разработку, тестирование и развертывание.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний

Python | Вопросы собесов

18 Dec, 09:10


🤔 Что такое абстрактный метод?

Это метод, который объявлен в абстрактном классе, но не имеет собственной реализации. Абстрактные методы предназначены для того, чтобы подклассы, наследующие абстрактный класс, обязательно реализовали эти методы. Абстрактные методы создаются с использованием модуля abc (Abstract Base Classes).

🚩Основные моменты

🟠Абстрактный метод
Метод, который объявлен в абстрактном классе и должен быть реализован в подклассах.
🟠Абстрактный класс
Класс, содержащий один или более абстрактных методов. Такие классы не могут быть инстанцированы напрямую.
🟠Использование модуля `abc`
Для создания абстрактных методов и классов.

🚩Пример создания

🟠Импорт модуля `abc`
Импортируем необходимые классы и декораторы.
🟠Создание абстрактного класса
Наследуемся от ABC.
🟠Определение абстрактного метода
Используем декоратор @abstractmethod.

from abc import ABC, abstractmethod

# Создание абстрактного класса
class Animal(ABC):
@abstractmethod
def make_sound(self):
pass

# Попытка создания экземпляра абстрактного класса приведет к ошибке
# animal = Animal() # TypeError: Can't instantiate abstract class Animal with abstract methods make_sound

# Создание подклассов, которые реализуют абстрактные методы
class Dog(Animal):
def make_sound(self):
return "Woof!"

class Cat(Animal):
def make_sound(self):
return "Meow!"

# Теперь можно создать экземпляры подклассов
dog = Dog()
print(dog.make_sound()) # Woof!

cat = Cat()
print(cat.make_sound()) # Meow!


🚩Основные моменты, которые стоит учитывать

🟠Невозможность инстанцирования абстрактных классов
Нельзя создавать экземпляры абстрактных классов, если в них есть нереализованные абстрактные методы.
🟠Обязательная реализация абстрактных методов в подклассах
Все абстрактные методы должны быть реализованы в неполностью абстрактных подклассах, иначе и эти подклассы останутся абстрактными.

🚩Плюсы

Определение интерфейсов
Абстрактные методы позволяют задавать интерфейсы для классов, которые должны быть реализованы в производных классах.
Поддержка полиморфизма
Абстрактные классы и методы способствуют полиморфизму, обеспечивая одинаковый интерфейс для различных реализаций.
Обеспечение единообразия
Подклассы обязаны реализовать все абстрактные методы, что обеспечивает единообразие и упрощает поддержку кода.

Ставь 👍 и забирай 📚 Базу знаний

Python | Вопросы собесов

17 Dec, 16:10


🤔 Что знаешь про два основных типа данных Python?

Основные типы данных Python — изменяемые (списки, множества, словари) и неизменяемые (строки, числа, кортежи). Изменяемые можно модифицировать после создания, тогда как неизменяемые остаются неизменными.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний

Python | Вопросы собесов

17 Dec, 09:10


🤔 Является ли класс объектом?

Классы сами по себе являются объектами. Это один из аспектов метапрограммирования в Python, который позволяет рассматривать классы как объекты, наравне с экземплярами этих классов.

🚩Почему классы являются объектами?

🟠Классы имеют тип
Все, включая классы, является объектами и имеет свой тип. Классы — это экземпляры метакласса type.

🟠Классы могут быть созданы динамически
Поскольку классы являются объектами, их можно создавать динамически, так же как и другие объекты.

🟠Классы можно передавать как аргументы и возвращать из функций
Классы могут передаваться в функции и возвращаться из них, как и любые другие объекты.

🚩Пример:

1⃣Тип класса
class MyClass:
pass

# Проверка типа класса
print(type(MyClass)) # <class 'type'>


2⃣Создание класса динамически
def create_class(name):
if name == "Dog":
class Dog:
def speak(self):
return "Woof!"
return Dog
else:
class Cat:
def speak(self):
return "Meow!"
return Cat

AnimalClass = create_class("Dog")
animal = AnimalClass()
print(animal.speak()) # Woof!


3⃣Передача и возврат классов из функций
def print_class_name(cls):
print(cls.__name__)

class MyClass:
pass

print_class_name(MyClass) # MyClass


🚩Метаклассы

Это "классы для классов". Метакласс определяет поведение класса и используется для создания классов. По умолчанию все классы в Python являются экземплярами метакласса type.
class MyMeta(type):
def __new__(cls, name, bases, dct):
print(f"Creating class {name}")
return super().__new__(cls, name, bases, dct)

class MyClass(metaclass=MyMeta):
pass

# Вывод: Creating class MyClass


Ставь 👍 и забирай 📚 Базу знаний

Python | Вопросы собесов

26 Nov, 12:54


😎 База IT собеседований – твоё секретное оружие для успешного прохождения этапов отбора! Собеседования от реальных компаний: Сбер, Яндекс, ВТБ, Тинькофф, Озон, Wildberries и многие другие! 🏢 Мы собрали 230 собесов, чтобы ты мог подготовиться к интервью с уверенностью и успехом.

🎯 Присоединяйся к базе и прокачай свои шансы на успешное трудоустройство!

Python | Вопросы собесов

26 Nov, 09:10


🤔 Что такое monkey patch?

Monkey patching (буквально "заплатка обезьяны") в программировании — это техника, позволяющая динамически изменять или расширять код во время выполнения программы. В Python это означает изменение или дополнение методов, атрибутов или классов в модуле или библиотеке, даже если у вас нет прямого доступа к исходному коду.

🚩Зачем нужен monkey patching

🟠Исправление ошибок
Быстрое исправление ошибок в сторонних библиотеках без необходимости изменения их исходного кода.
🟠Добавление функциональности
Расширение возможностей сторонних библиотек.
🟠Изменение поведения
Замена существующих функций или методов на свои собственные для изменения поведения программы.

🚩Пример monkey patching

import time

# Оригинальная функция
def original_sleep(seconds):
time.sleep(seconds)
print(f"Slept for {seconds} seconds")

# Monkey patching функции sleep
def patched_sleep(seconds):
print(f"Patched! Should have slept for {seconds} seconds")

# Применение monkey patching
time.sleep = patched_sleep

# Примеры использования
time.sleep(3) # Вывод: Patched! Should have slept for 3 seconds


🚩Недостатки

Неявные изменения
Изменения могут быть неочевидны другим разработчикам, что может привести к путанице и затруднениям в отладке.
Совместимость
Monkey patching может вызвать проблемы совместимости при обновлении библиотек или модулей.
Непредсказуемость
Изменения в поведении программы могут быть трудно предсказуемыми и отлаживаемыми.

Ставь 👍 и забирай 📚 Базу знаний

Python | Вопросы собесов

25 Nov, 16:10


🤔 Что знаешь про singleton?

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

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний

Python | Вопросы собесов

25 Nov, 09:10


🤔 Как еще мы можем гарантировать закрытие файла, если не через with?

Использование оператора with является рекомендованным способом гарантированного закрытия файла, так как он автоматически управляет открытием и закрытием ресурса. Однако, если по какой-то причине вы не можете использовать with, можно гарантировать закрытие файла другими способами, такими как использование явного вызова метода close() в блоке finally.

🟠С использованием `try-finally`
Открытие и закрытие файла с использованием блока try-finally гарантирует, что файл будет закрыт, даже если в блоке try произойдет исключение. В этом примере файл открывается в блоке try, и его содержимое читается. Независимо от того, происходит ли исключение в блоке try или нет, блок finally будет выполнен, и файл будет закрыт.
file = None
try:
file = open('example.txt', 'r')
content = file.read()
print(content)
finally:
if file:
file.close()


🟠С использованием контекстного менеджера
Вы можете создать свой собственный контекстный менеджер, используя классы, который будет управлять открытием и закрытием файла. Это более сложный подход, но он полезен для понимания внутренних механизмов.
class FileManager:
def __init__(self, filename, mode):
self.filename = filename
self.mode = mode
self.file = None

def __enter__(self):
self.file = open(self.filename, self.mode)
return self.file

def __exit__(self, exc_type, exc_value, traceback):
if self.file:
self.file.close()

# Примеры использования
file_manager = FileManager('example.txt', 'r')
try:
file = file_manager.__enter__()
content = file.read()
print(content)
finally:
file_manager.__exit__(None, None, None)


🟠С использованием декоратора
Еще один способ — использование декоратора для автоматического управления открытием и закрытием файла.
from functools import wraps

def open_file(filename, mode):
def decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
file = open(filename, mode)
try:
result = func(file, *args, **kwargs)
finally:
file.close()
return result
return wrapper
return decorator

@open_file('example.txt', 'r')
def read_file(f):
return f.read()

# Примеры использования
print(read_file())


🟠С использованием менеджера контекста из `contextlib`
Модуль contextlib предоставляет полезные утилиты для создания контекстных менеджеров. Одной из таких утилит является contextlib.contextmanager, которая позволяет создавать контекстные менеджеры с помощью генераторов.
from contextlib import contextmanager

@contextmanager
def open_file(filename, mode):
file = open(filename, mode)
try:
yield file
finally:
file.close()

# Примеры использования
file_manager = open_file('example.txt', 'r')
file = file_manager.__enter__()
try:
content = file.read()
print(content)
finally:
file_manager.__exit__(None, None, None)


Ставь 👍 и забирай 📚 Базу знаний

Python | Вопросы собесов

24 Nov, 16:10


🤔 Что знаешь про ORM?

ORM (Object-Relational Mapping) — это технология, которая позволяет работать с реляционными базами данных через объектно-ориентированные модели. Она автоматически преобразует объекты в SQL-запросы и обратно, упрощая работу с данными. Популярные ORM включают Hibernate, SQLAlchemy и Django ORM.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний

Python | Вопросы собесов

24 Nov, 09:10


🤔 Геттеры и сеттеры, property атрибуты?

Используются для контроля доступа к атрибутам класса. Они позволяют вам добавлять логику при получении (геттер) и изменении (сеттер) значений атрибутов. В Python эти методы можно реализовать с помощью функции property, которая упрощает создание геттеров и сеттеров, делая код более читабельным и идиоматичным.

🚩Геттеры и сеттеры

Геттер — это метод, который возвращает значение атрибута, а сеттер — метод, который устанавливает значение атрибута.
Пример без использования property
class MyClass:
def __init__(self, value):
self._value = value # Приватный атрибут

def get_value(self):
return self._value

def set_value(self, value):
if value >= 0:
self._value = value
else:
raise ValueError("Value must be non-negative")

# Примеры использования
obj = MyClass(10)
print(obj.get_value()) # Вывод: 10

obj.set_value(20)
print(obj.get_value()) # Вывод: 20

try:
obj.set_value(-10) # Пример вызова исключения
except ValueError as e:
print(e) # Вывод: Value must be non-negative


🚩`property` атрибуты

Можно использовать функцию property, чтобы избежать явных вызовов геттеров и сеттеров и сделать код более естественным и читаемым. property позволяет определить методы доступа как атрибуты.
Пример с использованием property
class MyClass:
def __init__(self, value):
self._value = value

@property
def value(self):
return self._value

@value.setter
def value(self, value):
if value >= 0:
self._value = value
else:
raise ValueError("Value must be non-negative")

# Примеры использования
obj = MyClass(10)
print(obj.value) # Вывод: 10 (используется геттер)

obj.value = 20
print(obj.value) # Вывод: 20 (используется сеттер)

try:
obj.value = -10 # Пример вызова исключения через сеттер
except ValueError as e:
print(e) # Вывод: Value must be non-negative


🚩Плюсы

Инкапсуляция
Позволяет скрыть реализацию и управлять доступом к данным через методы, что делает код более безопасным и гибким.
Читабельность
Код выглядит как работа с обычными атрибутами, а не методами, что упрощает его понимание.
Контроль
Легко добавить валидацию или логику при установке или получении значений.

🚩Полный пример с геттером, сеттером и делетером

Также можно использовать декоратор @property для создания делетера (удаления атрибута).
class MyClass:
def __init__(self, value):
self._value = value

@property
def value(self):
return self._value

@value.setter
def value(self, value):
if value >= 0:
self._value = value
else:
raise ValueError("Value must be non-negative")

@value.deleter
def value(self):
del self._value

# Примеры использования
obj = MyClass(10)
print(obj.value) # Вывод: 10

obj.value = 20
print(obj.value) # Вывод: 20

del obj.value
try:
print(obj.value) # Ошибка, так как атрибут удален
except AttributeError as e:
print(e) # Вывод: 'MyClass' object has no attribute '_value'


Ставь 👍 и забирай 📚 Базу знаний

Python | Вопросы собесов

23 Nov, 16:10


🤔 Какие основные HTTP методы знаешь?

Основные методы: GET для получения данных, POST для отправки данных, PUT для обновления или создания ресурса, DELETE для удаления. Также используются PATCH для частичного обновления, HEAD для получения заголовков и OPTIONS для определения доступных методов.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний

Python | Вопросы собесов

23 Nov, 09:10


🤔 Чем отличается атрибут класса от атрибута объекта?

Различаются по своему назначению и области видимости. Понимание этих различий важно для правильного проектирования классов и управления данными.

🚩Атрибуты класса

Являются общими для всех экземпляров класса. Они определяются внутри класса, но вне любого метода. Эти атрибуты могут быть доступны и изменены как через сам класс, так и через любой его экземпляр.
class MyClass:
class_attribute = 42 # Атрибут класса

# Доступ к атрибуту класса
print(MyClass.class_attribute) # Вывод: 42

# Создание экземпляров
obj1 = MyClass()
obj2 = MyClass()

# Доступ к атрибуту класса через экземпляры
print(obj1.class_attribute) # Вывод: 42
print(obj2.class_attribute) # Вывод: 42

# Изменение атрибута класса
MyClass.class_attribute = 100
print(obj1.class_attribute) # Вывод: 100
print(obj2.class_attribute) # Вывод: 100


🚩Атрибуты объекта (экземпляра)

Уникальны для каждого экземпляра класса. Они определяются внутри методов класса, обычно в методе __init__, и относятся к конкретному экземпляру.
class MyClass:
def __init__(self, value):
self.instance_attribute = value # Атрибут объекта

# Создание экземпляров
obj1 = MyClass(10)
obj2 = MyClass(20)

# Доступ к атрибутам объекта
print(obj1.instance_attribute) # Вывод: 10
print(obj2.instance_attribute) # Вывод: 20

# Изменение атрибутов объекта
obj1.instance_attribute = 15
print(obj1.instance_attribute) # Вывод: 15
print(obj2.instance_attribute) # Вывод: 20


🚩Ключевые различия

🟠Область видимости и доступ
Атрибуты класса видны и доступны для всех экземпляров класса. Атрибуты объекта видны и доступны только для конкретного экземпляра.

🟠Инициализация и использование
Атрибуты класса инициализируются при определении класса и общие для всех экземпляров. Атрибуты объекта инициализируются в методе __init__ и уникальны для каждого экземпляра.

🟠Изменение значений
Изменение атрибута класса через класс изменяет его для всех экземпляров. Изменение атрибута объекта влияет только на конкретный экземпляр.

🚩Пример различий

class MyClass:
class_attribute = 'class value'

def __init__(self, value):
self.instance_attribute = value

# Создание экземпляров
obj1 = MyClass('instance value 1')
obj2 = MyClass('instance value 2')

# Доступ к атрибутам класса и объекта
print(MyClass.class_attribute) # Вывод: class value
print(obj1.class_attribute) # Вывод: class value
print(obj2.class_attribute) # Вывод: class value

print(obj1.instance_attribute) # Вывод: instance value 1
print(obj2.instance_attribute) # Вывод: instance value 2

# Изменение атрибута класса через класс
MyClass.class_attribute = 'new class value'
print(obj1.class_attribute) # Вывод: new class value
print(obj2.class_attribute) # Вывод: new class value

# Изменение атрибута объекта
obj1.instance_attribute = 'new instance value 1'
print(obj1.instance_attribute) # Вывод: new instance value 1
print(obj2.instance_attribute) # Вывод: instance value 2


Ставь 👍 и забирай 📚 Базу знаний

Python | Вопросы собесов

22 Nov, 16:10


🤔 Расскажи о сложностях с которыми столкнулась во время обучения?

Основные сложности связаны с пониманием абстрактных концепций, таких как многопоточность или принципы проектирования. Иногда трудности возникают из-за объёмности материала или отсутствия практических примеров. Постепенное применение изученного на практике помогает преодолевать такие барьеры.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний

Python | Вопросы собесов

22 Nov, 09:10


🤔 Что такое @dataclass?

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

🚩Зачем нужен

🟠Упрощение кода
Автоматически генерирует методы, сокращая шаблонный код.
🟠Читабельность
Делает код более чистым и легким для понимания.
🟠Удобство
Обеспечивает удобные и мощные возможности для работы с данными.

🚩Как использовать

Нужно импортировать его из модуля dataclasses и применить к классу. Внутри класса достаточно определить только поля данных.
from dataclasses import dataclass

@dataclass
class Person:
name: str
age: int

# Примеры использования
person1 = Person(name="Alice", age=30)
person2 = Person(name="Bob", age=25)

print(person1) # Вывод: Person(name='Alice', age=30)
print(person2) # Вывод: Person(name='Bob', age=25)
print(person1 == person2) # Вывод: False


🚩Автоматически генерируемые методы

🟠`__init__`
Инициализирует объект с заданными значениями атрибутов.
🟠`__repr__`
Возвращает строковое представление объекта, удобное для отладки.
🟠`__eq__`
Сравнивает объекты на равенство по их атрибутам.
🟠`__lt__`, `__le__`, `__gt__`, `__ge__`
Могут быть сгенерированы для сравнения объектов (если указано).

🚩Настройка поведения

Вы можете настроить поведение @dataclass с помощью параметров, таких как order, frozen, и других.

🟠`order=True`
Генерирует методы для сравнения объектов.
🟠`frozen=True`
Делает экземпляры неизменяемыми (immutable).

Пример
from dataclasses import dataclass

@dataclass(order=True, frozen=True)
class Person:
name: str
age: int

person1 = Person(name="Alice", age=30)
person2 = Person(name="Bob", age=25)

print(person1 > person2) # Вывод: True (поскольку 'Alice' > 'Bob' по алфавиту, если имена равны, сравниваются возраста)
# person1.age = 31 # Ошибка: FrozenInstanceError (поскольку класс заморожен)


🚩Поля данных и их настройки

Вы можете использовать функцию field() для настройки отдельных полей, например, для указания значений по умолчанию или исключения полей из методов __repr__, __eq__, и других.
from dataclasses import dataclass, field

@dataclass
class Person:
name: str
age: int = 0
address: str = field(default="Unknown", repr=False)

person = Person(name="Alice")
print(person) # Вывод: Person(name='Alice', age=0)


Ставь 👍 и забирай 📚 Базу знаний

Python | Вопросы собесов

21 Nov, 16:10


🤔 Что такое итератор?

Итератор в Python — это объект, который поддерживает метод `__iter__()` и `__next__()` для последовательного перебора элементов коллекции. Итераторы используются для работы с циклами и обеспечивают ленивую генерацию данных, не загружая их все сразу в память. Каждый вызов метода `next()` возвращает следующий элемент, а при отсутствии элементов вызывается исключение `StopIteration`. Итераторы полезны для работы с большими данными и потоками данных.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний

Python | Вопросы собесов

21 Nov, 09:10


🤔 Что такое @staticmethod?

Используется для создания статических методов в классе. Статический метод — это метод, который не зависит от состояния экземпляра класса и может быть вызван напрямую на классе, не создавая экземпляр. Такие методы обычно используются для выполнения действий, которые логически связаны с классом, но не требуют доступа к его экземплярам или класс-методу.

🚩Зачем нужен

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

🚩Как использовать

Для создания статического метода, нужно использовать декоратор @staticmethod перед определением метода. В отличие от обычных методов класса, статический метод не принимает параметр self.
class MathUtils:
@staticmethod
def add(a, b):
return a + b

@staticmethod
def multiply(a, b):
return a * b

# Вызов статических методов
print(MathUtils.add(5, 3)) # Вывод: 8
print(MathUtils.multiply(5, 3)) # Вывод: 15


Пример использования статического метода для валидации
Здесь метод is_valid_email проверяет, является ли строка допустимым email адресом. Поскольку этот метод не требует доступа к состоянию экземпляра класса, его логично сделать статическим.
class Validator:
@staticmethod
def is_valid_email(email):
return "@" in email and "." in email

# Вызов статического метода
print(Validator.is_valid_email("[email protected]")) # Вывод: True
print(Validator.is_valid_email("invalid-email")) # Вывод: False


🚩Сравнение с другими методами

🟠Обычные методы
Принимают параметр self, который указывает на текущий экземпляр класса.
🟠Методы класса
Принимают параметр cls, который указывает на сам класс, и могут изменять состояние класса.
🟠Статические методы
Не принимают ни self, ни cls, что делает их более похожими на обычные функции, но логически сгруппированными в классе.

Пример для сравнения:
class Example:
def instance_method(self):
print("This is an instance method")

@classmethod
def class_method(cls):
print("This is a class method")

@staticmethod
def static_method():
print("This is a static method")

# Создание экземпляра класса
obj = Example()

# Вызов методов
obj.instance_method() # Вывод: This is an instance method
Example.class_method() # Вывод: This is a class method
Example.static_method() # Вывод: This is a static method


Ставь 👍 и забирай 📚 Базу знаний

Python | Вопросы собесов

20 Nov, 19:29


– Помощь с pet-проектом
– Составление roadmap
– Общая консультация
– Проведение код-ревью и mock-собеседования
– Помощь с трудоустройством

Все это и многое другое может Ментор. Он обеспечит вам необходимый boost, ускорит и упростит вход в IT.

🔥 Здесь размещен список менторов, и многие из них предлагают бесплатную первую консультацию

Python | Вопросы собесов

20 Nov, 16:10


🤔 Какие есть типы данных в Python?

В Python существует несколько встроенных типов данных: числовые типы (int, float, complex), строки (str), булевы значения (bool), списки (list), кортежи (tuple), множества (set) и словари (dict). Также есть типы для работы с бинарными данными, такие как bytes и bytearray. Кроме того, существуют пользовательские типы, которые можно создавать с помощью классов. Python поддерживает динамическую типизацию, где тип переменной определяется автоматически при присваивании значения.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚Базу Знаний

Python | Вопросы собесов

20 Nov, 09:10


🤔 Методы __enter__ и __exit__?

Используются для поддержки менеджеров контекста. Менеджеры контекста позволяют выполнять подготовительные и завершающие действия вокруг блока кода, используя конструкцию with. Это полезно для автоматического управления ресурсами, такими как открытие и закрытие файлов, управление соединениями с базами данных и т. д.

🟠Метод `enter`
Выполняет действия, которые должны произойти в начале блока with. Этот метод должен возвращать объект, который будет связан с переменной после оператора as.

🟠Метод `exit`
Выполняет действия, которые должны произойти в конце блока with, даже если в блоке произошло исключение. Он принимает три аргумента: тип исключения, значение исключения и трассировку (traceback). Если исключение не произошло, все три аргумента будут равны None.
class FileManager:
def __init__(self, filename, mode):
self.filename = filename
self.mode = mode
self.file = None

def __enter__(self):
self.file = open(self.filename, self.mode)
return self.file

def __exit__(self, exc_type, exc_value, traceback):
if self.file:
self.file.close()

# Примеры использования
with FileManager('example.txt', 'w') as f:
f.write('Hello, World!')

# Пример с обработкой исключений
try:
with FileManager('example.txt', 'r') as f:
content = f.read()
print(content)
except Exception as e:
print(f"An error occurred: {e}")


Пример с обработкой ресурсов
class DatabaseConnection:
def __init__(self, db_name):
self.db_name = db_name
self.connection = None

def __enter__(self):
self.connection = self.connect_to_database(self.db_name)
return self.connection

def __exit__(self, exc_type, exc_value, traceback):
if self.connection:
self.connection.close()

def connect_to_database(self, db_name):
# Реализация соединения с базой данных (псевдокод)
print(f"Connecting to database {db_name}")
return f"Connection to {db_name}"

def close(self):
# Реализация закрытия соединения (псевдокод)
print("Closing the connection")

# Примеры использования
with DatabaseConnection('my_database') as conn:
print(conn)
# Выполнение операций с базой данных

# Пример с обработкой исключений
try:
with DatabaseConnection('my_database') as conn:
raise ValueError("Some error occurred")
except Exception as e:
print(f"An error occurred: {e}")


Ставь 👍 и забирай 📚 Базу знаний

Python | Вопросы собесов

19 Nov, 16:10


🤔 Как пропустить заблокированные поля в БД при использовании select?

Чтобы пропустить заблокированные поля в БД при выполнении запроса `SELECT`, можно:
1. Явно указать в запросе только те столбцы, которые доступны, вместо использования `SELECT *`.
2. Убедиться, что права доступа на уровне пользователя или роли не запрещают чтение нужных столбцов.
3. Использовать средства обработки ошибок в коде, чтобы обрабатывать исключения, если доступ к полю невозможен.
Это помогает избежать ошибок и выполнить запрос успешно.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний

Python | Вопросы собесов

19 Nov, 09:10


🤔 Методы getitem и setitem и delitem?

Позволяют объектам вашего класса работать как контейнеры, подобные спискам или словарям. Они отвечают за доступ к элементам, установку значений элементов и удаление элементов по индексам или ключам.

🟠Метод `getitem`
Используется для доступа к элементам объекта по индексу или ключу. Он вызывается, когда вы используете синтаксис квадратных скобок для доступа к элементу.
class MyList:
def __init__(self, items):
self.items = items

def __getitem__(self, index):
return self.items[index]

# Примеры использования
my_list = MyList([1, 2, 3, 4])
print(my_list[0]) # Вывод: 1
print(my_list[2]) # Вывод: 3


🟠Метод `setitem`
Используется для установки значений элементов по индексу или ключу. Он вызывается, когда вы используете синтаксис квадратных скобок для установки значения элемента.
class MyList:
def __init__(self, items):
self.items = items

def __setitem__(self, index, value):
self.items[index] = value

# Примеры использования
my_list = MyList([1, 2, 3, 4])
my_list[1] = 10
print(my_list.items) # Вывод: [1, 10, 3, 4]


🟠Метод `delitem`
Используется для удаления элементов по индексу или ключу. Он вызывается, когда вы используете синтаксис del с квадратными скобками.
class MyList:
def __init__(self, items):
self.items = items

def __delitem__(self, index):
del self.items[index]

# Примеры использования
my_list = MyList([1, 2, 3, 4])
del my_list[2]
print(my_list.items) # Вывод: [1, 2, 4]


Пример использования всех методов вместе
class CustomDict:
def __init__(self):
self.data = {}

def __getitem__(self, key):
return self.data[key]

def __setitem__(self, key, value):
self.data[key] = value

def __delitem__(self, key):
del self.data[key]

# Примеры использования
custom_dict = CustomDict()
custom_dict['a'] = 1
custom_dict['b'] = 2
print(custom_dict['a']) # Вывод: 1
print(custom_dict['b']) # Вывод: 2

del custom_dict['a']
print(custom_dict.data) # Вывод: {'b': 2}


Ставь 👍 и забирай 📚 Базу знаний

Python | Вопросы собесов

18 Nov, 16:10


🤔 Какие основные HTTP методы знаешь?

Основные HTTP методы включают:
- `GET` для получения данных с сервера.
- `POST` для отправки данных на сервер (создание ресурса).
- `PUT` для обновления или создания ресурса.
- `DELETE` для удаления ресурса.
- `PATCH` для частичного обновления ресурса.
- `HEAD` для получения заголовков без тела ответа.
- `OPTIONS` для получения информации о поддерживаемых методах.
Эти методы обеспечивают основное взаимодействие клиента и сервера.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний

Python | Вопросы собесов

18 Nov, 09:10


🤔 Методы call?

Позволяет объектам вашего класса быть вызываемыми как функции. Когда вы определяете этот метод в своем классе, вы можете использовать экземпляры этого класса как функции.

🚩Зачем нужен

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

🚩Как использовать

Для того чтобы использовать метод __call__, нужно его определить в своем классе. Этот метод может принимать любые аргументы, как и обычные функции.
class Counter:
def __init__(self):
self.count = 0

def __call__(self):
self.count += 1
print(f"Count is now {self.count}")

# Примеры использования
counter = Counter()
counter() # Вывод: Count is now 1
counter() # Вывод: Count is now 2
counter() # Вывод: Count is now 3


Пример использования с аргументами
class Adder:
def __init__(self, value):
self.value = value

def __call__(self, x):
return self.value + x

# Примеры использования
add5 = Adder(5)
print(add5(10)) # Вывод: 15
print(add5(20)) # Вывод: 25


Пример более сложного использования
class Polynomial:
def __init__(self, coefficients):
self.coefficients = coefficients

def __call__(self, x):
result = 0
for power, coef in enumerate(self.coefficients):
result += coef * (x ** power)
return result

# Примеры использования
p = Polynomial([1, 0, 2]) # Создает полином 1 + 0x + 2x^2
print(p(2)) # Вывод: 9 (1 + 0*2 + 2*2^2)
print(p(3)) # Вывод: 19 (1 + 0*3 + 2*3^2)


Ставь 👍 и забирай 📚 Базу знаний

Python | Вопросы собесов

17 Nov, 16:10


🤔 Какие области в профессиональной деятельности у тебя развиты слабо

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

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний

Python | Вопросы собесов

17 Nov, 09:10


🤔 Методы eq, ne, lt, le, qt, qe?

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

🟠Метод `eq`
Отвечает за оператор равенства ==. Он позволяет определить, когда два объекта вашего класса считаются равными.
class Person:
def __init__(self, name, age):
self.name = name
self.age = age

def __eq__(self, other):
return self.name == other.name and self.age == other.age

p1 = Person("Alice", 30)
p2 = Person("Alice", 30)
p3 = Person("Bob", 25)

print(p1 == p2) # Вывод: True
print(p1 == p3) # Вывод: False


🟠Метод `ne`
Отвечает за оператор неравенства !=. Он позволяет определить, когда два объекта вашего класса считаются неравными.
class Person:
def __init__(self, name, age):
self.name = name
self.age = age

def __ne__ (self, other):
return self.name != other.name or self.age != other.age

p1 = Person("Alice", 30)
p2 = Person("Alice", 30)
p3 = Person("Bob", 25)

print(p1 != p2) # Вывод: False
print(p1 != p3) # Вывод: True


🟠Метод `lt`
Отвечает за оператор меньше <. Он позволяет определить, когда один объект вашего класса считается меньше другого.
class Person:
def __init__(self, name, age):
self.name = name
self.age = age

def __lt__(self, other):
return self.age < other.age

p1 = Person("Alice", 30)
p2 = Person("Bob", 25)

print(p1 < p2) # Вывод: False
print(p2 < p1) # Вывод: True


🟠Метод `le`
Отвечает за оператор меньше или равно <=. Он позволяет определить, когда один объект вашего класса считается меньше или равен другому.
class Person:
def __init__(self, name, age):
self.name = name
self.age = age

def __le__(self, other):
return self.age <= other.age

p1 = Person("Alice", 30)
p2 = Person("Bob", 30)
p3 = Person("Charlie", 25)

print(p1 <= p2) # Вывод: True
print(p1 <= p3) # Вывод: False


🟠Метод `gt`
Отвечает за оператор больше >. Он позволяет определить, когда один объект вашего класса считается больше другого.
class Person:
def __init__(self, name, age):
self.name = name
self.age = age

def __gt__(self, other):
return self.age > other.age

p1 = Person("Alice", 30)
p2 = Person("Bob", 25)

print(p1 > p2) # Вывод: True
print(p2 > p1) # Вывод: False


🟠Метод `ge`
Отвечает за оператор больше или равно >=. Он позволяет определить, когда один объект вашего класса считается больше или равен другому.
class Person:
def __init__(self, name, age):
self.name = name
self.age = age

def __ge__(self, other):
return self.age >= other.age

p1 = Person("Alice", 30)
p2 = Person("Bob", 30)
p3 = Person("Charlie", 25)

print(p1 >= p2) # Вывод: True
print(p1 >= p3) # Вывод: True
print(p3 >= p1) # Вывод: False


Ставь 👍 и забирай 📚 Базу знаний

Python | Вопросы собесов

16 Nov, 16:10


🤔 Python — компилируемый или интерпретируемый

Python считается интерпретируемым языком, так как код выполняется интерпретатором построчно, что облегчает отладку и делает его портативным. Тем не менее, перед исполнением Python-код компилируется в байт-код (.pyc), который затем выполняется на виртуальной машине (PVM). Поэтому Python можно назвать интерпретируемым с этапом предварительной компиляции в байт-код.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний

Python | Вопросы собесов

16 Nov, 09:10


🤔 Метод bool?

Используется для определения логической истинности (truthiness) объекта. Когда вызывается функция bool() на объекте или объект используется в контексте, где требуется логическое значение (например, в условиях if), вызывается метод __bool__. Если метод __bool__ не определен, Python использует метод __len__: объект считается ложным (False), если его длина равна нулю, и истинным (True) в противном случае.

🚩Зачем нужен

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

🚩Как использовать

Для того чтобы использовать метод __bool__, нужно его определить в своем классе. Метод должен возвращать либо True, либо False. В этом примере метод __bool__ проверяет значение атрибута value. Если value имеет значение, которое считается ложным (например, 0 или None), метод возвращает False. В противном случае, он возвращает True.
class MyClass:
def __init__(self, value):
self.value = value

def __bool__(self):
return bool(self.value)

# Примеры использования
obj1 = MyClass(0)
obj2 = MyClass(10)

print(bool(obj1)) # Вывод: False
print(bool(obj2)) # Вывод: True

if obj1:
print("obj1 is True")
else:
print("obj1 is False") # Этот блок выполнится

if obj2:
print("obj2 is True") # Этот блок выполнится
else:
print("obj2 is False")


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

Допустим, у вас есть класс Box, который содержит предметы, и вы хотите, чтобы пустая коробка считалась ложной, а коробка с предметами — истинной.
class Box:
def __init__(self, items):
self.items = items

def __bool__(self):
return bool(self.items)

# Примеры использования
empty_box = Box([])
full_box = Box(['item1', 'item2'])

print(bool(empty_box)) # Вывод: False
print(bool(full_box)) # Вывод: True

if empty_box:
print("The box is not empty")
else:
print("The box is empty") # Этот блок выполнится

if full_box:
print("The box is not empty") # Этот блок выполнится
else:
print("The box is empty")


Ставь 👍 и забирай 📚 Базу знаний

Python | Вопросы собесов

15 Nov, 16:10


🤔 Мультипроцессинг — что это

Мультипроцессинг — это подход, при котором для выполнения задач создаются отдельные процессы, а не потоки. В Python это полезно для обхода ограничения GIL (Global Interpreter Lock), позволяя исполнять код параллельно на нескольких ядрах процессора. Модуль multiprocessing позволяет создавать независимые процессы, каждый из которых выполняет свою копию интерпретатора Python.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний

Python | Вопросы собесов

15 Nov, 09:10


🤔 Методы add, mul, sub, truediv?

Относятся к так называемым "магическим методам" или "специальным методам". Они позволяют определять поведение объектов при использовании операторов сложения (+), умножения (*), вычитания (-) и деления (/).

🟠Метод `__add__`

Этот метод отвечает за операцию сложения. Если вы определяете этот метод в вашем классе, вы можете контролировать, что происходит, когда вы используете оператор + между объектами этого класса.
class Vector:
def __init__(self, x, y):
self.x = x
self.y = y

def __add__(self, other):
return Vector(self.x + other.x, self.y + other.y)

def __repr__(self):
return f"Vector({self.x}, {self.y})"

v1 = Vector(1, 2)
v2 = Vector(3, 4)
print(v1 + v2) # Вывод: Vector(4, 6)


🟠Метод `__mul__`

Этот метод отвечает за операцию умножения. Его можно использовать, чтобы определить, как объекты вашего класса будут вести себя при использовании оператора *.
class Vector:
def __init__(self, x, y):
self.x = x
self.y = y

def __mul__(self, scalar):
return Vector(self.x * scalar, self.y * scalar)

def __repr__(self):
return f"Vector({self.x}, {self.y})"

v = Vector(1, 2)
print(v * 3) # Вывод: Vector(3, 6)


🟠Метод `__sub__`

Этот метод отвечает за операцию вычитания. Он позволяет вам определить поведение объектов при использовании оператора -.
class Vector:
def __init__(self, x, y):
self.x = x
self.y = y

def __sub__(self, other):
return Vector(self.x - other.x, self.y - other.y)

def __repr__(self):
return f"Vector({self.x}, {self.y})"

v1 = Vector(5, 7)
v2 = Vector(2, 3)
print(v1 - v2) # Вывод: Vector(3, 4)


🟠Метод `__truediv__`

Этот метод отвечает за операцию деления. Он позволяет определить, как объекты вашего класса будут вести себя при использовании оператора /.
class Vector:
def __init__(self, x, y):
self.x = x
self.y = y

def __truediv__(self, scalar):
return Vector(self.x / scalar, self.y / scalar)

def __repr__(self):
return f"Vector({self.x}, {self.y})"

v = Vector(8, 4)
print(v / 2) # Вывод: Vector(4.0, 2.0)


Ставь 👍 и забирай 📚 Базу знаний

Python | Вопросы собесов

14 Nov, 16:10


🤔 В чем разница сравнение через is и ==

Оператор == проверяет равенство значений, то есть проверяет, содержат ли переменные одинаковые данные. Оператор is проверяет, ссылаются ли переменные на один и тот же объект в памяти. Таким образом, is используется для проверки идентичности объекта, а == — для проверки равенства значений.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний

Python | Вопросы собесов

14 Nov, 09:10


🤔 Что такое mocking?

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

🚩Основные компоненты

🟠`Mock` и `MagicMock`
Основные классы для создания мок-объектов.
🟠`patch`
Декоратор или контекстный менеджер для замены объектов на моки во время выполнения теста.

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

Простой пример с использованием Mock
from unittest.mock import Mock

# Создание мок-объекта
mock = Mock()

# Настройка мок-объекта
mock.some_method.return_value = "Mocked Result"

# Вызов метода и проверка результата
result = mock.some_method()
print(result) # Вывод: Mocked Result


Использование patch для замены объектов
import unittest
from unittest.mock import patch

# Пример функции, которая вызывает внешний API
def fetch_data():
import requests
response = requests.get("http://example.com/api/data")
return response.json()

# Тестирование функции с использованием patch
class TestFetchData(unittest.TestCase):
@patch('requests.get')
def test_fetch_data(self, mock_get):
# Настройка мок-ответа
mock_get.return_value.json.return_value = {"key": "value"}

# Вызов тестируемой функции
result = fetch_data()

# Проверка результата
self.assertEqual(result, {"key": "value"})
mock_get.assert_called_once_with("http://example.com/api/data")

if __name__ == '__main__':
unittest.main()


Использование MagicMock
from unittest.mock import MagicMock

# Создание объекта MagicMock
mock = MagicMock()

# Настройка возвращаемого значения для магического метода __str__
mock.__str__.return_value = "MagicMocked String"

print(str(mock)) # Вывод: MagicMocked String


Ставь 👍 и забирай 📚 Базу знаний

Python | Вопросы собесов

13 Nov, 16:10


🤔 Что такое `__slots__`?

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

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний

Python | Вопросы собесов

13 Nov, 09:10


🤔 Что такое unit test?

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

🚩Основные характеристики

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

🚩Пример

1⃣Тестируемая функция
def add(a, b):
return a + b


2⃣Написание юнит-теста
import unittest
from my_module import add # Импортируем тестируемую функцию из модуля

class TestAddFunction(unittest.TestCase):
def test_add_positive_numbers(self):
self.assertEqual(add(2, 3), 5)

def test_add_negative_numbers(self):
self.assertEqual(add(-1, -1), -2)

def test_add_zero(self):
self.assertEqual(add(0, 0), 0)

if __name__ == '__main__':
unittest.main()


3⃣Запуск юнит-тестов
python test_add.py


Ставь 👍 и забирай 📚 Базу знаний

Python | Вопросы собесов

12 Nov, 16:10


🤔 Threading что это

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

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний

Python | Вопросы собесов

12 Nov, 09:10


🤔 Что такое monkey patch?

Это практика динамического изменения или расширения кода в рантайме. Это позволяет изменять поведение модулей или классов без изменения их исходного кода. Monkey patching может быть полезен для исправления багов, добавления функциональности или изменения поведения библиотек, особенно когда их исходный код недоступен или его нежелательно изменять.

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

class Dog:
def bark(self):
return "Woof!"

# Оригинальное поведение
dog = Dog()
print(dog.bark()) # Вывод: Woof!

# Применение monkey patch
def new_bark(self):
return "Woof! Woof!"

Dog.bark = new_bark

# Измененное поведение
print(dog.bark()) # Вывод: Woof! Woof!


🟠Пример использования monkey patch для исправления ошибки
Допустим, у нас есть модуль math_operations.py с функцией, содержащей ошибку:
# math_operations.py
def add(a, b):
return a - b # Ошибка: должно быть сложение, а не вычитание


Мы можем использовать monkey patch, чтобы исправить эту ошибку, не изменяя исходный код:
import math_operations

def corrected_add(a, b):
return a + b

# Применение monkey patch
math_operations.add = corrected_add

# Теперь функция add работает правильно
print(math_operations.add(2, 3)) # Вывод: 5


🟠Использование monkey patch для расширения функциональности
Мы также можем использовать monkey patch для добавления новых методов в существующие классы:
class Cat:
def meow(self):
return "Meow!"

# Оригинальное поведение
cat = Cat()
print(cat.meow()) # Вывод: Meow!

# Применение monkey patch
def purr(self):
return "Purr..."

Cat.purr = purr

# Расширенное поведение
print(cat.purr()) # Вывод: Purr...


🚩Плюсы

Быстрое исправление багов без изменения исходного кода.
Возможность добавления функциональности к сторонним библиотекам.
Гибкость и мощь изменения поведения кода во время выполнения.

🚩Минусы

Может сделать код менее читаемым и более сложным для понимания.
Возможность возникновения конфликтов, если несколько частей кода пытаются изменить одно и то же поведение.
Трудности с поддержкой и отладкой кода, так как поведение может изменяться непредсказуемо.

Ставь 👍 и забирай 📚 Базу знаний

Python | Вопросы собесов

12 Nov, 07:00


Тестовое собеседование на Middle Python-разработчика в четверг

14 ноября (в четверг) в 19:00 по мск приходи онлайн на открытое собеседование, чтобы посмотреть на настоящее интервью на Middle Python-разработчика.

Как это будет:
1. Савва Демиденко, ex. TechLead в Яндексе, Авито и другом русском бигтехе будет задавать реальные вопросы и задачи разработчику-добровольцу
2. Савва будет комментировать каждый ответ респондента, чтобы дать понять чего от вас ожидает собеседующий на интервью
3. В конце можно будет задать любой вопрос Савве

Что узнаешь на прямом эфире от ШОРТКАТ:
• Чего ждут от кандидатов на Middle позиции в Python-разработке
• Какие вопросы задают на интервью и зачем
• Как подготовиться к собесу, чтобы получить оффер

Это бесплатно? Бесплатно

Переходи в нашего бота, чтобы получить ссылку на эфир → @shortcut_python_bot

Реклама. ООО "ШОРТКАТ", ИНН: 9731139396, erid: 2Vtzqwqujuo

Python | Вопросы собесов

11 Nov, 16:10


🤔 Что такое метаклассы в Python?

Метаклассы в Python — это "классы классов", которые определяют, как класс должен быть создан. Они играют роль шаблонов для создания классов. В Python, класс `type` является встроенным метаклассом, от которого все классы неявно наследуются. Метаклассы позволяют программистам, например, автоматически добавлять новые методы или изменять атрибуты в классах, что особенно полезно в фреймворках и библиотеках, где нужен дополнительный уровень абстракции или автоматизации при определении классов.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний

Python | Вопросы собесов

11 Nov, 09:10


🤔 Как Python взаимодействует с файлом?

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

🚩Методы

1⃣Открытие файла
Используется функция open(), которая возвращает объект файла. open() принимает два основных аргумента:
- Имя файла (путь к файлу).
- Режим открытия файла (например, чтение, запись, добавление и т.д.).
Примеры режимов:
- 'r': Открытие для чтения (по умолчанию).
- 'w': Открытие для записи (содержимое файла удаляется).
- 'a': Открытие для добавления (данные добавляются в конец файла).
- 'b': Бинарный режим (например, 'rb' или 'wb').
- '+': Открытие для чтения и записи (например, 'r+' или 'w+').
file = open('example.txt', 'r')


2⃣Чтение из файла
Для чтения данных из файла используются методы read(), readline() и readlines().
with open('example.txt', 'r') as file:
content = file.read()
print(content)


Пример чтения файла построчно:
with open('example.txt', 'r') as file:
for line in file:
print(line.strip())


3⃣Запись в файл
Для записи данных в файл используются методы write() и writelines().
with open('example.txt', 'w') as file:
file.write('Hello, World!')


Пример добавления строки в конец файла:
with open('example.txt', 'a') as file:
file.write('\nAppend this line')


4⃣Закрытие файла
Важно закрывать файл после работы с ним, чтобы освободить ресурсы. Это можно сделать с помощью метода close(), но лучше использовать конструкцию with, которая автоматически закрывает файл:
with open('example.txt', 'r') as file:
content = file.read()
# Файл автоматически закроется по завершении блока with


Пример полного цикла работы с файлом
# Открытие файла для записи
with open('example.txt', 'w') as file:
file.write('This is the first line.\n')
file.write('This is the second line.\n')

# Открытие файла для добавления
with open('example.txt', 'a') as file:
file.write('This line is added to the end of the file.\n')

# Открытие файла для чтения
with open('example.txt', 'r') as file:
for line in file:
print(line.strip())


5⃣Работа с бинарными файлами
Для работы с бинарными файлами используется режим 'b'. Например, чтение и запись изображений или других бинарных данных
# Чтение бинарного файла
with open('image.png', 'rb') as file:
data = file.read()

# Запись в бинарный файл
with open('copy_image.png', 'wb') as file:
file.write(data)


6⃣Исключения и обработка ошибок
Для обработки ошибок при работе с файлами можно использовать конструкцию try except:
try:
with open('example.txt', 'r') as file:
content = file.read()
except FileNotFoundError:
print("File not found.")
except IOError:
print("An error occurred while reading the file.")


Ставь 👍 и забирай 📚 Базу знаний

Python | Вопросы собесов

10 Nov, 16:10


🤔 В чем разница сравнение через is и "=="?

В Python `is` проверяет идентичность объектов, т.е., ссылаются ли две переменные на один и тот же объект в памяти. Оператор `==` проверяет равенство значений объектов. Так, две различные переменные, содержащие одинаковые данные, будут равны (`==`), но не идентичны (`is`), если они указывают на разные объекты.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний

Python | Вопросы собесов

10 Nov, 09:10


🤔 Что такое Try Except?

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

🚩Основные компоненты

🟠try блок: Содержит код, который потенциально может вызвать исключение.
🟠except блок: Содержит код, который выполняется, если в блоке try возникает исключение.

Общий синтаксис
try:
# Код, который может вызвать исключение
...
except SomeException as e:
# Код, который выполняется в случае возникновения исключения SomeException
...

try:
result = 10 / 0
except ZeroDivisionError as e:
print(f"Error occurred: {e}")


🚩Многоуровневая обработка исключений

Можно обрабатывать различные типы исключений по-разному. Здесь, если строку "abc" невозможно преобразовать в целое число, будет вызвано исключение ValueError, и соответствующее сообщение будет выведено.
try:
result = int("abc")
except ZeroDivisionError:
print("Attempted to divide by zero")
except ValueError:
print("Invalid value")
except Exception as e:
print(f"An unexpected error occurred: {e}")


🚩Блоки `else` и `finally`

🟠`else` блок: Выполняется, если в блоке try не возникло исключений.
🟠`finally` блок: Выполняется всегда, независимо от того, возникло исключение или нет. Используется для освобождения ресурсов, закрытия файлов и т.д.
try:
file = open('example.txt', 'r')
content = file.read()
except FileNotFoundError:
print("File not found")
else:
print("File read successfully")
finally:
file.close()
print("File closed")


Пример с использованием finally
try:
file = open('example.txt', 'r')
content = file.read()
except FileNotFoundError:
print("File not found")
else:
print("File read successfully")
finally:
try:
file.close()
print("File closed")
except NameError:
print("File was never opened")


Ставь 👍 и забирай 📚 Базу знаний

Python | Вопросы собесов

10 Nov, 07:10


Бесплатное IT-образование в 2024

Отобрали для вас полезные телеграм-каналы, которые помогут освоить программирование и другие IT-направления

Выбирайте нужное и подписывайтесь:

👩‍💻 Python: @PythonPortal
📱 GitHub: @git_developer
👩‍💻 Frontend: @FrontendPortal
🤓 Книги айти: @portalToIT
👩‍💻 Java: @Java_Iibrary
👩‍💻 C#: @KodBlog
👩‍💻 С/С++: @Cpportal
⚙️ Backend: @BackendPortal
🐞 Тестирование: @QAPortal
👩‍💻 DevOps: @loose_code
🖥 Базы Данных & SQL: @SQL
👩‍💻 Golang: @juniorGolang
👩‍💻 PHP: @PHPortal
👩‍💻 Моб. разработка: @MobDev
👩‍💻 Разработка игр: @GameDevgx
🖥 Data Science: @DataSciencegx
🤔 Хакинг & ИБ: @cybersecinform
📱 Маркетинг: @MarketingPortal
🖥 Дизайн: @PortalToDesign

➡️ Сохраняйте себе, чтобы не потерять

Python | Вопросы собесов

09 Nov, 16:10


🤔 Threading что это?

Threading в Python — это использование потоков для выполнения множества задач одновременно в рамках одного процесса. Это полезно для выполнения I/O-задержанных задач и повышения реактивности программы. Однако из-за глобальной блокировки интерпретатора (GIL) в CPython, потоки не всегда могут эффективно использоваться для задач, требующих интенсивных вычислений.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний

Python | Вопросы собесов

09 Nov, 09:10


🤔 Что такое @classmethod?

Это декоратор в Python, который используется для определения метода класса. Методы класса работают с самим классом, а не с его экземплярами. В отличие от обычных методов, которые принимают в качестве первого аргумента self (ссылку на экземпляр), методы класса принимают cls (ссылку на класс).

🟠Основные моменты
Доступ к атрибутам и методам класса: Методы класса имеют доступ ко всем атрибутам и методам класса, но не к атрибутам экземпляров.
Использование декоратора @classmethod: Для определения метода класса используется декоратор.
Часто используются для фабричных методов: Методы класса часто используются для создания альтернативных конструкторов.
class MyClass:
    class_attribute = "Hello, World!"

    def __init__(self, value):
        self.instance_attribute = value

    @classmethod
    def class_method(cls):
        return cls.class_attribute

# Создание экземпляра класса
obj = MyClass("Some value")

# Вызов метода класса через класс
print(MyClass.class_method())  # Hello, World!

# Вызов метода класса через экземпляр
print(obj.class_method())  # Hello, World!


🟠Пример фабричного метода
Это метод, который возвращает объект класса. Методы класса удобно использовать для создания таких методов, поскольку они имеют доступ к самому классу и могут создавать его экземпляры.
class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    @classmethod
    def from_birth_year(cls, name, birth_year):
        current_year = 2023
        age = current_year - birth_year
        return cls(name, age)

# Создание объекта через основной конструктор
person1 = Person("Alice", 30)

# Создание объекта через фабричный метод
person2 = Person.from_birth_year("Bob", 1990)

print(person1.name, person1.age)  # Alice 30
print(person2.name, person2.age)  # Bob 33


🟠Сравнение с другими методами
Обычные методы: Принимают self как первый аргумент и работают с конкретными экземплярами класса. Доступны как к атрибутам класса, так и к атрибутам экземпляра.
Методы класса: Принимают cls как первый аргумент и работают с самим классом. Доступны только к атрибутам класса.
Статические методы: Не принимают автоматически ни self, ни cls. Они могут быть вызваны на классе или экземпляре и не имеют доступа ни к атрибутам класса, ни к атрибутам экземпляра.
class Example:
    class_attr = "class attribute"

    def __init__(self, value):
        self.instance_attr = value

    def instance_method(self):
        return f"instance method: {self.instance_attr}"

    @classmethod
    def class_method(cls):
        return f"class method: {cls.class_attr}"

    @staticmethod
    def static_method():
        return "static method"

# Создание экземпляра класса
example = Example("instance attribute")

# Вызов методов
print(example.instance_method())  # instance method: instance attribute
print(Example.class_method())     # class method: class attribute
print(example.class_method())     # class method: class attribute
print(Example.static_method())    # static method
print(example.static_method())    # static method


Ставь 👍 и забирай 📚 Базу знаний

Python | Вопросы собесов

08 Nov, 16:10


🤔 Что такое list comprehension?

List comprehension в Python — это способ создания списков, используя конструкцию, состоящую из выражения и одного или нескольких циклов for и условий if в одной строке. Это позволяет генерировать новые списки путем применения выражения к каждому элементу последовательности, делая код компактным и часто более читаемым.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний

Python | Вопросы собесов

08 Nov, 09:10


🤔 Какие есть виды наследования ?

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

🚩Виды

🟠Простое (одиночное) наследование
Класс-наследник (подкласс) наследует от одного родительского класса (суперкласса).
class Animal:
def speak(self):
pass

class Dog(Animal):
def speak(self):
return "Woof!"

# Использование
dog = Dog()
print(dog.speak()) # Вывод: Woof!


🟠Множественное наследование
Класс-наследник наследует от двух или более родительских классов.
class Canine:
def bark(self):
return "Bark!"

class Feline:
def meow(self):
return "Meow!"

class CatDog(Canine, Feline):
pass

# Использование
catdog = CatDog()
print(catdog.bark()) # Вывод: Bark!
print(catdog.meow()) # Вывод: Meow!


🟠Многоуровневое (иерархическое) наследование
Класс-наследник (подкласс) наследует от другого класса-наследника (подкласса), образуя цепочку наследования.
class Animal:
def speak(self):
pass

class Dog(Animal):
def speak(self):
return "Woof!"

class Bulldog(Dog):
def speak(self):
return "Woof! I am a Bulldog."

# Использование
bulldog = Bulldog()
print(bulldog.speak()) # Вывод: Woof! I am a Bulldog.


🟠Иерархическое наследование
Один родительский класс имеет несколько классов-наследников.
class Animal:
def speak(self):
pass

class Dog(Animal):
def speak(self):
return "Woof!"

class Cat(Animal):
def speak(self):
return "Meow!"

# Использование
dog = Dog()
cat = Cat()
print(dog.speak()) # Вывод: Woof!
print(cat.speak()) # Вывод: Meow!


🟠Гибридное наследование
Комбинация двух или более типов наследования.
class Canine:
def bark(self):
return "Bark!"

class Feline:
def meow(self):
return "Meow!"

class Animal:
def speak(self):
pass

class CatDog(Animal, Canine, Feline):
def speak(self):
return f"{self.bark()} {self.meow()}"

# Использование
catdog = CatDog()
print(catdog.speak()) # Вывод: Bark! Meow!


🚩Плюсы

Повторное использование кода
Классы-наследники могут использовать методы и атрибуты родительских классов, что уменьшает дублирование кода.
Упрощение сопровождения
Изменения в родительском классе автоматически распространяются на все классы-наследники.
Полиморфизм
Позволяет использовать объекты разных классов через интерфейс одного родительского класса, что упрощает обработку иерархий объектов.

🚩Минусы

Сложность структуры
Множественное и многоуровневое наследование могут привести к сложной и запутанной иерархии классов.
Жёсткая связь
Классы-наследники зависят от родительских классов, что может усложнить изменения в иерархии.
Проблемы с множественным наследованием
В языках, поддерживающих множественное наследование, могут возникнуть проблемы с конфликтом имен и порядок разрешения методов (MRO — Method Resolution Order).

Ставь 👍 и забирай 📚 Базу знаний

Python | Вопросы собесов

07 Nov, 16:10


🤔 Что относится к изменяемым типам данных и к неизменяемым?

В Python к изменяемым типам данных относятся списки (list), множества (set), словари (dict), а к неизменяемым — числа, строки (str), кортежи (tuple), замороженные множества (frozenset).

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний

Python | Вопросы собесов

07 Nov, 09:10


🤔 Что такое абстрактный метод ?

Это метод, объявленный в абстрактном классе, который не имеет реализации и должен быть переопределён в подклассах. Служат для определения интерфейса, который должен быть реализован в наследниках, обеспечивая тем самым реализацию полиморфизма и строгий контракт для классов-наследников.

🚩Характеристики

🟠Отсутствие реализации
Не имеет тела, то есть не содержит кода, реализующего его поведение.
🟠Обязательность переопределения
Классы, наследующие абстрактный класс, обязаны переопределить все его абстрактные методы, иначе они также должны быть объявлены абстрактными.
🟠Абстрактный класс
Могут быть объявлены только в абстрактных классах. Абстрактный класс не может быть инстанцирован напрямую и служит для определения интерфейса для своих подклассов.
from abc import ABC, abstractmethod

class Animal(ABC):
@abstractmethod
def speak(self):
pass

class Dog(Animal):
def speak(self):
return "Woof!"

class Cat(Animal):
def speak(self):
return "Meow!"

# animal = Animal() # Ошибка: Нельзя создать экземпляр абстрактного класса

dog = Dog()
cat = Cat()

print(dog.speak()) # Вывод: Woof!
print(cat.speak()) # Вывод: Meow!

🟠Абстрактный класс Animal
Класс Animal объявлен абстрактным (наследуется от ABC). В классе Animal объявлен абстрактный метод speak, который не имеет реализации.
🟠Классы Dog и Cat
Классы Dog и Cat наследуют от Animal и реализуют метод speak. Если бы они не реализовали метод speak, возникла бы ошибка при попытке создания экземпляра этих классов.
🟠Создание экземпляров
Экземпляры классов Dog и Cat создаются и их методы speak вызываются, возвращая соответствующие строки.

🚩Плюсы

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

Ставь 👍 и забирай 📚 Базу знаний

Python | Вопросы собесов

06 Nov, 16:10


🤔 Что такое магические методы?

Магические методы в Python — это специальные методы с двойными подчеркиваниями в начале и конце имени (например, `__init__`, `__str__`, `__repr__`). Они предназначены для переопределения операций, которые по умолчанию выполняются для различных типов операций, таких как арифметические операции, операции среза, операции сравнения и другие.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний

Python | Вопросы собесов

06 Nov, 09:10


🤔 Как реализуются public метод?

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

🟠Создание и использование публичного метода
Для создания публичного метода в Python достаточно определить метод внутри класса. Имя метода не должно начинаться с подчеркивания (если не используются дополнительные соглашения о доступе).
class MyClass:
def public_method(self):
print("This is a public method")

# Создание экземпляра класса
obj = MyClass()

# Вызов публичного метода
obj.public_method() # This is a public method


🟠Примеры использования публичных методов
Внутри класса
Публичные методы можно вызывать из других методов того же класса, используя self.
class MyClass:
def public_method(self):
print("This is a public method")

def another_method(self):
print("Calling public_method from another_method")
self.public_method()

# Создание экземпляра класса
obj = MyClass()

# Вызов метода, который вызывает другой публичный метод
obj.another_method()
# Output:
# Calling public_method from another_method
# This is a public method


Внешний вызов
Публичные методы можно вызывать из внешнего кода, создавая экземпляр класса и обращаясь к методу через этот экземпляр.
class MyClass:
def public_method(self):
print("This is a public method")

# Создание экземпляра класса
obj = MyClass()

# Вызов публичного метода
obj.public_method() # This is a public method


Ставь 👍 и забирай 📚 Базу знаний

Python | Вопросы собесов

05 Nov, 16:10


🤔 Что делает декоратор property?

Декоратор `property` в Python используется для создания свойств объекта, что позволяет управлять доступом к атрибутам класса через геттеры, сеттеры и методы удаления. Это делает возможным изменение внутреннего представления данных без изменения интерфейса класса, обеспечивает лучший контроль за доступом и валидацию данных.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний

Python | Вопросы собесов

05 Nov, 09:10


🤔 Как был реализовал паттерн singleton?

Гарантирует, что класс имеет только один экземпляр и предоставляет глобальную точку доступа к этому экземпляру.

Использование класса с атрибутом класса
class Singleton:
_instance = None

def __new__(cls, *args, **kwargs):
if not cls._instance:
cls._instance = super(Singleton, cls).__new__(cls, *args, **kwargs)
return cls._instance

# Пример использования
singleton1 = Singleton()
singleton2 = Singleton()

print(singleton1 is singleton2) # True


Использование декоратора
def singleton(cls):
instances = {}
def get_instance(*args, **kwargs):
if cls not in instances:
instances[cls] = cls(*args, **kwargs)
return instances[cls]
return get_instance

@singleton
class Singleton:
pass

# Пример использования
singleton1 = Singleton()
singleton2 = Singleton()

print(singleton1 is singleton2) # True


Использование метакласса
class SingletonMeta(type):
_instances = {}

def __call__(cls, *args, **kwargs):
if cls not in cls._instances:
cls._instances[cls] = super(SingletonMeta, cls).__call__(*args, **kwargs)
return cls._instances[cls]

class Singleton(metaclass=SingletonMeta):
pass

# Пример использования
singleton1 = Singleton()
singleton2 = Singleton()

print(singleton1 is singleton2) # True


Использование модуля (встроенная реализация Singleton)
# module_singleton.py
class Singleton:
pass

singleton = Singleton()

# Пример использования
import module_singleton

singleton1 = module_singleton.singleton
singleton2 = module_singleton.singleton

print(singleton1 is singleton2) # True


Ставь 👍 и забирай 📚 Базу знаний

Python | Вопросы собесов

04 Nov, 16:10


🤔 Что такое метаклассы?

Метаклассы в Python — это классы, создающие классы. Они являются "классами классов", которые определяют, как создается новый класс. Метаклассы позволяют вмешиваться и изменять поведение класса во время его создания, что полезно для расширенной настройки классов, например, для проверки атрибутов или автоматической регистрации классов в некотором реестре.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний

Python | Вопросы собесов

04 Nov, 09:10


🤔 Какие бывают виды тестов?

🚩Виды

🟠Юнит-тесты (Unit Tests)
Юнит-тесты проверяют отдельные модули или функции на правильность их работы. Эти тесты изолированы и проверяют минимальные функциональные блоки программы.
import unittest

def add(a, b):
return a + b

class TestAddFunction(unittest.TestCase):
def test_add_positive_numbers(self):
self.assertEqual(add(2, 3), 5)

def test_add_negative_numbers(self):
self.assertEqual(add(-1, -1), -2)

if __name__ == '__main__':
unittest.main()


🟠Интеграционные тесты (Integration Tests)
Интеграционные тесты проверяют взаимодействие между различными модулями или компонентами системы, чтобы убедиться, что они работают вместе правильно.
import unittest

class Database:
def connect(self):
return "Connected to database"

class Application:
def __init__(self):
self.db = Database()

def start(self):
return self.db.connect()

class TestApplication(unittest.TestCase):
def test_application_start(self):
app = Application()
self.assertEqual(app.start(), "Connected to database")

if __name__ == '__main__':
unittest.main()


🟠Функциональные тесты (Functional Tests)
Функциональные тесты проверяют конкретные функции и их соответствие требованиям. Эти тесты обычно основаны на спецификациях и проверяют, правильно ли выполняется функция.
def login(username, password):
if username == "admin" and password == "secret":
return "Login successful"
else:
return "Login failed"

class TestLoginFunction(unittest.TestCase):
def test_valid_login(self):
self.assertEqual(login("admin", "secret"), "Login successful")

def test_invalid_login(self):
self.assertEqual(login("user", "password"), "Login failed")

if __name__ == '__main__':
unittest.main()


🟠Системные тесты (System Tests)
Системные тесты проверяют всю систему в целом, проверяя все компоненты и функции вместе в интегрированной среде.
class SystemTest(unittest.TestCase):
def test_system(self):
app = Application()
result = app.start()
self.assertEqual(result, "Connected to database")
self.assertEqual(login("admin", "secret"), "Login successful")

if __name__ == '__main__':
unittest.main()


🟠Приемочные тесты (Acceptance Tests)
Приемочные тесты проверяют систему на соответствие бизнес-требованиям и ожиданиям пользователя. Эти тесты часто проводятся пользователями или командой контроля качества.

Ставь 👍 и забирай 📚 Базу знаний

Python | Вопросы собесов

03 Nov, 16:10


🤔 В чем отличие списка от кортежа?

Список (list) в Python — это изменяемая коллекция элементов, что позволяет добавлять, удалять или изменять элементы после создания. Кортеж (tuple) — это неизменяемая коллекция, то есть элементы нельзя изменить после создания. Списки обычно используются для хранения данных, которые могут изменяться, тогда как кортежи полезны для неизменяемых наборов данных, которые должны оставаться неизменными для большей безопасности или производительности. Кортежи также быстрее списков за счёт своей неизменяемости.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний

Python | Вопросы собесов

03 Nov, 09:10


🤔 Какие есть методы у классов?

🚩Типы методов

🟠Обычные методы (Instance Methods)
Обычные методы работают с экземплярами класса и могут изменять их состояние. Они принимают первым аргументом ссылку на сам экземпляр (self).
class Dog:
def __init__(self, name):
self.name = name # Атрибут объекта

def bark(self):
return f"{self.name} says woof!"

dog = Dog("Buddy")
print(dog.bark()) # Buddy says woof!


🟠Методы класса (Class Methods)
Методы класса работают с самим классом, а не с экземплярами. Они принимают первым аргументом ссылку на класс (cls). Для создания метода класса используется декоратор @classmethod.
class Dog:
species = "Canis lupus familiaris" # Атрибут класса

@classmethod
def get_species(cls):
return cls.species

print(Dog.get_species()) # Canis lupus familiaris


🟠Статические методы (Static Methods)
Статические методы не зависят ни от экземпляра класса, ни от самого класса. Они не получают автоматически ни ссылку на экземпляр (self), ни ссылку на класс (cls). Для создания статического метода используется декоратор @staticmethod.
class Dog:
@staticmethod
def is_domesticated():
return True

print(Dog.is_domesticated()) # True


🟠Магические методы (Dunder Methods)
Магические методы (или dunder методы, от "double underscore") определяют специальные поведения объектов, такие как инициализация, строковое представление, перегрузка операторов и другие. Они имеют двойное подчеркивание в начале и в конце имени.
Некоторые распространенные магические методы:
__init__: Инициализация объекта.
__str__: Строковое представление объекта.
__repr__: Официальное строковое представление объекта, используемое для отладки.
__len__: Определяет длину объекта.
__add__: Перегружает оператор сложения.
class Dog:
def __init__(self, name, age):
self.name = name
self.age = age

def __str__(self):
return f"{self.name} is {self.age} years old"

dog = Dog("Buddy", 2)
print(dog) # Buddy is 2 years old


Ставь 👍 и забирай 📚 Базу знаний

Python | Вопросы собесов

02 Nov, 16:10


🤔 В чем отличие асинхронности, threading'га и мультипроцессинга?

Асинхронность позволяет выполнять задачи без блокировки основного потока, используя событийный цикл и `async/await`, что делает её эффективной для операций ввода-вывода. Threading использует несколько потоков в одном процессе для выполнения задач параллельно, но все потоки делят одну память и могут сталкиваться с проблемами синхронизации. Мультипроцессинг создает несколько процессов, каждый из которых имеет собственную память и может выполнять задачи независимо, что позволяет использовать все ядра процессора. Асинхронность предпочтительнее для ввода-вывода, а потоки и процессы — для вычислительно затратных операций.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний

Python | Вопросы собесов

02 Nov, 09:10


🤔 Как создать абстрактный класс?

Используется модуль abc (Abstract Base Classes). Абстрактный класс не может быть инстанцирован и предназначен для создания шаблонов, которые должны быть реализованы в подклассах.

🚩Шаги

1⃣Импортирование модуля `abc`
Для использования абстрактных классов и методов нужно импортировать модуль abc.
2⃣Создание абстрактного класса
Абстрактный класс должен наследоваться от ABC (абстрактный базовый класс), который предоставляется модулем abc.
3⃣Определение абстрактных методов
Абстрактные методы обозначаются декоратором @abstractmethod. Эти методы должны быть реализованы в подклассах, иначе они тоже станут абстрактными.
from abc import ABC, abstractmethod

# Создание абстрактного класса
class Animal(ABC):

@abstractmethod
def make_sound(self):
pass

@abstractmethod
def move(self):
pass

# Попытка создания экземпляра абстрактного класса приведет к ошибке
# animal = Animal() # TypeError: Can't instantiate abstract class Animal with abstract methods make_sound, move

# Создание подклассов, которые реализуют абстрактные методы
class Dog(Animal):
def make_sound(self):
return "Woof"

def move(self):
return "Runs"

class Bird(Animal):
def make_sound(self):
return "Tweet"

def move(self):
return "Flies"

# Теперь можно создать экземпляры подклассов
dog = Dog()
print(dog.make_sound()) # Woof
print(dog.move()) # Runs

bird = Bird()
print(bird.make_sound()) # Tweet
print(bird.move()) # Flies


Ставь 👍 и забирай 📚 Базу знаний

Python | Вопросы собесов

23 Oct, 16:10


🤔 Что такое индексы и как они работают?

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

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний

Python | Вопросы собесов

23 Oct, 09:10


🤔 Что такое шаблонный метод (Template method)?

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

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

🟠Повторное использование кода
Позволяет повторно использовать код, инкапсулируя общие части алгоритма в базовом классе и оставляя вариативные части для реализации в подклассах.
🟠Упрощение изменений
Легко изменять и расширять части алгоритма, переопределяя методы в подклассах.
🟠Контроль над алгоритмом
Базовый класс контролирует структуру алгоритма, предотвращая нежелательные изменения его последовательности.

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

Пример реализации паттерна Шаблонный метод для процесса приготовления кофе и чая. Общие шаги включают кипячение воды, заваривание напитка и добавление добавок, но конкретные шаги зависят от типа напитка.
from abc import ABC, abstractmethod

class CaffeineBeverage(ABC):
def prepare_recipe(self):
self.boil_water()
self.brew()
self.pour_in_cup()
self.add_condiments()

def boil_water(self):
print("Boiling water")

def pour_in_cup(self):
print("Pouring into cup")

@abstractmethod
def brew(self):
pass

@abstractmethod
def add_condiments(self):
pass

class Tea(CaffeineBeverage):
def brew(self):
print("Steeping the tea")

def add_condiments(self):
print("Adding lemon")

class Coffee(CaffeineBeverage):
def brew(self):
print("Dripping coffee through filter")

def add_condiments(self):
print("Adding sugar and milk")

# Клиентский код для использования паттерна Шаблонный метод
def main():
tea = Tea()
coffee = Coffee()

print("Making tea:")
tea.prepare_recipe()

print("\nMaking coffee:")
coffee.prepare_recipe()

if __name__ == "__main__":
main()


🚩Как это работает

1⃣Абстрактный класс `CaffeineBeverage`
Определяет шаблонный метод prepare_recipe, который описывает последовательность шагов алгоритма.
2⃣Методы `boil_water` и `pour_in_cup`
Реализованы в абстрактном классе, так как они одинаковы для всех напитков.
3⃣Абстрактные методы `brew` и `add_condiments`
Объявлены в абстрактном классе и должны быть реализованы в подклассах.
4⃣Подклассы `Tea` и `Coffee`
Реализуют методы brew и add_condiments, определяя конкретные шаги для приготовления чая и кофе.

Ставь 👍 и забирай 📚 Базу знаний

Python | Вопросы собесов

23 Oct, 07:00


Перец на канале «Записки необычного препода» делает невозможное!

А именно — встраивает мышление на английском взрослым людям.

Как обычно пытаются научить «думать на языке»? Методом «бери больше, кидай дальше». Слушайте песни, смотрите фильмы, читайте книги в оригинале, и оно само как-нибудь запустится.

Тут всё совсем не так. Тут происходит встраивание языка на кардинально других принципах. В результате вы ощущаете грамматику и слова «изнутри». Так, как бы вы их ощущали, будь вы носителем английского языка.

Почитать подробнее про эту технологию можно тут.

Есть конкретный механизм мышления. Он состоит из визуального слоя, слоя смыслов и слоя слов. Механизм разбивается на элементы. Каждый элемент тренируется отдельно. Оттренированные элементы стыкуются друг с другом с помощью специальных упражнений.

Здесь:

- Пошаговая технология;
- Разбор механик мышления на языке;
- Простота — любое сложное упражнение должно быть разбито на простые.
- Измеримость — все упражнения тренируются до норматива (как правило в секундах). Норматив гарантирует освоение упражнения на уровне навыка.
- Сумма упражнений неизбежно приводит к мышлению на языке. Так же, как правильно собранные вместе детали создают автомобиль.

Вот, например:
- как найти английские артикли в русском;
- как освоить что угодно в 10 раз быстрее;
- как взломать английскую грамматику.

Подписывайся, чтобы узнать больше.

Python | Вопросы собесов

22 Oct, 16:10


🤔 Какие знаешь принципы ООП?

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

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний

Python | Вопросы собесов

22 Oct, 09:10


🤔 Что такое lru cache?

Это механизм кэширования, который использует стратегию "наименее недавно использованный" для управления хранимыми данными. LRU-кэш хранит фиксированное количество наиболее часто используемых элементов, удаляя наименее недавно использованные элементы, когда необходимо освободить место для новых.

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

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

Python предоставляет удобную реализацию LRU-кэша через декоратор lru_cache в модуле functools. Этот декоратор можно использовать для кэширования результатов вызова функции.
from functools import lru_cache

@lru_cache(maxsize=4)
def expensive_computation(n):
print(f"Computing {n}...")
return n * n

def main():
print(expensive_computation(1)) # Computing 1... -> 1
print(expensive_computation(2)) # Computing 2... -> 4
print(expensive_computation(3)) # Computing 3... -> 9
print(expensive_computation(4)) # Computing 4... -> 16

print(expensive_computation(1)) # Cached -> 1
print(expensive_computation(2)) # Cached -> 4

print(expensive_computation(5)) # Computing 5... -> 25 (1 removed from cache)
print(expensive_computation(3)) # Cached -> 9

print(expensive_computation(1)) # Computing 1... -> 1 (2 removed from cache)

if __name__ == "__main__":
main()


1⃣Декоратор `@lru_cache`
Декорирует функцию expensive_computation, добавляя механизм кэширования.

2⃣Аргумент `maxsize`
Определяет максимальный размер кэша. В данном примере, кэш может хранить до 4 элементов.

3⃣Кэширование и замена
При вызове функции сначала проверяется, есть ли результат в кэше. Если есть, возвращается кэшированный результат. Если нет, функция вычисляет результат, и он сохраняется в кэш. Когда кэш переполняется, наименее недавно использованный элемент удаляется.

Ставь 👍 и забирай 📚 Базу знаний

Python | Вопросы собесов

22 Oct, 07:08


Программист — лекарство от больных тимлидов, тупых багов и тех самых митов в 10 утра ☠️

Здесь собирают лучшие мемы про айтишников, чтобы спасти вашу психику от died'осов на работе.

Идеально зачиллить вечерком и скинуть друзьям: @progeri

Python | Вопросы собесов

21 Oct, 16:10


🤔 Что такое итератор?

Итератор в Python — это объект, который поддерживает метод `__iter__()` и `__next__()` для последовательного перебора элементов коллекции. Итераторы используются для работы с циклами и обеспечивают ленивую генерацию данных, не загружая их все сразу в память. Каждый вызов метода `next()` возвращает следующий элемент, а при отсутствии элементов вызывается исключение `StopIteration`. Итераторы полезны для работы с большими данными и потоками данных.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний

Python | Вопросы собесов

21 Oct, 09:10


🤔 Что такое RPC?

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

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

🟠Простота использования
Позволяет разработчикам вызывать удаленные процедуры так, как будто они находятся на локальной машине, что упрощает программирование распределенных систем.
🟠Абстракция сетевого взаимодействия
Скрывает сложность сетевого взаимодействия, позволяя сосредоточиться на логике приложения.
🟠Интероперабельность
Обеспечивает взаимодействие между приложениями, работающими на разных платформах и написанных на разных языках программирования.

🚩Как работает

1⃣Клиент
Инициирует вызов удаленной процедуры, отправляя запрос на сервер.
2⃣Сервер
Принимает запрос, выполняет запрашиваемую процедуру и возвращает результат клиенту.

Сервер
from xmlrpc.server import SimpleXMLRPCServer

def add(x, y):
return x + y

def main():
server = SimpleXMLRPCServer(("localhost", 8000))
print("Listening on port 8000...")
server.register_function(add, "add")
server.serve_forever()

if __name__ == "__main__":
main()


3⃣Stub (заглушки)
Клиентские и серверные заглушки генерируются для сериализации и десериализации данных, что позволяет передавать данные по сети.

Клиент
import xmlrpc.client

def main():
with xmlrpc.client.ServerProxy("http://localhost:8000/") as proxy:
result = proxy.add(5, 3)
print(f"5 + 3 = {result}")

if __name__ == "__main__":
main()


🚩Как это работает

1⃣Сервер
Создает XML-RPC сервер и регистрирует функцию add, которая принимает два числа и возвращает их сумму. Сервер ожидает запросы на порту 8000.
2⃣Клиент
Подключается к серверу через ServerProxy и вызывает удаленную функцию add с аргументами 5 и 3. Результат вызова выводится на экран.

🚩Плюсы

Упрощение распределенного программирования
Обеспечивает простой интерфейс для вызова удаленных процедур.
Повышение производительности
Меньше задержек по сравнению с передачей сообщений благодаря синхронным вызовам.
Интероперабельность
Поддерживает взаимодействие между системами на разных платформах и языках программирования.

🚩Минусы

Зависимость от сети
Работа системы зависит от сетевого соединения, что может приводить к задержкам и ошибкам.
Сложность отладки
Ошибки и проблемы могут быть сложными для диагностики из-за распределенной природы системы.
Безопасность
Необходимо обеспечить безопасность данных, передаваемых по сети, особенно при использовании в открытых сетях.

Ставь 👍 и забирай 📚 Базу знаний

Python | Вопросы собесов

20 Oct, 16:10


🤔 Чем init() отличается от new()?

Метод `__init__()` отвечает за инициализацию объекта после его создания и не создает сам объект, а лишь настраивает его начальные параметры. Метод `__new__()` отвечает за создание нового экземпляра класса и вызывается перед `__init__()`. `__new__()` используется, когда требуется контролировать процесс создания объектов, например, при наследовании или работе с неизменяемыми типами. В большинстве случаев программисту достаточно использовать только `__init__()`.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний

Python | Вопросы собесов

20 Oct, 09:10


🤔 Что такое паттерн Состояние (State)?

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

🚩Зачем нужен

🟠Управление сложными переходами
🟠Инкапсуляция логики состояния
Логика, связанная с конкретными состояниями, инкапсулируется в отдельных классах, что способствует лучшему разделению обязанностей и поддержке кода.
🟠Гибкость и расширяемость
Легко добавлять новые состояния и изменять существующие без внесения изменений в основной код объекта.
from abc import ABC, abstractmethod

# Интерфейс состояния
class State(ABC):
@abstractmethod
def insert_coin(self):
pass

@abstractmethod
def eject_coin(self):
pass

@abstractmethod
def dispense(self):
pass

# Конкретные состояния
class NoCoinState(State):
def __init__(self, machine):
self.machine = machine

def insert_coin(self):
print("Coin inserted.")
self.machine.set_state(self.machine.has_coin_state)

def eject_coin(self):
print("No coin to eject.")

def dispense(self):
print("Insert coin first.")

class HasCoinState(State):
def __init__(self, machine):
self.machine = machine

def insert_coin(self):
print("Coin already inserted.")

def eject_coin(self):
print("Coin ejected.")
self.machine.set_state(self.machine.no_coin_state)

def dispense(self):
print("Dispensing product.")
self.machine.set_state(self.machine.no_coin_state)

# Контекст
class VendingMachine:
def __init__(self):
self.no_coin_state = NoCoinState(self)
self.has_coin_state = HasCoinState(self)
self.state = self.no_coin_state

def set_state(self, state: State):
self.state = state

def insert_coin(self):
self.state.insert_coin()

def eject_coin(self):
self.state.eject_coin()

def dispense(self):
self.state.dispense()

# Клиентский код
def main():
machine = VendingMachine()

machine.insert_coin() # Coin inserted.
machine.dispense() # Dispensing product.
machine.eject_coin() # No coin to eject.

machine.insert_coin() # Coin inserted.
machine.eject_coin() # Coin ejected.
machine.dispense() # Insert coin first.

if __name__ == "__main__":
main()


🚩Как это работает

🟠Интерфейс `State`
Определяет методы, которые должны реализовать все конкретные состояния.
🟠Конкретные состояния (`NoCoinState`, `HasCoinState`)
Реализуют интерфейс State и определяют поведение для каждого состояния.
🟠Класс `VendingMachine`
Содержит ссылки на все возможные состояния и метод для изменения текущего состояния. Делегирует вызовы методов текущему состоянию.
🟠Методы `insert_coin`, `eject_coin`, `dispense`
Вызываются клиентом и делегируются текущему состоянию.

Ставь 👍 и забирай 📚 Базу знаний

Python | Вопросы собесов

19 Oct, 16:10


🤔 Что такое генератор?

Генератор — это функция, которая возвращает итератор и использует ключевое слово `yield` для ленивого вычисления значений. Генераторы позволяют возвращать элементы по одному, сохраняя состояние функции между вызовами, что делает их идеальными для работы с большими наборами данных или потоками. В отличие от обычной функции, генератор не возвращает все значения сразу, а генерирует их по мере необходимости. Это помогает экономить память и ресурсы.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний

Python | Вопросы собесов

19 Oct, 09:10


🤔 Что такое Наблюдатель (Observer)?

Паттерн Наблюдатель (Observer) — это поведенческий паттерн проектирования, который определяет зависимость "один ко многим" между объектами, так что при изменении состояния одного объекта все зависящие от него объекты уведомляются и обновляются автоматически. Этот паттерн используется для реализации механизма подписки, когда объекты могут подписываться на события другого объекта и получать уведомления о любых изменениях.

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

🟠Разделение обязанностей:
Позволяет отделить объект, который изменяет свое состояние, от объектов, которые реагируют на эти изменения.
🟠Поддержка реактивного программирования:
Обеспечивает автоматическое уведомление и обновление зависимых объектов при изменении состояния наблюдаемого объекта.
🟠Гибкость и расширяемость:
Легко добавлять или удалять наблюдателей без изменения кода наблюдаемого объекта.
Пример реализации
from abc import ABC, abstractmethod

class Observer(ABC):
@abstractmethod
def update(self, message: str):
pass

class ConcreteObserver(Observer):
def __init__(self, name: str):
self._name = name

def update(self, message: str):
print(f"{self._name} received message: {message}")

class Subject:
def __init__(self):
self._observers = []

def add_observer(self, observer: Observer):
self._observers.append(observer)

def remove_observer(self, observer: Observer):
self._observers.remove(observer)

def notify_observers(self, message: str):
for observer in self._observers:
observer.update(message)

# Клиентский код для использования паттерна Наблюдатель
def main():
subject = Subject()

observer1 = ConcreteObserver("Observer 1")
observer2 = ConcreteObserver("Observer 2")

subject.add_observer(observer1)
subject.add_observer(observer2)

subject.notify_observers("Event 1") # Observer 1 received message: Event 1
# Observer 2 received message: Event 1

subject.remove_observer(observer1)

subject.notify_observers("Event 2") # Observer 2 received message: Event 2

if __name__ == "__main__":
main()


1⃣`Observer`:
Объявляет метод update, который должны реализовать все конкретные наблюдатели.
2⃣`ConcreteObserver`:
Реализует интерфейс Observer и определяет, как наблюдатель должен реагировать на обновления.
3⃣`Subject`:
Содержит список наблюдателей и методы для добавления, удаления и уведомления наблюдателей.
4⃣`notify_observers`:
Вызывается при изменении состояния субъекта и уведомляет всех зарегистрированных наблюдателей.

Ставь 👍 и забирай 📚 Базу знаний

Python | Вопросы собесов

18 Oct, 16:10


🤔 Что такое декораторы?

Декораторы в Python — это функции, которые принимают другую функцию или метод в качестве аргумента и изменяют или расширяют её поведение. Они позволяют легко добавлять функциональность без изменения исходного кода функции. Декораторы применяются с помощью символа `@` перед определением функции. Это мощный механизм для рефакторинга, добавления логгирования, проверки прав доступа и других задач.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний

Python | Вопросы собесов

18 Oct, 09:10


🤔 Что такое хранитель (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`:
Восстанавливает предыдущее состояние редактора из истории.

Ставь 👍 и забирай 📚 Базу знаний

Python | Вопросы собесов

17 Oct, 16:10


🤔 Что такое SOLID?

SOLID — это пять принципов объектно-ориентированного программирования, которые помогают проектировать гибкие, расширяемые и поддерживаемые системы. Они включают в себя: Single Responsibility (одна ответственность), Open/Closed (открытость для расширения, закрытость для изменений), Liskov Substitution (замена по Лисков), Interface Segregation (разделение интерфейсов) и Dependency Inversion (инверсия зависимостей). Эти принципы улучшают архитектуру программного обеспечения и делают код более надежным.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний

Python | Вопросы собесов

17 Oct, 09:10


🤔 Что такое паттерн Фасад (Facade)?

Паттерн Фасад (Facade) — это структурный паттерн проектирования, который предоставляет упрощённый интерфейс к сложной системе классов, библиотеке или фреймворку. Основная цель паттерна — уменьшить сложность взаимодействия с системой, скрывая её внутренние детали и предоставляя более простой интерфейс для клиента.

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

Фасад помогает уменьшить сложность больших систем, делая их более понятными и удобными для использования. Он позволяет отделить клиентов системы от её сложных внутренних деталей, что облегчает поддержку и расширение системы.

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

Фасад создаётся как класс, который инкапсулирует взаимодействие с одной или несколькими подсистемами. Клиенты обращаются к этому фасаду, чтобы выполнять нужные действия, не вдаваясь в детали реализации этих действий.
# Подсистема 1
class CPU:
def freeze(self):
print("CPU freezing")

def jump(self, position):
print(f"CPU jumping to {position}")

def execute(self):
print("CPU executing")

# Подсистема 2
class Memory:
def load(self, position, data):
print(f"Memory loading {data} at {position}")

# Подсистема 3
class HardDrive:
def read(self, lba, size):
return f"Reading {size} bytes from LBA {lba}"

# Фасад
class ComputerFacade:
def __init__(self):
self.cpu = CPU()
self.memory = Memory()
self.hard_drive = HardDrive()

def start(self):
self.cpu.freeze()
self.memory.load("0x00", self.hard_drive.read("100", "1024"))
self.cpu.jump("0x00")
self.cpu.execute()

# Клиентский код
computer = ComputerFacade()
computer.start()


🚩Плюсы

Упрощение интерфейса: Снижает количество методов, с которыми нужно взаимодействовать клиенту.
Изоляция клиентов от подсистем: Клиенты не зависят от деталей реализации подсистем, что упрощает их модификацию и замену.
Снижение связности: Уменьшает зависимость между клиентами и сложными подсистемами.

🚩Минусы

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

Ставь 👍 и забирай 📚 Базу знаний

Python | Вопросы собесов

16 Oct, 16:10


🤔 В чем разница между итератором и генератором?

Итератор — это объект, который поддерживает метод `__iter__()` и `__next__()` и позволяет проходить по коллекции элементов. Генератор — это специальный вид итератора, который создается с помощью ключевого слова `yield` и позволяет лениво возвращать элементы по одному, сохраняя состояние между вызовами. Генераторы обычно используются для обработки больших данных, поскольку они не требуют загрузки всего набора данных в память. Итераторы, в свою очередь, могут быть созданы вручную с помощью классов.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний

Python | Вопросы собесов

16 Oct, 09:10


🤔 Что такое паттерн Компоновщик (Composite)?

Паттерн Компоновщик (Composite) — это структурный паттерн проектирования, который позволяет сгруппировать объекты в древовидную структуру для представления иерархии "часть-целое". Этот паттерн используется для работы с объектами как с единичными, так и с составными единицами, предоставляя единый интерфейс для работы с ними.

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

Основная цель паттерна Компоновщик — упростить работу с иерархическими структурами данных. Он позволяет клиенту обращаться с отдельными объектами и их группами единообразно, что делает код более гибким и упрощает его поддержку.

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

🟠Лист (Leaf):
это базовый элемент без подкомпонентов.
🟠Компоновщик (Composite):
это элемент, который может содержать другие компоненты, включая и листья, и другие компоновщики.
from abc import ABC, abstractmethod

# Абстрактный компонент
class Graphic(ABC):
@abstractmethod
def draw(self):
pass

# Лист
class Circle(Graphic):
def draw(self):
print("Drawing a Circle")

# Компоновщик
class CompositeGraphic(Graphic):
def __init__(self):
self.graphics = []

def add(self, graphic):
self.graphics.append(graphic)

def remove(self, graphic):
self.graphics.remove(graphic)

def draw(self):
for graphic in self.graphics:
graphic.draw()

# Клиентский код
circle1 = Circle()
circle2 = Circle()
composite = CompositeGraphic()
composite.add(circle1)
composite.add(circle2)

# Рисуем все элементы
composite.draw()


🚩Плюсы

Упрощение работы с иерархиями:
Легко обрабатывать как простые, так и составные объекты.
Расширяемость:
Можно легко добавлять новые типы компонентов.
Сложность:
Могут возникнуть сложности при управлении более сложными структурами.

Ставь 👍 и забирай 📚 Базу знаний