Python | Вопросы собесов – Telegram
Python | Вопросы собесов
13.6K subscribers
36 photos
3 videos
1 file
1.18K links
Cайт: easyoffer.ru
Реклама: @easyoffer_adv
ВП: @easyoffer_vp

Тесты t.me/+20tRfhrwPpM4NDQy
Задачи t.me/+nsl4meWmhfQwNDVi
Вакансии t.me/+cXGKkrOY2-w3ZTky
Download Telegram
🤔 Что знаешь о идемпотентности?

Идемпотентность — это свойство операции, при котором повторное выполнение приводит к тому же результату, что и первое.

🚩Зачем нужна идемпотентность?

🟠Надёжности
если операция выполнится повторно (из-за ошибки сети), она не приведёт к неожиданному результату.
🟠Безопасности
позволяет избежать дублирования данных или неожиданных изменений.
🟠API и HTTP-запросов
гарантирует, что повторные вызовы API не создадут дубликатов.

🚩Идемпотентность в HTTP (REST API)
В веб-разработке идемпотентность важна для API-запросов, чтобы случайные повторные вызовы не привели к непредсказуемым последствиям.
Этот запрос идемпотентен — если отправить его 10 раз, пользователь "Alice" останется тем же.
POST /users { "name": "Alice" }


🚩Идемпотентность в базах данных

В SQL запросы SELECT и DELETE часто идемпотентны, а INSERT — нет.
DELETE FROM users WHERE id = 5;


Этот запрос идемпотентен — удаление пользователя с ID = 5 несколько раз не изменит систему (если он уже удалён).
INSERT INTO users (name) VALUES ('Alice');


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍1
🤔 Какие есть 6 этапов разработки продукта?

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

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🔥7
🤔 В чем отличие асинхронности, threading'га и мультипроцессинга?

Асинхронность, threading и мультипроцессинг - это три различных подхода к параллельному выполнению задач каждый из которых имеет свои особенности и применения:

🚩Асинхронность (Asynchronous)

Асинхронность предполагает выполнение задач без ожидания их завершения. Используется для работы с вводом-выводом (I/O), таким как чтение или запись файлов, сетевые запросы и т. д. В асинхронном коде задачи не блокируют основной поток выполнения, что позволяет эффективно использовать ресурсы процессора. Примеры асинхронных моделей включают в себя асинхронные функции и ключевые слова в Python (например, async, await).

🚩Потоки (Threading)

Потоки позволяют выполнять несколько частей кода (потоков) параллельно в пределах одного процесса. Используются для выполнения многозадачных операций, которые могут быть распределены между несколькими ядрами процессора. Потоки могут выполняться параллельно, но могут также конкурировать за общие ресурсы, что может привести к проблемам синхронизации и безопасности. В некоторых языках, таких как Python, использование потоков ограничено из-за GIL (Global Interpreter Lock), что может снижать эффективность при использовании множества потоков для CPU-интенсивных задач.

🚩Мультипроцессинг (Multiprocessing)

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

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍82
🤔 В чем разница между хешированием и шифрованием?

Это необратимое преобразование данных для их идентификации, тогда как шифрование предполагает обратимое преобразование для защиты данных. Хеширование используется для проверки целостности, а шифрование — для конфиденциальности.

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

В pip можно скачать определённую версию библиотеки с помощью оператора ==
pip install имя_библиотеки==версия


🚩Примеры

Установка конкретной версии
pip install numpy==1.21.0


Обновление до последней версии в пределах конкретного диапазона
pip install requests>=2.25,<3.0


Проверка доступных версий перед установкой
pip install имя_библиотеки==


Например
pip install pandas==


Установка из файла requirements.txt
Если нужно установить несколько библиотек с конкретными версиями, можно создать requirements.txt
numpy==1.21.0
requests>=2.25,<3.0
pandas==1.3.0


И выполнить команду
pip install -r requirements.txt


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍19
Forwarded from easyoffer
💡 В EasyOffer 2.0 появится фильтрация вопросов по грейдам и типам интервью!

📊 Например, вот вероятности ТОП-30 вопросов, которые задают на HR-скрининге Python-разработчику уровня Middle/Senior. Данные основаны на 53 реальных интервью.

