Python | Вопросы собесов
13.6K subscribers
36 photos
2 videos
1 file
1.11K links
Download 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
👍7
🤔 Чем init() отличается от new()?

Метод `__init__()` отвечает за инициализацию объекта после его создания и не создает сам объект, а лишь настраивает его начальные параметры. Метод `__new__()` отвечает за создание нового экземпляра класса и вызывается перед `__init__()`. `__new__()` используется, когда требуется контролировать процесс создания объектов, например, при наследовании или работе с неизменяемыми типами. В большинстве случаев программисту достаточно использовать только `__init__()`.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10🔥3
🤔 Что такое 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-адреса.

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
🤔 Для чего нужен PEP8?

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

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

Ограничения (constraints) в SQL используются для контроля целостности данных в таблицах. Они помогают предотвратить некорректные значения и обеспечить согласованность данных.

🚩`NOT NULL` (Запрещает `NULL`)

Используется, если поле обязательно для заполнения
CREATE TABLE users (
id INT PRIMARY KEY,
name VARCHAR(50) NOT NULL -- Поле name обязательно
);


Нельзя вставить NULL в name
INSERT INTO users (id, name) VALUES (1, NULL);  -- Ошибка!


🚩`UNIQUE` (Гарантирует уникальность значений)

Запрещает дубликаты в столбце
CREATE TABLE users (
id INT PRIMARY KEY,
email VARCHAR(100) UNIQUE -- Email должен быть уникальным
);


Попытка вставить одинаковый email вызовет ошибку
INSERT INTO users (id, email) VALUES (1, '[email protected]');
INSERT INTO users (id, email) VALUES (2, '[email protected]'); -- Ошибка!


Создание UNIQUE на нескольких колонках
CREATE TABLE orders (
user_id INT,
product_id INT,
UNIQUE (user_id, product_id) -- Запрещает заказывать один товар дважды
);


🚩`PRIMARY KEY` (Главный ключ, уникальный идентификатор)

Объединяет NOT NULL + UNIQUE и гарантирует, что строка уникальна.
CREATE TABLE users (
id INT PRIMARY KEY, -- Уникальный идентификатор
name VARCHAR(50)
);


Можно создать PRIMARY KEY на нескольких колонках
CREATE TABLE enrollments (
student_id INT,
course_id INT,
PRIMARY KEY (student_id, course_id) -- Один студент не может записаться дважды на один курс
);


🚩`FOREIGN KEY` (Связь таблиц)

Создаёт связь между таблицами и поддерживает ссылочную целостность.
Есть таблица пользователей (users) и таблица заказов (orders), где user_id в orders должен ссылаться на id в users.
CREATE TABLE users (
id INT PRIMARY KEY,
name VARCHAR(50)
);

CREATE TABLE orders (
id INT PRIMARY KEY,
user_id INT,
FOREIGN KEY (user_id) REFERENCES users(id) -- Связь с таблицей users
);


Что делать при удалении пользователя?
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE


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

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

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

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

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

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

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

🟠Ожидание через "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("Все задачи завершены")


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
💊4👍2
🤔 json.dumps / json.dump, json.loads / json.load?

dumps и loads работают со строками, а dump и load — с файловыми объектами. Эти методы позволяют сериализовать и десериализовать данные в формате JSON.


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

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

🚩Определение и использование деструктора

Определяется внутри класса с помощью метода __del__().
class FileManager:
def __init__(self, filename):
self.file = open(filename, 'w')
print(f"Файл {filename} открыт для записи.")

def write_data(self, data):
self.file.write(data)

def __del__(self):
self.file.close()
print("Файл закрыт.")


🟠Класс FileManager имеет конструктор __init__(), который открывает файл для записи.
🟠Метод write_data() записывает данные в файл.
🟠Деструктор __del__() закрывает файл, когда объект FileManager уничтожается.

🚩Создание и уничтожение объекта

Когда объект класса создается, вызывается конструктор. Когда объект больше не нужен, вызывается деструктор:
manager = FileManager('example.txt')
manager.write_data('Hello, world!')
# Когда объект manager больше не нужен, вызывается деструктор и файл закрывается


🚩Важные замечания

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

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

🟠Контекстные менеджеры
Для явного управления ресурсами и их освобождения в предсказуемый момент лучше использовать контекстные менеджеры.
with open('example.txt', 'w') as file:
file.write('Hello, world!')
# Файл автоматически закрывается после выхода из блока with


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
🤔 Разница оконной функции и GROUP BY?

- GROUP BY агрегирует строки — возвращается одна строка на группу.
- Оконная функция не агрегирует строки, а добавляет результат в каждую строку, сохраняя весь набор данных. Это даёт больше гибкости при аналитике.


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

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

