Python | Вопросы собесов
12.5K subscribers
45 photos
5 videos
1 file
1.72K links
Сайт: https://easyoffer.ru/
Все каналы: t.me/+xGeAw6ckJ4liYzQy

Контакт для рекламы: @sendme_ads
Download Telegram
🔥 Скрытые вакансии с удаленной работой для Python разработчика, которые нигде больше не публикуются. Напрямую от компаний, с контактами рекрутеров.

🔹 Python Jobs | Вакансии
🔹 Data Science ML | Вакансии
🔹 Golang Go Jobs | Вакансии

🔸 Все каналы с вакансиями
🤔 Какие есть коды ошибок HTTP?

В HTTP коды состояния указывают, как сервер обработал запрос. Они делятся на 5 категорий:
1xx (Информационные – запрос принят, продолжаем.
2xx (Успешные) – всё хорошо.
3xx (Перенаправления) – запрашиваемый ресурс перемещён.
4xx (Ошибки клиента) – клиент отправил неправильный запрос.
5xx (Ошибки сервера) – сервер не смог обработать запрос.


🚩Как исправить ошибки HTTP?

4xx:
400: Проверить формат запроса.
401: Убедиться, что пользователь авторизован.
403: Проверить права доступа.
404: Убедиться, что URL правильный.
5xx:
500: Проверить код сервера (ошибки в логах).
502/504: Проверить настройки Nginx/Proxy.
503: Сервер перегружен → добавить балансировку нагрузки.

Ставь 👍 и забирай 📚 Базу знаний
👍2
🤔 Что такое динамическое программирование?

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


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍2
🤔 Как сгенерировать и применить миграцию?

В Django миграции используются для изменения структуры базы данных (создание, изменение и удаление таблиц и полей).

🚩Генерация миграции (`makemigrations`)

🟠Создаём или изменяем модель (`models.py`)
Пример модели пользователя:
from django.db import models

class UserProfile(models.Model):
name = models.CharField(max_length=100)
age = models.IntegerField()


🟠Генерируем миграцию
Запускаем команду:
python manage.py makemigrations


Django создаст файл миграции в migrations/
migrations/
0001_initial.py # Файл с SQL-изменениями


Проверяем SQL-запрос, который будет выполнен
python manage.py sqlmigrate myapp 0001


🚩Применение миграции (`migrate`)

После генерации нужно применить миграции к базе данных:
python manage.py migrate


🚩Что делать, если модель изменилась?

Добавим поле в models.py
class UserProfile(models.Model):
name = models.CharField(max_length=100)
age = models.IntegerField()
email = models.EmailField(default="example@example.com") # Добавили поле


Сгенерируем новую миграцию
python manage.py makemigrations


Применяем изменения к БД
python manage.py migrate


🚩Откат миграций (`migrate <номер>`)

Если нужно откатить последнее изменение:
python manage.py migrate myapp 0001  # Откат до первой миграции


Ставь 👍 и забирай 📚 Базу знаний
🤔 Как реализуются public методы?

1. Public методы объявляются без каких-либо префиксов перед именем метода.
2. Они доступны для вызова из любого места в программе.
3. Пример: def public_method(self): реализует открытый метод объекта.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🤔 Для чего нужен счетчик ссылок 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() # Явный вызов сборщика мусора удалит его


Ставь 👍 и забирай 📚 Базу знаний
🤔 Что известно о request и response?

Это ключевые понятия в веб-связи:
- Request (запрос) — отправляется клиентом. Содержит:
- Метод (GET, POST и др.)
- URL
- Заголовки
- Тело (если есть)
- Response (ответ) — возвращается сервером. Содержит:
- Статус-код (например, 200, 404, 500)
- Заголовки
- Тело ответа (например, HTML, JSON)
Они образуют цикл общения между клиентом и сервером.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍1💊1
🤔 Какие объекты можно положить в множество?

В Python множество (set) — это неупорядоченная коллекция уникальных элементов, которая работает на основе хеш-таблицы. Это значит, что только хешируемые (immutable) объекты могут быть добавлены в set.

🚩Можно добавить в `set`:

Числа (int, float, complex)
   s = {1, 2.5, 3+4j}


Строки (str)
   s = {"apple", "banana", "cherry"}


Кортежи (tuple), если они тоже содержат только неизменяемые объекты
   s = {(1, 2), ("a", "b")}


Булевые значения (bool)** (но True считается 1, а False — 0)
   s = {True, False, 1, 0}
print(s) # {False, True} (0 и 1 не добавятся повторно)


🚩Нельзя добавить в `set`

Изменяемые объекты (list, set, dict)
   s = { [1, 2, 3] }  #  Ошибка: TypeError: unhashable type: 'list'


   s = { {"key": "value"} }  #  Ошибка: TypeError: unhashable type: 'dict'


Кортежи с изменяемыми элементами
   s = { (1, [2, 3]) }  #  Ошибка: TypeError


Ставь 👍 и забирай 📚 Базу знаний
🤔 Что такое многопоточность/многопроцессорность?

- Многопоточность в Python — это одновременное выполнение нескольких "нитей" (потоков) в рамках одного процесса. Используется модуль threading. Однако из-за GIL (Global Interpreter Lock) только один поток исполняет байт-код в один момент времени, что ограничивает пользу многопоточности для вычислений. Подходит для I/O-задач (работа с сетью, файлами).
- Многопроцессорность — это запуск нескольких процессов, каждый со своей памятью и интерпретатором. Используется модуль multiprocessing. Эффективна при вычислениях, так как GIL не мешает разным процессам работать параллельно на многоядерных CPU.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍2
🤔 Встроенные функции Python

В Python есть встроенные функции (built-in functions) — это функции, которые можно использовать без импорта. Они делают код проще и удобнее.
Полный список встроенных функций можно посмотреть так:
print(dir(__builtins__))


🚩Основные категории встроенных функций

Работа с числами
print(abs(-5))  # 5
print(round(3.14159, 2)) # 3.14
print(pow(2, 3)) # 8
print(min([3, 1, 4])) # 1


Работа со строками
print(len("hello"))  # 5
print(str(123)) # '123'
print(ord('A')) # 65
print(chr(65)) # 'A'


Работа с коллекциями (списки, кортежи, множества)
a = [3, 1, 2]
print(sorted(a)) # [1, 2, 3]

nums = [1, 2, 3]
names = ["Alice", "Bob", "Charlie"]
print(list(zip(nums, names))) # [(1, 'Alice'), (2, 'Bob'), (3, 'Charlie')]


Работа с логикой и проверками
print(bool(""))  # False
print(all([True, 1, "Hello"])) # True
print(any([0, "", None, 5])) # True (есть хотя бы один True)


Работа с функциями
nums = [1, 2, 3, 4]
squared = list(map(lambda x: x**2, nums))
print(squared) # [1, 4, 9, 16]

evens = list(filter(lambda x: x % 2 == 0, nums))
print(evens) # [2, 4]


Работа с файлами
with open("file.txt", "w") as f:
f.write("Hello, world!")

name = input("Введите имя: ")
print("Привет,", name)


Работа с объектами и атрибутами
print(type(42))  # <class 'int'>
print(isinstance(42, int)) # True
print(dir([])) # Методы списка


Ставь 👍 и забирай 📚 Базу знаний
🤔Что тебе известно про нереляционные базы данных?

Нереляционные базы данных (NoSQL) подходят для хранения неструктурированных или динамических данных. Они делятся на типы: ключ-значение (Redis), документоориентированные (MongoDB), графовые (Neo4j) и базы временных рядов. NoSQL обеспечивает высокую производительность и горизонтальное масштабирование.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🤔 Как работает функция 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]