97% Какие у тебя зарплатные ожидания
73% Какие у тебя есть вопросы
44% Какие критерии при выборе будущей работы
41% Расскажи о себе
38% Почему ищешь работу
35% Расскажи про свой опыт
35% Расскажи про проект на предыдущей работе
32% Почему уволился с предыдущей работы
29% Где территориально сейчас живешь/находишься
23% Есть ли другие предложения по работе
17% Есть ли военный билет
17% Почему хочешь сменить работу
17% Как проводишь свободное время
17% Расскажи про задачи на предыдущей работе
17% Сколько коммерческого опыта работы с Python
17% С какими БД работал
14% Находишься ли в активном поиске работы
14% С каким стеком работаешь
14% Почему решил откликнуться на нашу вакансию
14% Какой текущий статус поиска работы
11% Почему решил стать программистом
11% С какими фреймворками работал
11% Какую зарплату получал на предыдущей работе
11% Работаешь ли в настоящий момент
11% На какой грейд себя оцениваешь
11% Как быстро можешь приступить к работе после получения офера
11% Расскажи про свои pet-проекты
8% Какие знаешь типы данных в Python
8% Что такое декоратор в Python
8% Что ищешь на новой работе

🚀 Скоро стартует краудфандинговая кампания, которая поможет ускорить разработку EasyOffer 2.0.
Первые спонсоры получат уникальные лимитированные награды!

📢 Если вам это интересно, подписывайтесь на канал 👉 этот телеграм канал
🤔 Какие критерии кода в процедурном стиле можно назвать хорошими, а какие плохими?

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


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

Чтобы реализовать метод __new__ для создания класса по шаблону Singleton, нужно следовать принципам, которые обеспечивают создание только одного экземпляра класса. Метод new отвечает за создание нового экземпляра класса, и его можно использовать для контроля этого процесса. Ниже приведен пример реализации Singleton с использованием метода new.
class Singleton:
_instance = None

def __new__(cls, *args, **kwargs):
if cls._instance is None:
cls._instance = super(Singleton, cls).__new__(cls, args, kwargs)
return cls._instance

def __init__(self, value):
if not hasattr(self, 'initialized'):
self.value = value
self.initialized = True

# Проверка работы Singleton
singleton1 = Singleton(10)
singleton2 = Singleton(20)

print(singleton1 is singleton2) # Выведет: True
print(singleton1.value) # Выведет: 10
print(singleton2.value) # Выведет: 10


🚩Объяснение кода

Атрибут _instance
cls._instance используется для хранения единственного экземпляра класса.
Метод
e):      


🚩Метод init

Метод init выполняет инициализацию экземпляра.
Чтобы избежать повторной инициализации, проверяется наличие атрибута initialized. Если он не существует, происходит инициализация атрибутов и устанавливается initialized = True.

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

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

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

GET — это HTTP-метод, который используется для запроса данных с сервера.
Когда ты открываешь веб-сайт или вводишь URL в браузере — это GET-запрос. Браузер запрашивает страницу у сервера, и сервер возвращает данные.

🚩Как работает GET-запрос?

1⃣Клиент (браузер, программа) отправляет GET-запрос на сервер.
2⃣Сервер обрабатывает запрос и возвращает ответ (HTML-страницу, JSON-данные, картинку и т. д.).
3⃣Данные отображаются пользователю.

🚩Пример GET-запроса

Когда ты заходишь на https://example.com/users, браузер отправляет:
GET /users HTTP/1.1
Host: example.com


Ответ сервера
[
{"id": 1, "name": "Alice"},
{"id": 2, "name": "Bob"}
]


🚩Особенности GET-запроса

🟠Читаемый URL
параметры передаются в строке запроса (например, ?id=123).
🟠Безопасен
GET не изменяет данные на сервере.
🟠Можно кэшировать
браузеры и серверы могут сохранять результаты GET-запросов.
🟠Ограниченная длина URL
слишком длинные запросы могут не работать.
🟠Не подходит для конфиденциальных данных
передача пароля в URL (?password=123) небезопасна.

🚩GET-запрос с параметрами

Если нужно передать параметры, они добавляются в URL:
GET /search?q=python&page=2


В Python можно отправить GET-запрос с помощью библиотеки requests
import requests