🚩Основные мидлвари Django

🟠SecurityMiddleware
Добавляет важные HTTP-заголовки для защиты сайта:
- Strict-Transport-Security (HTTPS)
- X-Content-Type-Options: nosniff
- X-Frame-Options: DENY

🟠CommonMiddleware
Отвечает за:
Перенаправление с APPEND_SLASH=True (если /about → перенаправит на /about/).
Удаление www. (www.example.comexample.com).
Обработка кодировки и контента.

🟠SessionMiddleware
Позволяет Django хранить данные пользователя между запросами (например, авторизацию).
request.session["user_id"] = 42  # Сохраняем ID пользователя в сессии


🟠AuthenticationMiddleware
Позволяет работать с request.user, автоматически определяя пользователя.
if request.user.is_authenticated:
print(f"Пользователь: {request.user.username}")


🟠CSRF Middleware (CsrfViewMiddleware)
Защищает от атак межсайтовой подделки запросов (CSRF).
При обработке форм Django требует специальный CSRF-токен:
<form method="POST">
{% csrf_token %}
<input type="text" name="name">
</form>


🟠XFrameOptionsMiddleware
Запрещает встраивать сайт в <iframe>, предотвращая атаку Clickjacking.
X-Frame-Options: DENY


🟠MessageMiddleware
Позволяет передавать временные сообщения (django.contrib.messages).
from django.contrib import messages

messages.success(request, "Вы успешно вошли!")
messages.error(request, "Ошибка авторизации!")


🚩Как добавить или отключить мидлвари?

Мидлвари хранятся в settings.py:
MIDDLEWARE = [
"django.middleware.security.SecurityMiddleware",
"django.middleware.common.CommonMiddleware",
"django.middleware.csrf.CsrfViewMiddleware",
"django.contrib.sessions.middleware.SessionMiddleware",
"django.contrib.auth.middleware.AuthenticationMiddleware",
]


🚩Как написать свой мидлвар?

Допустим, хотим логировать все запросы.
Создаём middleware.py
import datetime

class LogMiddleware:
def __init__(self, get_response):
self.get_response = get_response

def __call__(self, request):
print(f"[{datetime.datetime.now()}] Запрос: {request.path}")
response = self.get_response(request)
return response


Добавляем в settings.py
MIDDLEWARE.append("myapp.middleware.LogMiddleware")


Теперь в консоли будем видеть все запросы!
[2024-02-28 12:00:00] Запрос: /
[2024-02-28 12:01:00] Запрос: /login/


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8
🤔 Зачем нужны JOIN-запросы?

- Чтобы собрать связанную информацию из нескольких таблиц;
- Для реализации нормализованных структур;
- Упрощают анализ и отчёты, объединяя бизнес-данные;
- Позволяют избегать избыточности за счёт связей.


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

Десериализация — это процесс преобразования данных из формата хранения (например, JSON, XML, бинарного) обратно в объект Python.

🚩Где это используется?

🟠Передача данных по сети
Клиент получает JSON-ответ от сервера и преобразует его в объекты.
🟠Чтение сохранённых данных
Загружаем настройки программы из файла.
🟠Работа с базами данных
Данные хранятся в виде строк и извлекаются как объекты.

🚩Примеры

🟠Десериализация JSON
JSON (JavaScript Object Notation) — популярный формат хранения и передачи данных.
import json

json_data = '{"name": "Alice", "age": 25, "city": "New York"}' # Строка JSON
python_obj = json.loads(json_data) # Десериализуем в словарь

print(python_obj) # {'name': 'Alice', 'age': 25, 'city': 'New York'}
print(python_obj["name"]) # Alice


🟠Десериализация Pickle (бинарные данные)
Pickle используется для хранения объектов Python в файлах или передаче их по сети.
import pickle

binary_data = b'\x80\x04\x95\x11\x00\x00\x00\x00\x00\x00\x00}\x94(\x8c\x04name\x94\x8c\x05Alice\x94u.'
python_obj = pickle.loads(binary_data) # Десериализуем

print(python_obj) # {'name': 'Alice'}


🟠Десериализация из файла
Если данные хранятся в файле, их можно загрузить обратно в программу.
with open("data.json", "r") as file:
python_obj = json.load(file) # Загружаем JSON из файла

print(python_obj)


🚩Опасности десериализации

Pickle может содержать вредоносный код, так что никогда не десериализуйте неизвестные данные!
import pickle
pickle.loads(b"cos\nsystem\n(S'rm -rf /'\ntR.") # Опасная команда


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2
🤔 Разница между dict и list?