Ставь 👍 и забирай 📚 Базу знаний
🤔 Для чего асинхронность?

Асинхронность в Python используется для эффективной работы с задачами, которые тратят время на ожидание, например:
- сетевые запросы;
- операции с файлами;
- задержки по времени;
- работа с базами данных.
Асинхронный код (async/await) позволяет выполнять другие действия во время ожидания, не блокируя основной поток. Это особенно полезно в веб-серверах, чат-ботах, API и других IO-bound задачах.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🤔1
🤔 Как отсортировать список словарей по определенному полю?

Для сортировки списка словарей по определенному полю в 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}]


Ставь 👍 и забирай 📚 Базу знаний
👍1
🤔 Как реализовывать views: функцией или классом?

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


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🤔 Что такое паттерн Заместитель (Proxy)?

Это структурный шаблон проектирования, который предоставляет объект, управляющий доступом к другому объекту. Этот паттерн создаёт суррогат или заместителя для другого объекта и контролирует доступ к нему.

🚩Зачем нужен паттерн Заместитель

🟠Управление доступом
Когда необходимо контролировать доступ к ресурсу.
🟠Отложенная инициализация
Когда необходимо отложить создание ресурсоёмких объектов до момента их первого использования.
🟠Управление ресурсами
Для управления ресурсами, такими как память или сетевые соединения.
🟠Логирование и кэширование
Для добавления дополнительной функциональности, такой как логирование или кэширование, без изменения кода основного объекта.

🚩Типы заместителей

🟠Управляющий заместитель (Virtual Proxy):
Контролирует доступ к объекту, создавая его по требованию.
🟠Защитный заместитель (Protection Proxy):
Контролирует доступ к объекту, ограничивая права пользователей.
🟠Удалённый заместитель (Remote Proxy)
Управляет доступом к объекту, находящемуся в другом адресном пространстве.
🟠Кэш-прокси (Cache Proxy)
Кэширует результаты запросов к объекту для повышения производительности.

🚩Как используется паттерн Заместитель

