Python | Вопросы собесов
13.9K subscribers
14 photos
1 file
620 links
Cайт: easyoffer.ru
Реклама: @easyoffer_adv
ВП: @easyoffer_vp

Тесты t.me/+20tRfhrwPpM4NDQy
Задачи t.me/+nsl4meWmhfQwNDVi
Вакансии t.me/+cXGKkrOY2-w3ZTky
Download Telegram
🤔 Как на уровне Python реализован декоратор?

В Python декораторы — это функции, которые оборачивают другие функции. Они добавляют или изменяют поведение функции без изменения её кода.

🟠Реализация простого декоратора вручную
Простейший декоратор, который добавляет текст перед выполнением функции
def my_decorator(func):  
def wrapper():
print("Декоратор сработал!")
return func() # Вызываем исходную функцию
return wrapper # Возвращаем обёрнутую функцию

def say_hello():
print("Hello!")

say_hello = my_decorator(say_hello) # Оборачиваем вручную
say_hello()


Вывод
Декоратор сработал!
Hello!


🟠Реализация декоратора через `@`
Python позволяет упрощённый синтаксис через @
def my_decorator(func):
def wrapper():
print("Декоратор сработал!")
return func()
return wrapper

@my_decorator # Эквивалентно say_hello = my_decorator(say_hello)
def say_hello():
print("Hello!")

say_hello()


🟠Декоратор с `args` и `kwargs` (универсальный вариант)
Если функция принимает аргументы, их нужно передавать через args и kwargs
def my_decorator(func):
def wrapper(*args, **kwargs): # Поддержка любых аргументов
print(f"Вызываем {func.__name__} с аргументами: {args}, {kwargs}")
return func(*args, **kwargs) # Вызываем оригинальную функцию
return wrapper

@my_decorator
def greet(name):
print(f"Привет, {name}!")

greet("Alice")


Вывод
Вызываем greet с аргументами: ('Alice',), {}
Привет, Alice!


🟠Декоратор с параметрами (фабрика декораторов)
Чтобы передавать параметры в декоратор, создаём функцию, которая возвращает декоратор
def repeat(times):  # Функция с параметром
def decorator(func):
def wrapper(*args, **kwargs):
for _ in range(times): # Повторяем вызов функции
func(*args, **kwargs)
return wrapper
return decorator # Возвращаем декоратор

@repeat(3) # Передаём 3 → `repeat(3)` вернёт `decorator`
def hello():
print("Hello!")

hello()


Вывод
Hello!
Hello!
Hello!


🟠Декораторы классов (`functools.wraps`)
Обычные декораторы ломают метаданные функции (__name__, __doc__).
import functools

def my_decorator(func):
@functools.wraps(func) # Сохраняем метаданные
def wrapper(*args, **kwargs):
print("Декоратор сработал!")
return func(*args, **kwargs)
return wrapper

@my_decorator
def greet():
"""Функция приветствия"""
print("Hello!")

print(greet.__name__) # greet (без wraps было бы wrapper)
print(greet.__doc__) # Функция приветствия


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from easyoffer
🎉 Краудфандинг easyoffer 2.0 стартовал!

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

🚀 PRO-тариф на 1 год, по цене месячной подписки на релизе.
Доступ к закрытому бета-тесту easyoffer 2.0 (середина–конец мая)

Поддержать проект можно здесь:
https://planeta.ru/campaigns/easyoffer

📌 Если не получается оплатить через карту РФ — напишите мне @kivaiko, и мы найдём удобный способ
Forwarded from easyoffer
Я поставил целью сбора скромные 300 тыс. рублей, но ребята, вы накидали больше млн. всего за 1 день. Это просто невероятно!

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

Краудфандинг будет продолжаться еще 31 день и все кто поддержать проект сейчас, до его выхода, смогут получить:

🚀 PRO-тариф на 1 год, по цене месячной подписки на релизе.
Доступ к закрытому бета-тесту easyoffer 2.0 (середина–конец мая)

Поддержать проект можно здесь:
https://planeta.ru/campaigns/easyoffer

Огромное спасибо за вашу поддержку! 🤝
🤔 В чем суть принципа REST?

REST (Representational State Transfer) — это архитектурный стиль для разработки веб-сервисов, который использует стандартные методы HTTP для взаимодействия между клиентом и сервером. В REST каждая операция выполняется с использованием определённого HTTP-метода: GET для получения данных, POST для создания, PUT для обновления и DELETE для удаления. RESTful API использует унифицированные ресурсы и URL для представления данных, а также статeless-коммуникацию между клиентом и сервером. Основной принцип REST — это простота и масштабируемость.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Что такое конструктор класса ?

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

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

