Python | Вопросы собесов
Сайт: https://easyoffer.ru/ Все каналы: t.me/+xGeAw6ckJ4liYzQy Контакт для рекламы: @sendme_ads
Показати більше📈 Аналітичний огляд Telegram-каналу Python | Вопросы собесов
Канал Python | Вопросы собесов (@python_easy_ru) у мовному сегменті Російська є активним учасником. На даний момент спільнота об'єднує 12 658 підписників, посідаючи 9 655 місце в категорії Технології та додатки та 50 689 місце у регіоні Росія.
📊 Показники аудиторії та динаміка
З моменту свого створення невідомо, проект продемонстрував стрімке зростання, зібравши аудиторію у 12 658 підписників.
За останніми даними від 09 жовтня, 2026, канал демонструє стабільну активність. Хоча за останні 30 днів спостерігається зміна кількості учасників на -94, а за останні 24 години на 0, загальне охоплення залишається високим.
- Статус верифікації: Не верифікований
- Рівень залученості (ER): Середній показник залученості аудиторії становить 6.02%. Протягом перших 24 годин після публікації контент зазвичай збирає 4.22% реакцій від загальної кількості підписників.
- Охоплення публікацій: В середньому кожен допис отримує 762 переглядів. Протягом першої доби публікація в середньому набирає 534 переглядів.
- Реакції та взаємодія: Аудиторія активно підтримує контент: середня кількість реакцій на один пост – 2.
- Тематичні інтереси: Контент зосереджений навколо ключових тем, таких як ставь, модуль, строка, docker, alice.
📝 Опис та контентна політика
Автор описує ресурс як майданчик для висловлення суб'єктивної думки:
“Сайт: https://easyoffer.ru/
Все каналы: t.me/+xGeAw6ckJ4liYzQy
Контакт для рекламы: @sendme_ads”
Завдяки високій частоті оновлень (останні дані отримано 10 жовтня, 2026), канал підтримує актуальність та високий рівень охоплення публікацій. Аналітика показує, що аудиторія активно взаємодіє з контентом, що робить його важливою точкою впливу в категорії Технології та додатки.
from flask import Flask, request, make_response
app = Flask(__name__)
@app.route('/set_cookie')
def set_cookie():
response = make_response("Cookie установлена!")
response.set_cookie('username', 'JohnDoe') # Устанавливаем куки с именем "username"
return response
@app.route('/get_cookie')
def get_cookie():
username = request.cookies.get('username') # Получаем значение куки
return f'Привет, {username}!' if username else 'Куки не найдены.'
if __name__ == '__main__':
app.run(debug=True)
🚩Типы куки
🟠Сессионные куки (Session Cookies)
Хранятся только во время работы браузера и удаляются после его закрытия.
🟠Постоянные куки (Persistent Cookies)
Сохраняются на устройстве пользователя до истечения срока действия.
🟠Безопасные куки (Secure Cookies)
Передаются только через HTTPS для обеспечения безопасности.
🟠HttpOnly куки
Не доступны через JavaScript, используются для защиты от XSS-атак.
🚩Плюсы и минусы
➕Помогают сохранять пользовательские данные для упрощения работы с сайтом.
➕Могут улучшить пользовательский опыт за счёт персонализации.
➖Могут использоваться для отслеживания активности (privacy concerns).
➖Неправильное управление куки может привести к утечкам данных.
Ставь 👍 и забирай 📚 Базу знанийБаза данных (company_db) ├── Схема: public (по умолчанию) │ ├── Таблица: employees │ ├── Таблица: departments ├── Схема: hr │ ├── Таблица: employees │ ├── Таблица: salaries ├── Схема: sales │ ├── Таблица: customers │ ├── Таблица: orders🚩Как создавать и использовать схемы? Создание схемы (
CREATE SCHEMA)
CREATE SCHEMA hr; -- Создаём схему "hr"
Создание таблицы внутри схемы
CREATE TABLE hr.employees (
id SERIAL PRIMARY KEY,
name VARCHAR(100),
position VARCHAR(50)
);
Выбор схемы по умолчанию
SET search_path TO hr;
🚩Где полезны схемы?
🟠Разделение данных по модулям
Если в БД хранятся разные области бизнеса (кадры, продажи, финансы), их можно разделить по схемам:
- hr.employees, hr.salaries
- sales.orders, sales.customers
🟠Разные версии одной БД
Например, в PostgreSQL можно создать схему dev для тестов:
- dev.users — тестовая версия таблицы
- prod.users — продакшен-версия
🟠Безопасность и доступ пользователей
Можно дать доступ к разным схемам разным пользователям:
GRANT USAGE ON SCHEMA hr TO hr_manager;
GRANT SELECT ON ALL TABLES IN SCHEMA hr TO hr_manager;
Ставь 👍 и забирай 📚 Базу знаний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())
Ставь 👍 и забирай 📚 Базу знанийmy_list = [1, "hello", 3.14]
print(my_list[1]) # "hello"
🟠Кортеж (Tuple)
Похож на список, но неизменяемый. Используется для данных, которые не должны быть изменены.
my_tuple = (10, 20, 30)
print(my_tuple[0]) # 10
🟠Множество (Set)
Неупорядоченная коллекция уникальных элементов. Удобно для работы с множествами (поиск пересечений, объединений и т.д.).
my_set = {1, 2, 3, 2}
print(my_set) # {1, 2, 3}
🟠Словарь (Dictionary)
Хранит пары ключ-значение. Очень эффективен для быстрого поиска данных по ключу.
my_dict = {"name": "Alice", "age": 25}
print(my_dict["name"]) # Alice
🚩Пользовательские структуры данных
Эти структуры создаются с помощью классов или других механизмов, доступных в Python. Они применяются для решения задач, которые не могут быть эффективно выполнены встроенными средствами.
🟠Стек (Stack)
Принцип работы: LIFO (последним пришел — первым ушел). Реализуется через список или collections.deque.
stack = []
stack.append(10) # Добавление
stack.append(20)
print(stack.pop()) # Удаление последнего элемента (20)
🟠Очередь (Queue)
Принцип работы: FIFO (первым пришел — первым ушел). Реализуется через collections.deque или библиотеку queue.
from collections import deque
queue = deque()
queue.append(10)
queue.append(20)
print(queue.popleft()) # 10
🟠Связный список (Linked List)
Элементы связаны друг с другом через указатели. Гибче массивов, но сложнее в реализации.
class Node:
def __init__(self, data):
self.data = data
self.next = None
class LinkedList:
def __init__(self):
self.head = None
def append(self, data):
if not self.head:
self.head = Node(data)
else:
current = self.head
while current.next:
current = current.next
current.next = Node(data)
Ставь 👍 и забирай 📚 Базу знанийimport sys
print(sys.getrecursionlimit()) # 1000 (обычное значение)
Если превысить этот лимит, программа вызовет ошибку
def recursive():
return recursive()
recursive() # RecursionError: maximum recursion depth exceeded
🚩Как изменить лимит?
Можно увеличить глубину рекурсии, но это небезопасно
sys.setrecursionlimit(2000) # Увеличиваем до 2000
🟠Рекурсия требует много памяти
Каждый рекурсивный вызов создаёт новый фрейм в стеке вызовов.
def factorial(n):
if n == 1:
return 1
return n * factorial(n - 1)
print(factorial(10000)) # Ошибка из-за переполнения стека
🟠Отсутствие оптимизации хвостовой рекурсии
Другие языки (например, Lisp, JavaScript) автоматически оптимизируют хвостовую рекурсию (Tail Call Optimization, TCO).
Python не делает этого, поэтому даже "идеальная" рекурсия всё равно переполняет стек.
def tail_recursive(n, acc=1):
if n == 1:
return acc
return tail_recursive(n - 1, n * acc)
print(tail_recursive(1000)) # Всё равно вызовет RecursionError
🟠Рекурсия медленнее цикла
Рекурсивный вызов требует больше накладных расходов (создание стек-фреймов), чем обычный for или while.
# Итеративный вариант (быстрее)
def factorial_iter(n):
result = 1
for i in range(1, n + 1):
result *= i
return result
# Рекурсивный вариант (медленнее)
def factorial_rec(n):
if n == 1:
return 1
return n * factorial_rec(n - 1)
Ставь 👍 и забирай 📚 Базу знанийimport time
start = time.time()
s = 0
for i in range(10_000_000):
s += i
end = time.time()
print("Python:", end - start, "сек")
Результат
Python: 0.8 секC++ (быстро)
#include <iostream>
#include <chrono>
int main() {
auto start = std::chrono::high_resolution_clock::now();
long long s = 0;
for (int i = 0; i < 10000000; i++) {
s += i;
}
auto end = std::chrono::high_resolution_clock::now();
std::cout << "C++: "
<< std::chrono::duration<double>(end - start).count()
<< " сек" << std::endl;
}
Результат
C++: 0.05 сек🚩3. Когда Python может быть быстрее? 🟠Если используются сторонние библиотеки (NumPy, Pandas, TensorFlow) Они написаны на C/C++ и работают очень быстро. Пример:
numpy.sum(arr) быстрее, чем sum(list), потому что работает на C.
🟠Разработка в Python быстрее (меньше кода, проще отладка)
Python код пишется в 2-5 раз быстрее, чем C++. Важно для стартапов и прототипов.
🟠Python лучше для обработки текста, веб-разработки, автоматизации
Например, парсинг HTML, обработка логов, работа с API.
🚩Когда C++ лучше?
🟠 Высокая производительность (игры, 3D, движки)
Игры, графика (Unreal Engine, Unity, CryEngine). Разработка операционных систем (Windows, Linux).
🟠Алгоритмы и математика (С++ быстрее Python в 10-100 раз)
Быстрая обработка данных, алгоритмы (sorting, graph, machine learning). Например, если нужно перемножить матрицы размером 10 000 × 10 000, C++ справится в разы быстрее.
🟠Работа с железом (Embedded, драйверы, робототехника)
Python слишком медленный для реального времени, а C++ используется в Arduino, автопилотах, микроконтроллерах.
Ставь 👍 и забирай 📚 Базу знанийdict) и элементов в множествах (set), так как они поддерживают вычисление хеша с помощью функции hash().
🚩Как понять, что объект хешируемый?
🟠Объект должен быть неизменяемым
если объект можно изменить после создания, его хеш тоже изменится, что нарушает работу структур данных (словари, множества).
🟠Должен реализовывать метод `__hash__()`
который возвращает уникальный идентификатор объекта.
🚩Какие типы данных хешируемые?
Числа (int, float, complex)
print(hash(42)) # 42
print(hash(3.14)) # 322818021289917443
print(hash(1 + 2j)) # 8389048192121911274
Строки (str)
print(hash("hello")) # Например, 5320385861927423548
Кортежи (tuple), если все их элементы тоже хешируемые:
print(hash((1, 2, 3))) # 529344067295497451
Булевы значения (bool):
print(hash(True)) # 1
print(hash(False)) # 0
🚩Какие типы НЕ хешируемые?
Списки (list)
hash([1, 2, 3]) # TypeError: unhashable type: 'list'
Множества (set)
hash({1, 2, 3}) # TypeError: unhashable type: 'set'
Словари (dict)
hash({"a": 1}) # TypeError: unhashable type: 'dict'
🚩Почему это важно?
Хешируемые типы используются в словари (dict) и множества (set), так как они используют хеш-функцию для быстрого поиска данных.
my_dict = { (1, 2, 3): "tuple_key" } # Работает, потому что кортеж неизменяемый
my_set = { 42, "hello", (1, 2) } # Все элементы хешируемые
Ставь 👍 и забирай 📚 Базу знаний