Заместитель реализует интерфейс основного объекта и перенаправляет вызовы к реальному объекту, добавляя при этом дополнительную функциональность. В этом примере класс Proxy контролирует доступ к классу RealSubject, добавляя проверку доступа и логирование.
from abc import ABC, abstractmethod

class Subject(ABC):
@abstractmethod
def request(self):
pass

class RealSubject(Subject):
def request(self):
print("Реальный объект: Обработка запроса.")

class Proxy(Subject):
def __init__(self, real_subject):
self._real_subject = real_subject

def request(self):
if self.check_access():
self._real_subject.request()
self.log_access()

def check_access(self):
print("Заместитель: Проверка доступа перед выполнением запроса.")
return True

def log_access(self):
print("Заместитель: Логирование времени запроса.")

# Клиентский код
real_subject = RealSubject()
proxy = Proxy(real_subject)

proxy.request()


Ставь 👍 и забирай 📚 Базу знаний
👍1
🤔 Как создать views?

Views создаются как функции или классы в файле views.py, которые принимают запрос и возвращают HTTP-ответ. Например, с использованием функций HttpResponse или рендеринга шаблонов через render.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
💊2
🤔 Какие есть методы чтобы реализовать протокол итерирования данных?

Для реализации протокола итерирования данных в Python необходимо использовать два метода: __iter__() и __next__().

🚩Протокол итератора

🟠Метод `__iter__()`
Этот метод должен возвращать объект-итератор. В простом случае он возвращает сам объект, если объект реализует метод __next__(). Метод __iter__() необходим для того, чтобы объект можно было использовать в конструкциях, которые требуют итерируемого объекта, таких как циклы for.
🟠Метод __next__()
Этот метод возвращает следующий элемент в последовательности. Когда элементы заканчиваются, метод должен вызвать исключение StopIteration для остановки итерации.

class MyRange:
def __init__(self, start, end):
self.start = start
self.end = end
self.current = start

def __iter__(self):
self.current = self.start # Перезапуск итератора при каждом вызове
return self

def __next__(self):
if self.current >= self.end:
raise StopIteration
else:
self.current += 1
return self.current - 1

# Использование
for number in MyRange(1, 5):
print(number)


🚩Дополнительно: итераторы и генераторы

Для упрощения создания итераторов в Python можно использовать генераторы. Генераторы позволяют писать итераторы с использованием ключевого слова yield вместо определения методов __iter__() и __next__() вручную.
def my_range(start, end):
current = start
while current < end:
yield current
current += 1

# Использование
for number in my_range(1, 5):
print(number)


Ставь 👍 и забирай 📚 Базу знаний
🤔 В чём отличие текстовых и бинарных файлов?

Текстовые работают со строками и учитывают кодировку. Бинарные работают с байтами и не делают преобразований.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🔥3
🤔 Какие есть виды файловых объектов?

В Python существует несколько типов файловых объектов, которые используются для работы с различными типами данных. Рассмотрим основные виды файловых объектов и их особенности.

🟠Текстовые файлы (`TextIOWrapper`)
Это самый распространённый тип файловых объектов. Такие файлы используются для работы с текстовыми данными и поддерживают строковые операции.
   with open("example.txt", "w", encoding="utf-8") as file:
file.write("Привет, мир!") # Записываем текст в файл

with open("example.txt", "r", encoding="utf-8") as file:
content = file.read() # Читаем текст из файла
print(content)


🟠Бинарные файлы (`BufferedReader`, `BufferedWriter`)
Эти файлы используются для работы с двоичными данными (изображениями, видео, аудиофайлами и т. д.).
   with open("image.jpg", "rb") as file:
binary_data = file.read() # Читаем файл в бинарном режиме
print(binary_data[:10]) # Выведем первые 10 байтов

with open("copy.jpg", "wb") as file:
file.write(binary_data) # Записываем данные в новый файл


🟠Файлы ввода-вывода в памяти (`io.StringIO`, `io.BytesIO`)
Эти объекты представляют собой файловые буферы, которые хранят данные в оперативной памяти, а не на диске.
   from io import StringIO

file = StringIO()
file.write("Привет, мир!") # Запись данных в буфер
file.seek(0) # Перемещаем указатель в начало
print(file.read()) # Читаем данные из буфера


Пример работы с BytesIO:
   from io import BytesIO

file = BytesIO()
file.write(b"Binary data") # Запись бинарных данных
file.seek(0)
print(file.read()) # Чтение данных


🟠Файловые объекты на основе сокетов, пайпов и других источников
Python позволяет работать с файловыми объектами, полученными из нестандартных источников, например, сокетов или каналов связи (pipes).
   import socket

s = socket.socket()
s.connect(("example.com", 80))
s.sendall(b"GET / HTTP/1.1\r\nHost: example.com\r\n\r\n")
response = s.makefile("r", encoding="utf-8") # Создание файлового объекта
print(response.readline()) # Читаем первую строку HTTP-ответа
s.close()


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