Называется __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;
}


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Что такое класс BaseView?

Это базовый класс для создания представлений. Django предлагает два типа представлений:
- Функциональные (function-based views, FBV)
- Классовые (class-based views, CBV)


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Как в питоне реализуется многопоточность. Какими модулями?

Многопоточность в Python реализуется с помощью модуля threading, но из-за GIL (Global Interpreter Lock) потоки не могут выполняться параллельно на нескольких ядрах.

🟠Модуль `threading` (многопоточность, но с GIL)
Модуль threading позволяет запускать несколько потоков (threads) в одном процессе.
import threading
import time

def task(name):
print(f"{name} начал работу")
time.sleep(2) # Имитация задержки
print(f"{name} завершил работу")

# Создаём два потока
t1 = threading.Thread(target=task, args=("Поток 1",))
t2 = threading.Thread(target=task, args=("Поток 2",))

t1.start()
t2.start()

t1.join()
t2.join()
print("Все потоки завершены")


Вывод
Поток 1 начал работу
Поток 2 начал работу
(пауза 2 секунды)
Поток 1 завершил работу
Поток 2 завершил работу
Все потоки завершены


🟠Модуль `multiprocessing` (настоящая параллельность)
В отличие от threading, модуль multiprocessing создаёт отдельные процессы, которые могут выполняться на разных ядрах процессора.
import multiprocessing
import time

def task(name):
print(f"{name} начал работу")
time.sleep(2)
print(f"{name} завершил работу")

if __name__ == "__main__":
p1 = multiprocessing.Process(target=task, args=("Процесс 1",))
p2 = multiprocessing.Process(target=task, args=("Процесс 2",))

p1.start()
p2.start()

p1.join()
p2.join()
print("Все процессы завершены")


🟠Модуль `concurrent.futures` (более удобный API)
Этот модуль позволяет легко управлять потоками (ThreadPoolExecutor) и процессами (ProcessPoolExecutor).
from concurrent.futures import ThreadPoolExecutor
import time

def task(n):
time.sleep(2)
return f"Готово: {n}"

with ThreadPoolExecutor(max_workers=2) as executor:
results = executor.map(task, [1, 2, 3])

for result in results:
print(result)


Пример ProcessPoolExecutor (процессы)
from concurrent.futures import ProcessPoolExecutor

def square(n):
return n * n

with ProcessPoolExecutor() as executor:
results = executor.map(square, [1, 2, 3, 4])

print(list(results)) # [1, 4, 9, 16]


🟠Модуль `asyncio` (асинхронность, не потоки!)
Модуль asyncio не создаёт потоки или процессы, а работает через "корутины" и цикл событий (event loop).
import asyncio

async def task():
print("Начало")
await asyncio.sleep(2) # Не блокирует другие задачи
print("Конец")

async def main():
await asyncio.gather(task(), task())

asyncio.run(main())


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

Представления (views) можно реализовать двумя способами:
- Функциональные представления (FBV, Function-Based Views)
- Обычные Python-функции, принимающие request и возвращающие HttpResponse
- Просты в использовании, но плохо масштабируются
- Классовые представления (CBV, Class-Based Views)
- Основаны на views.View, позволяют переопределять get(), post()
- Поддерживают миксин-классы, упрощают повторное использование кода


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Как понять, какие виды тестов нужны именно сейчас?

Выбор типа тестирования зависит от целей, стадии разработки и текущих проблем. Чтобы определить, какие тесты нужны, стоит ответить на вопросы:

Что тестируем? (код, API, UI, производительность и т. д.)
Какие риски? (где может сломаться, критичность ошибки)
Какой этап разработки? (новый код, рефакторинг, релиз)

🚩Как определить нужные тесты прямо сейчас?

🟠Только написали новый код
Нужны: Юнит-тесты
Тестируем функции и классы отдельно.
def add(a, b):
return a + b

def test_add():
assert add(2, 3) == 5 # Юнит-тест


🟠Соединяем модули или работаем с API
Нужны: Интеграционные тесты
Проверяем работу всей системы вместе.
def test_api():
response = requests.get("https://api.example.com/data")
assert response.status_code == 200


🟠Перед релизом или деплоем
Нужны: Функциональные и регрессионные тесты
Проверяем ключевые сценарии и старый функционал.
def test_login():
assert login("user", "password") == "Success"


🟠Изменили UI (например, фронтенд на React)
Нужны: UI-тесты (Selenium, Playwright)
Проверяем нажатие кнопок, формы и отображение страниц.
from selenium import webdriver