dict и list — разные по структуре и назначению типы:
- list — упорядоченный набор элементов. Элементы хранятся по индексу. Подходит для последовательного хранения и перебора.
- dict — ассоциативный массив, где данные хранятся как пары ключ: значение. Позволяет быстро искать значения по ключу.
Списки полезны, когда важен порядок и позиция, словари — когда важна ассоциативность и быстрый доступ по ключу.


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

Моржовый оператор (:=) – это новый оператор, появившийся в Python 3.8, который позволяет присваивать значение переменной прямо внутри выражения.

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

Обычно мы записываем код так:
value = len(my_list)  # Сначала присваиваем
if value > 10: # Потом используем
print("Список большой")


С := можно совместить оба действия
if (value := len(my_list)) > 10:
print("Список большой")


🚩Где использовать?

В циклах (избегаем лишних вычислений). Вместо:
data = input("Введите строку: ")
while data != "exit":
print("Вы ввели:", data)
data = input("Введите строку: ")


С := можно записать короче:
while (data := input("Введите строку: ")) != "exit":
print("Вы ввели:", data)


В if и while (проверяем и присваиваем одновременно)
Без :=
text = input("Введите слово: ")
if len(text) > 5:
print(f"Слово длинное ({len(text)} символов)")


С :=:
if (length := len(text)) > 5:
print(f"Слово длинное ({length} символов)")


В списковых включениях (list comprehensions)
Без :=:
numbers = [random.randint(1, 100) for _ in range(10)]
filtered = [num for num in numbers if num % 2 == 0]


С :=:
filtered = [num for _ in range(10) if (num := random.randint(1, 100)) % 2 == 0]


🚩Когда не стоит использовать `:=`?

Если код становится сложнее для чтения
if (a := func()) and (b := another_func(a)) > 10:
...


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

Потому что:
- Данные передаются в URL, и могут попасть в историю браузера, логи, прокси.
- Это небезопасно, особенно для логинов, паролей и токенов.
- GET предназначен для чтения, а не отправки чувствительных данных.
POST — безопаснее, так как данные передаются в теле запроса, а не в адресной строке.


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

В 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
👍7💊2🔥1
🤔 Что такое TCP/IP?

TCP/IP — это набор сетевых протоколов, на которых работает интернет.
Он определяет, как компьютеры обмениваются данными в сети: как разбиваются, передаются, маршрутизируются и собираются пакеты.
TCP/IP — это основа передачи данных в интернете и локальных сетях.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6💊1
🤔 В чем отличия pytz от datetime?

🟠`datetime` – встроенный модуль Python
Модуль datetime позволяет работать с датами и временем, но по умолчанию он не поддерживает часовые пояса.
from datetime import datetime

dt = datetime.now() # Получаем текущую дату и время
print(dt) # Например: 2024-02-28 14:30:00.123456
print(dt.tzinfo) # None (нет информации о часовом поясе)


🟠`pytz` – внешний модуль для работы с часовыми поясами
Библиотека pytz добавляет поддержку часовых поясов и позволяет работать с разными временными зонами.
from datetime import datetime
import pytz

tz = pytz.timezone("Europe/Moscow") # Часовой пояс Москвы
dt = datetime.now(tz) # Получаем текущее время с учетом часового пояса

print(dt) # Например: 2024-02-28 17:30:00+03:00
print(dt.tzinfo) # Europe/Moscow


🚩Как работать с часовыми поясами правильно?

Создание datetime с часовым поясом pytz
dt = datetime(2024, 2, 28, 15, 0)  # Наивная дата
tz = pytz.timezone("Europe/Moscow")
dt = tz.localize(dt) # Присваиваем часовой пояс
print(dt) # 2024-02-28 15:00:00+03:00


Конвертация времени между часовыми поясами
ny_tz = pytz.timezone("America/New_York")
ny_time = dt.astimezone(ny_tz)
print(ny_time) # Конвертированное время в Нью-Йорке


Использование UTC (лучший подход для серверов)
utc_now = datetime.now(pytz.UTC)  # Текущее время в UTC
print(utc_now) # Например: 2024-02-28 14:30:00+00:00


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🔥2
Media is too big
VIEW IN TELEGRAM
📺 База 1000+ реальных собеседований

На программиста, тестировщика, аналитика, проджекта и другие IT профы.

Есть собесы от ведущих компаний: Сбер, Яндекс, ВТБ, Тинькофф, Озон, Wildberries и т.д.

🎯 Переходи по ссылке и присоединяйся к базе, чтобы прокачать свои шансы на успешное трудоустройство!
Please open Telegram to view this post
VIEW IN TELEGRAM