response = requests.get("https://api.example.com/users", params={"id": 123})
print(response.json()) # Получаем ответ в JSON


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

Бэкенд-разработчик должен разбираться в API, базах данных, серверных фреймворках, структурах данных, алгоритмах, принципах безопасности и DevOps-инструментах.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
😁11💊7👍3🤯21
🤔 Что такое блокировки (локи) в БД?

Блокировка (lock) — это механизм, который предотвращает одновременный доступ к данным разными транзакциями, чтобы избежать конфликтов, повреждения данных или "гонки" процессов.
Представь, что два человека редактируют один и тот же документ. Если они начнут менять его одновременно, файл может испортиться. Блокировки в БД работают так же — если один процесс изменяет данные, другой должен подождать, пока первый закончит.

🚩Почему нужны блокировки?

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

🚩Виды блокировок в БД

🟠По уровню охвата данных
Строчная (Row Lock) – блокирует только одну строку таблицы.
Табличная (Table Lock) – блокирует всю таблицу целиком.
Блокировка всей базы (Database Lock) – редко используется, но блокирует всю БД.
BEGIN;
SELECT * FROM users WHERE id = 1 FOR UPDATE; -- Блокирует строку, пока транзакция не завершится


🟠По типу блокировки
Эксклюзивная (Exclusive, X-Lock) – блокирует запись для всех (никакие другие операции её не изменят).
Разделяемая (Shared, S-Lock) – блокирует только на запись (чтение возможно).
BEGIN;
UPDATE users SET balance = balance - 100 WHERE id = 1;
-- Пока транзакция не завершится, другая транзакция не сможет изменить balance пользователя 1.


🟠Явные и неявные блокировки
Явные (ручные) – задаются программистом (SELECT ... FOR UPDATE).
Неявные (автоматические) – создаются СУБД при INSERT, UPDATE, DELETE.

🚩Проблемы с блокировками

🟠Deadlock (взаимная блокировка)
Если два запроса ждут друг друга, система "зависает". Решение: правильный порядок выполнения транзакций.

🟠Долгие блокировки
Если транзакция не закрывается (COMMIT/ROLLBACK), другие запросы ждут бесконечно. Решение: короткие транзакции, автоматическое завершение.

🟠Снижение производительности
Чем больше блокировок, тем медленнее работа БД.

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

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

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

Разбить список (list) можно разными способами в зависимости от задачи:
На части фиксированной длины
На N частей
По условию

🚩Разбить список на части фиксированного размера

Если нужно разделить список на подсписки длиной n, можно использовать list comprehension
def split_list(lst, size):
return [lst[i:i + size] for i in range(0, len(lst), size)]

data = [1, 2, 3, 4, 5, 6, 7, 8, 9]
print(split_list(data, 3))


Вывод
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]


🚩Разбить список на N частей (равных или почти равных)

Если нужно разделить список на N частей, можно использовать numpy или itertools
import numpy as np

def split_into_n_parts(lst, n):
return np.array_split(lst, n)

data = [1, 2, 3, 4, 5, 6, 7, 8, 9]
print(split_into_n_parts(data, 4))


Вывод
[array([1, 2, 3]), array([4, 5]), array([6, 7]), array([8, 9])]


🚩Разбить список по условию

Если нужно разделить список по какому-то критерию, например, на чётные и нечётные числа
data = [1, 2, 3, 4, 5, 6, 7, 8, 9]

even = [x for x in data if x % 2 == 0]
odd = [x for x in data if x % 2 != 0]

print(even, odd)


Вывод
[2, 4, 6, 8] [1, 3, 5, 7, 9]


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12💊2😁1
🤔 Как понять, когда нужно избавляться от дублирования?

Избавляться от дублирования стоит, если оно приводит к сложностям в поддержке, увеличению ошибок или нарушению принципа DRY. Однако если это уменьшает ясность, дублирование допустимо.


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

В Python можно создать класс двумя основными способами:
Через class (обычный способ)
Через type() (динамическое создание класса)

🚩Обычное создание класса через `class`

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

def say_hello(self):
return f"Привет, я {self.name}!"

p = Person("Алиса")
print(p.say_hello()) # Привет, я Алиса!


🚩Динамическое создание класса через `type()`