driver = webdriver.Chrome()
driver.get("https://example.com")
assert "Example" in driver.title


🟠Если проект должен выдерживать большую нагрузку
Нужны: Нагрузочные тесты (Load Testing)
Используем locust, JMeter, k6, чтобы проверить сколько пользователей выдержит сервер.
from locust import HttpUser, task

class MyUser(HttpUser):
@task
def test_homepage(self):
self.client.get("/")


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Идущий к IT
Привет ребята, мне на easyoffer.ru нужен:

🐍 Middle/Senior Python Developer

Стек:
DRF, PostgreSQL, Redis, Celery, Docker, Sentry

Задачи:
🟠Разработка и поддержка REST API для новых фичей
🟠Интеграция с веб-сервисами и внешними API
🟠Подключение и поддержка платежных систем
🟠Написание юнит- и интеграционных тестов
🟠Оптимизация производительности и масштабирование
🟠Взаимодействие с ML-моделями — будет плюсом

Ожидания:
🟠2+ лет опыта DRF
🟠Опыт интеграций платежных систем
🟠Опыт работы с PostgreSQL, Celery, Redis, Docker
🟠Умение проектировать архитектуру REST-API
🟠Ответственный подход к качеству кода и тестированию

Опыт в стартапах и небольших командах будет плюсом

Условия:
– Частичная занятость (2-3 часа в день)
– Удаленная работа
– Свободный график
– Почасовая оплата

Если вас заинтересовала вакансия, напишите мне @kivaiko
1. Резюме
2. Ссылку на github
3. Комфортную ставку за час
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Что может быть ключем в словаре?

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


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Как работает функция filter()?

filter() — это встроенная функция Python, которая отбирает элементы из последовательности по заданному условию.
filter(function, iterable)


🚩Как работает `filter()`?

Пример 1: Фильтрация чётных чисел
numbers = [1, 2, 3, 4, 5, 6]

# Оставляем только чётные числа
even_numbers = filter(lambda x: x % 2 == 0, numbers)

print(list(even_numbers)) # [2, 4, 6]


Пример 2: Фильтрация строк по длине
words = ["apple", "kiwi", "banana", "cherry"]

# Оставляем только слова длиной больше 5 символов
long_words = filter(lambda word: len(word) > 5, words)

print(list(long_words)) # ['banana', 'cherry']


Пример 3: Фильтрация None и пустых значений
values = [None, 0, "", "hello", 42, [], {}]

# Оставляем только "истинные" значения
filtered_values = filter(None, values)

print(list(filtered_values)) # ['hello', 42]


Пример 4: Использование filter() с def
def is_positive(n):
return n > 0

numbers = [-5, -2, 0, 3, 7, -1]
positive_numbers = filter(is_positive, numbers)

print(list(positive_numbers)) # [3, 7]


🚩Чем `filter()` лучше `for` + `if`?

Более короткий и читаемый код
# С `filter()`
even_numbers = list(filter(lambda x: x % 2 == 0, numbers))

# С `for` + `if`
even_numbers = [x for x in numbers if x % 2 == 0]


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Что такое dunder методы?

Это специальные методы, обрамлённые двойными подчёркиваниями.
1. Пример: init, str, add.
2. Они позволяют изменять поведение встроенных операций, таких как создание объектов или арифметика.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Как проверить, что значение есть в словаре в Python?

В Python можно проверять наличие ключа или значения в словаре разными способами.

🟠Проверка наличия ключа (`in`)
Самый быстрый и правильный способ — проверять ключи (keys), так как доступ к ним O(1).
data = {"name": "Alice", "age": 25, "city": "New York"}

# Проверяем, есть ли ключ "age"
if "age" in data:
print("Ключ найден!")


Вывод
Ключ найден!


Не надо проверять так
if data.get("age") is not None:  #  Работает, но `in` быстрее


🟠Проверка наличия значения (`in values()`)
Если нужно проверить значение, используем values()
if 25 in data.values():
print("Значение найдено!")


Вывод
Значение найдено!


🟠Проверка и ключа, и значения (`items()`)
Если нужно проверить пару (ключ, значение)
if ("age", 25) in data.items():
print("Пара (ключ, значение) найдена!")


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 I - Interface Segregation Principle - принцип разделения интерфейсов

Интерфейсы должны быть узкоспециализированными, чтобы классы не реализовывали лишние методы. Это делает интерфейсы проще в использовании и реализации.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Что такое пакет?

Пакет (package) в Python — это набор модулей, объединённых в одну директорию. Главное отличие от обычной папки — наличие файла __init__.py, который делает директорию пакетом.

🚩Как создать пакет?

Допустим, мы хотим создать пакет math_utils с модулями для работы с числами.
/my_project
/math_utils ← Это пакет
__init__.py ← Делаем директорию пакетом
arithmetic.py ← Модуль с функциями сложения/вычитания
geometry.py ← Модуль с функциями для работы с фигурами
main.py ← Основной файл программы


Код в arithmetic.py
def add(a, b):
return a + b

def subtract(a, b):
return a - b


Код в geometry.py
def square_area(side):
return side * side


Код в __init__.py
from .arithmetic import add, subtract
from .geometry import square_area


Теперь можно импортировать функции прямо из пакета:
from math_utils import add, square_area

print(add(2, 3)) # 5
print(square_area(4)) # 16


🚩Импорт модулей из пакета

Импортируем весь пакет (с __init__.py)
from math_utils import add, square_area


Импортируем конкретный модуль
from math_utils import arithmetic
print(arithmetic.add(3, 5))


Импортируем конкретную функцию из модуля
from math_utils.arithmetic import add
print(add(3, 5))


🚩Как работают пакеты в Python?

Python ищет пакеты по sys.path
import sys
print(sys.path) # Пути, где Python ищет модули


Если Python не находит пакет, можно добавить путь вручную:
import sys
sys.path.append("/path/to/my_project")


Можно создавать вложенные пакеты
/my_project
/math_utils
__init__.py
/advanced
__init__.py
calculus.py


Импорт:
from math_utils.advanced.calculus import derivative


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Какие типы HTTP запросов знаешь? В чем их отличия?

Типы: GET (получение данных), POST (отправка данных), PUT (обновление ресурса), DELETE (удаление ресурса), PATCH (частичное обновление). GET передаёт параметры в URL, а POST отправляет данные в теле запроса. PUT и DELETE изменяют состояние сервера, а PATCH обновляет только указанные части ресурса.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Как выбрать данные из двух таблиц без метода join()?

В SQL можно объединять данные из двух таблиц без использования JOIN, используя альтернативные методы.

🚩Использование подзапросов (`SELECT` внутри `SELECT`)

Подзапрос (subquery) позволяет выбрать данные из одной таблицы, используя данные из другой.
Допустим, у нас есть две таблицы:
employees (id, name, department_id)
departments (id, name)
SELECT name, 
(SELECT name FROM departments WHERE id = employees.department_id) AS department_name
FROM employees;


🚩Использование `IN` или `EXISTS`

Можно фильтровать данные из одной таблицы, проверяя наличие значений в другой.
SELECT name 
FROM employees
WHERE department_id IN (SELECT id FROM departments);


🚩Объединение данных через `UNION`
Если таблицы имеют схожие колонки, можно объединить их с UNION.
SELECT id, name, email FROM users_old
UNION
SELECT id, name, email FROM users_new;


🚩Использование `CROSS JOIN` через `WHERE`

Хотя CROSS JOIN делает декартово произведение, его можно фильтровать WHERE, имитируя INNER JOIN.
SELECT e.name, d.name AS department
FROM employees e, departments d
WHERE e.department_id = d.id;


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Какие магические методы и для чего используются?

Магические методы (например, __init__, __str__, __len__, __add__) используются для определения поведения объектов в специфичных ситуациях, таких как инициализация, строковое представление, арифметические операции или работа с коллекциями.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Идущий к IT
Привет ребята, мне на easyoffer.ru нужен:

🐍 Middle/Senior Python Developer

Стек:
DRF, PostgreSQL, Redis, Celery, Docker, Sentry

Задачи:
🟠Разработка и поддержка REST API для новых фичей
🟠Интеграция с веб-сервисами и внешними API
🟠Подключение и поддержка платежных систем
🟠Написание юнит- и интеграционных тестов
🟠Оптимизация производительности и масштабирование
🟠Взаимодействие с ML-моделями — будет плюсом

Ожидания:
🟠2+ лет опыта DRF
🟠Опыт интеграций платежных систем
🟠Опыт работы с PostgreSQL, Celery, Redis, Docker
🟠Умение проектировать архитектуру REST-API
🟠Ответственный подход к качеству кода и тестированию

Опыт в стартапах и небольших командах будет плюсом

Условия:
– Частичная занятость (2-3 часа в день)
– Удаленная работа
– Свободный график
– Почасовая оплата

Если вас заинтересовала вакансия, напишите мне @kivaiko
1. Резюме
2. Ссылку на github
3. Комфортную ставку за час
Please open Telegram to view this post
VIEW IN TELEGRAM