Функция type() позволяет создать класс "на лету".
Person = type("Person", (object,), {
"__init__": lambda self, name: setattr(self, "name", name),
"say_hello": lambda self: f"Привет, я {self.name}!"
})

p = Person("Боб")
print(p.say_hello()) # Привет, я Боб!


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

Баланс достигается через минимизацию сложности (KISS), но не за счёт повторяющегося кода (DRY). Это требует анализа контекста и компромиссов.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
😁9💊4👍1🔥1
🤔 Для чего нужен счетчик ссылок Python?

В Python счетчик ссылок (reference count) используется для управления памятью. Он показывает, сколько раз объект используется в программе. Когда счетчик ссылок падает до нуля, Python автоматически удаляет объект, освобождая память.

🚩Как работает счетчик ссылок?

Python использует автоматическое управление памятью, основанное на подсчёте ссылок. Когда создаётся объект, Python хранит специальное число — количество ссылок на этот объект. Это число увеличивается, когда мы создаём новую ссылку на объект, и уменьшается, когда удаляем или перезаписываем переменную.
import sys

a = [1, 2, 3] # Создаём список
print(sys.getrefcount(a)) # Выведет 2 (одна ссылка 'a' + вызов getrefcount)

b = a # Новая ссылка на тот же объект
print(sys.getrefcount(a)) # Теперь 3 (a, b и сам getrefcount)

del a # Удаляем одну ссылку
print(sys.getrefcount(b)) # Теперь 2

del b # Удаляем последнюю ссылку, объект будет удалён из памяти


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

🟠Эффективное управление памятью
Python сам удаляет ненужные объекты, не давая памяти переполняться.
🟠Понимание утечек памяти
Если объект имеет циклические ссылки (например, список ссылается сам на себя), Python не может освободить его сразу, поэтому дополнительно используется сборщик мусора (Garbage Collector, GC).
import gc

class Node:
def __init__(self):
self.ref = self # Циклическая ссылка!

n = Node()
del n # Обычный подсчёт ссылок не сработает, объект останется в памяти
gc.collect() # Явный вызов сборщика мусора удалит его


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍81
🤔 Когда нужно написать плохой код?

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

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

Клиент-серверная архитектура – это модель взаимодействия устройств, где клиент запрашивает данные или услуги, а сервер их предоставляет.

🚩Как это работает?

Клиент – это программа или устройство, которое отправляет запросы (например, браузер).
Сервер – это программа или устройство, которое обрабатывает запросы и отправляет ответ (например, веб-сервер).

Сервер (сервер.py)
import socket

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(("localhost", 8080)) # Привязываем сервер к адресу и порту
server.listen(1) # Ожидаем подключения одного клиента
print("Сервер запущен и ждёт подключения...")

conn, addr = server.accept() # Принимаем подключение
print(f"Подключен клиент: {addr}")

data = conn.recv(1024).decode() # Читаем данные от клиента
print(f"Клиент прислал: {data}")

conn.send("Привет от сервера!".encode()) # Отправляем ответ клиенту
conn.close()


Клиент (клиент.py)
import socket

client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(("localhost", 8080)) # Подключаемся к серверу

client.send("Привет, сервер!".encode()) # Отправляем сообщение
response = client.recv(1024).decode() # Получаем ответ от сервера

print(f"Ответ сервера: {response}")
client.close()


🚩Как это работает?

1⃣Запускаем сервер.py. Он ждёт подключения.
2⃣Запускаем клиент.py. Клиент подключается к серверу и отправляет сообщение.
3⃣Сервер получает сообщение, отвечает клиенту и закрывает соединение.
4⃣Клиент принимает ответ и завершает работу.

🚩Типы клиент-серверных архитектур

Одноуровневая – клиент общается напрямую с сервером.
Двухуровневая – классическая схема "клиент сервер" (например, браузер веб-сервер).
Трёхуровневая – добавляется база данных (например, клиент сервер БД).
Многоуровневая – сложные распределённые системы с несколькими серверами (например, микросервисы).

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

Это процесс изменения структуры базы данных. Для ее создания используется команда makemigrations, а для применения — migrate. Это позволяет добавлять, изменять или удалять таблицы и поля без потери данных.


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