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

Тесты t.me/+20tRfhrwPpM4NDQy
Задачи t.me/+nsl4meWmhfQwNDVi
Вакансии t.me/+cXGKkrOY2-w3ZTky
Download Telegram
🤔 Что за функция wait()?

wait() похожа на gather, но предоставляет более гибкий контроль, позволяя:
- ждать завершения всех задач;
- ждать первых завершённых;
- получить информацию о выполненных и ожидающих задачах.


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

В Python все данные делятся на изменяемые (mutable) и неизменяемые (immutable)

🚩Неизменяемые (`immutable`) типы

После создания их нельзя изменить!
x = 10
print(id(x)) # 140735598722544 (адрес в памяти)

x = x + 5 # Создаётся новый объект!
print(id(x)) # 140735598722704 (новый адрес)


Пример: str неизменяемая
s = "hello"
print(id(s)) # 140735598723664

s = s + " world" # Создаётся новая строка!
print(id(s)) # 140735598724240 (новый адрес)


🚩Изменяемые (`mutable`) типы

Можно менять их содержимое без создания нового объекта.
lst = [1, 2, 3]
print(id(lst)) # 140735598722544

lst.append(4) # Изменяем список
print(id(lst)) # 140735598722544 (адрес остался тот же!)


Пример: dict изменяемый
d = {"name": "Alice"}
print(id(d)) # 140735598723664

d["age"] = 25 # Добавляем ключ
print(id(d)) # 140735598723664 (адрес не изменился!)


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

Неизменяемые объекты безопаснее для ключей dict и set
d = {}
d[[1, 2, 3]] = "Ошибка!" # TypeError: unhashable type: 'list'


Используем tuple вместо list (он неизменяемый)
d[(1, 2, 3)] = "OK"


Ошибки с изменяемыми значениями по умолчанию
def add_item(lst=[]):  #  Опасный код!
lst.append(1)
return lst

print(add_item()) # [1]
print(add_item()) # [1, 1] Список не создаётся заново!


Используем None вместо списка
def add_item(lst=None):
if lst is None:
lst = []
lst.append(1)
return lst


🚩Копирование объектов (`copy()` vs `deepcopy()`)

copy() делает поверхностную копию (новый объект, но старые вложенные элементы).
deepcopy() делает глубокую копию (всё новое).
import copy

lst1 = [[1, 2, 3], [4, 5, 6]]
lst2 = copy.copy(lst1) # Поверхностная копия

lst2[0][0] = 99
print(lst1) # [[99, 2, 3], [4, 5, 6]] Исходный список изменился!


Используем deepcopy() для полной независимой копии
lst3 = copy.deepcopy(lst1)
lst3[0][0] = 100
print(lst1) # [[99, 2, 3], [4, 5, 6]] Не изменился!


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

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

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

Это подход к проектированию веб-сервисов, основанный на архитектурном стиле REST (*Representational State Transfer*). Это не протокол или стандарт, а набор принципов и ограничений, которые используются для создания систем, взаимодействующих через HTTP. Если API соответствует этим принципам, его называют RESTful.

🚩 Основные принципы REST

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

🟠Состояние отсутствия (Stateless)
Каждый запрос от клиента к серверу должен быть самодостаточным. Это означает, что сервер не хранит информацию о состоянии клиента между запросами. Вся необходимая информация передается в запросе (например, токен аутентификации).

🟠Унифицированный интерфейс
RESTful API использует единый, стандартный интерфейс для взаимодействия. Это достигается следующими средствами:
Идентификация ресурсов через URI: Каждый ресурс имеет уникальный адрес (URI).

     GET https://api.example.com/users/123

Использование стандартных HTTP-методов:
GET — для получения данных.
POST — для создания новых данных.
PUT или PATCH — для обновления данных.
DELETE — для удаления данных.
Ресурсы как представления: Ресурсы передаются в формате JSON, XML или другом формате.

🟠Кэширование
Ответы сервера могут быть кэшируемыми. Это уменьшает нагрузку на сервер и ускоряет работу клиента.

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

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

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

RESTful архитектура позволяет:
🟠Сделать API простым и понятным
Клиенты легко понимают, как обращаться к ресурсам (используя стандартные методы и адреса).
🟠Обеспечить гибкость
Клиенты и серверы могут развиваться независимо друг от друга.
🟠Поддерживать масштабируемость
RESTful API легко масштабируются, так как все запросы независимы друг от друга (статичность).
🟠Облегчить интеграцию
RESTful API поддерживают стандартизированные протоколы (HTTP), что делает интеграцию с другими сервисами проще.

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

На практике применяются такие декораторы:
-
@staticmethod — обозначает метод, не использующий self.
-
@classmethod — получает cls и работает с классом, а не экземпляром.
-
@property — превращает метод в геттер (доступ к методу как к атрибуту).
-
@lru_cache — кеширует вызовы функции, оптимизируя повторные вычисления.
-
@wraps — сохраняет метаинформацию оригинальной функции в пользовательских декораторах.
- Декораторы логирования, валидации, измерения времени выполнения.


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

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

🚩Что такое пакет Python?

Пакет — это набор модулей, объединенных в одну структуру (обычно это папка с файлом __init__.py).
mypackage/
│── mymodule.py
│── __init__.py
└── utils.py


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

Допустим, у нас есть пакет mypackage, в котором есть функция say_hello().

Структура проекта
mypackage/
│── mymodule.py
│── __init__.py
└── setup.py


Файл mypackage/mymodule.py
def say_hello():
return "Привет, мир!"


Файл mypackage/__init__.py (он делает папку пакетом)
from .mymodule import say_hello


Теперь можно использовать mypackage в коде
import mypackage

print(mypackage.say_hello()) # Выведет: Привет, мир!


🚩Как установить стороннюю библиотеку?

Чтобы установить готовую библиотеку из PyPI, используем pip
pip install requests  # Установка библиотеки requests


Чтобы посмотреть установленные пакеты
pip list


Чтобы удалить пакет
pip uninstall requests


Чтобы обновить пакет
pip install requests --upgrade


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
🤔 В чём сходства и отличия dataclass и namedtuple?

Сходства:
- Оба предоставляют компактный синтаксис для создания объектов с полями.
- Поддерживают доступ по имени (obj.field).
- Иммутабельность (frozen=True для dataclass, по умолчанию в namedtuple).
Отличия:
- namedtuple — неизменяемый, лёгкий и быстрый, но не поддерживает методы, наследование и типизацию так же гибко.
- dataclass — более гибкий, позволяет использовать методы, наследование, значения по умолчанию, валидацию и другие параметры (frozen, order, repr, init и т.д.).


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

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

🚩Зачем нужен?

🟠Сохранение состояния:
Позволяет сохранять текущее состояние объекта и восстанавливать его позже.
🟠Инкапсуляция:
Обеспечивает сохранение состояния объекта без нарушения его инкапсуляции. Внутренние детали объекта остаются скрытыми от других объектов.
🟠Отмена и повтор операций:
Поддерживает функциональность отмены и повтора операций, так как позволяет возвращать объект к предыдущим состояниям.
Пример реализации
class Memento:
def __init__(self, state: str):
self._state = state

def get_state(self) -> str:
return self._state

class TextEditor:
def __init__(self):
self._state = ""
self._history = []

def type(self, text: str):
self._save_state()
self._state += text

def _save_state(self):
self._history.append(Memento(self._state))

def undo(self):
if not self._history:
return
memento = self._history.pop()
self._state = memento.get_state()

def get_content(self) -> str:
return self._state

# Клиентский код для использования паттерна Хранитель
def main():
editor = TextEditor()

editor.type("Hello, ")
editor.type("world!")
print(editor.get_content()) # Hello, world!

editor.undo()
print(editor.get_content()) # Hello,

editor.undo()
print(editor.get_content()) #

if __name__ == "__main__":
main()


1⃣`Memento`:
Сохраняет состояние объекта. Он предоставляет методы для получения сохраненного состояния, но не предоставляет методов для изменения состояния, что обеспечивает неизменность.

2⃣`TextEditor`:
Создает и использует объекты Memento для сохранения и восстановления своего состояния. Методы type и undo позволяют редактировать текст и отменять изменения.

3⃣`_save_state`:
Сохраняет текущее состояние редактора в истории перед каждым изменением.

4⃣`undo`:
Восстанавливает предыдущее состояние редактора из истории.

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

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


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

Django использует sqlparse и asgiref как вспомогательные библиотеки для работы с SQL и асинхронностью. Разберём их назначение подробно.

🟠`sqlparse` – разбор SQL-запросов
sqlparse (SQL Parser) — это библиотека для анализа, форматирования и обработки SQL-запросов. В Django она используется в админке, логах и отладке ORM.

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

Форматирование SQL-запросов в django.db.connection.queries
   from django.db import connection
from sqlparse import format

queries = connection.queries # Получаем список SQL-запросов
for q in queries:
print(format(q["sql"], reindent=True, keyword_case="upper")) # Красивый SQL


Логирование SQL-запросов
sqlparse помогает Django красиво выводить SQL-запросы в DEBUG=True.

Команда sqlmigrate
   python manage.py sqlmigrate app_name 0001


🟠`asgiref` – асинхронность в Django
asgiref (Asynchronous Server Gateway Interface Reference) — это библиотека, которая помогает Django работать в асинхронном (async) режиме. Django поддерживает ASGI с версии 3.0, и asgiref — это её обязательная зависимость.

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

🟠Поддержка ASGI
Django с версии 3.0 поддерживает асинхронные вьюхи, WebSockets и асинхронные базы данных (например, с asyncpg).
В settings.py есть параметр:
     ASGI_APPLICATION = "myproject.asgi.application"


🟠Асинхронные middleware
Django 4.x поддерживает асинхронные middleware через asgiref.sync и asgiref.local.

🟠Преобразование `async` → `sync` и наоборот
Django использует sync_to_async() и async_to_sync() из asgiref:
     from asgiref.sync import sync_to_async

def sync_function():
return "Hello from sync!"

async_function = sync_to_async(sync_function)
print(async_function()) # Вызывает синхронную функцию в асинхронном коде


🟠Локальное хранилище для асинхронных задач (`asgiref.local.Local`)
Позволяет хранить данные отдельно для каждого потока или запроса.

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
🤔 В чём отличие [x for x in y] от (x for x in y)?

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


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

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


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

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

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

Когда ты вводишь адрес сайта в браузере и нажимаешь Enter, происходит следующее:
1. DNS-запрос — доменное имя (например,
example.com) преобразуется в IP-адрес.
2. Установка соединения — браузер открывает TCP-соединение с сервером, часто с использованием HTTPS (т.е. через TLS).
3. Отправка HTTP-запроса — браузер отправляет, например, GET /, чтобы получить главную страницу.
4. Обработка на сервере — сервер принимает запрос, обрабатывает его и формирует ответ.
5. Получение ответа — браузер получает HTML-страницу, начинает загружать CSS, JS, изображения и прочее.
6. Рендеринг страницы — браузер строит DOM и отображает контент пользователю.


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

Когда в проекте много файлов, могут возникать конфликты импортов. Python ищет модули в определённом порядке, и если несколько файлов имеют одинаковые имена или неправильные пути, может возникнуть ошибка.

🚩Способы избежать конфликтов при импорте

🟠Используйте явные пути импорта
Вместо
import mymodule  # Может вызвать конфликт, если есть несколько файлов с таким именем


Лучше указывать полный путь в пакетах
from myproject.utils.mymodule import my_function


🟠Избегайте конфликтов имён файлов
Если у вас есть файл math.py, импорт import math будет загружать ваш файл, а не стандартный модуль math из Python.
- Не называйте файлы именами стандартных модулей: math.py, sys.py, json.py.
- Проверьте, какой именно модуль загружается:

  import math
print(math.__file__) # Путь к загруженному модулю


🟠Добавьте `__init__.py` в пакеты
Если у вас есть структура
/myproject
/utils
mymodule.py


Решение
Добавьте пустой __init__.py в utils/:
/myproject
/utils
__init__.py # Делаем utils пакетом
mymodule.py


Теперь импорт будет работать
from utils import mymodule


🟠Используйте `sys.path.append()` для указания путей
Иногда Python не находит модуль, если он находится вне стандартных путей. Решение
Добавьте путь вручную:
import sys
sys.path.append("/path/to/directory")

import mymodule # Теперь импорт будет работать


🟠Используйте `absolute` и `relative` импорт в пакетах
Абсолютный импорт (рекомендуется)
from myproject.utils.mymodule import my_function


Относительный импорт (используется внутри пакетов):
from .mymodule import my_function


🟠Проверяйте `sys.modules` и `sys.path`
Если импорт не работает, проверьте, какие модули загружены и где Python ищет файлы
import sys
print(sys.modules.keys()) # Список загруженных модулей
print(sys.path) # Пути, где Python ищет модули


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

Python 3 не совместим с Python 2. Основные отличия: – другой синтаксис print,
– по-другому работают строки и деление,
– улучшенная поддержка Unicode,
– другие библиотеки и подходы к обработке данных.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5👍3💊2
Forwarded from easyoffer
Официальный релиз easyoffer 2.0 состоится уже в течение нескольких дней.

Напоминаю, что в честь релиза запускаем акцию.

Первые 500 покупателей получат:

🚀 Скидку 50% на PRO тариф на 1 год
🎁 Подарок ценностью 5000₽ для тех, кто подписан на этот канал

🔔 Подпишитесь на этот канал: https://t.me/+b2fZN17A9OQ3ZmJi
В нем мы опубликуем сообщение о релизе в первую очередь
Please open Telegram to view this post
VIEW IN TELEGRAM
💊1
🤔 В чем отличие изменяемые / неизменяемые?

В Python все данные делятся на изменяемые (mutable) и неизменяемые (immutable)

🚩Неизменяемые (`immutable`) типы

После создания их нельзя изменить!
x = 10
print(id(x)) # 140735598722544 (адрес в памяти)

x = x + 5 # Создаётся новый объект!
print(id(x)) # 140735598722704 (новый адрес)


Пример: str неизменяемая
s = "hello"
print(id(s)) # 140735598723664

s = s + " world" # Создаётся новая строка!
print(id(s)) # 140735598724240 (новый адрес)


🚩Изменяемые (`mutable`) типы

Можно менять их содержимое без создания нового объекта.
lst = [1, 2, 3]
print(id(lst)) # 140735598722544

lst.append(4) # Изменяем список
print(id(lst)) # 140735598722544 (адрес остался тот же!)


Пример: dict изменяемый
d = {"name": "Alice"}
print(id(d)) # 140735598723664

d["age"] = 25 # Добавляем ключ
print(id(d)) # 140735598723664 (адрес не изменился!)


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

Неизменяемые объекты безопаснее для ключей dict и set
d = {}
d[[1, 2, 3]] = "Ошибка!" # TypeError: unhashable type: 'list'


Используем tuple вместо list (он неизменяемый)
d[(1, 2, 3)] = "OK"


Ошибки с изменяемыми значениями по умолчанию
def add_item(lst=[]):  #  Опасный код!
lst.append(1)
return lst

print(add_item()) # [1]
print(add_item()) # [1, 1] Список не создаётся заново!


Используем None вместо списка
def add_item(lst=None):
if lst is None:
lst = []
lst.append(1)
return lst


🚩Копирование объектов (`copy()` vs `deepcopy()`)

copy() делает поверхностную копию (новый объект, но старые вложенные элементы).
deepcopy() делает глубокую копию (всё новое).
import copy

lst1 = [[1, 2, 3], [4, 5, 6]]
lst2 = copy.copy(lst1) # Поверхностная копия

lst2[0][0] = 99
print(lst1) # [[99, 2, 3], [4, 5, 6]] Исходный список изменился!


Используем deepcopy() для полной независимой копии
lst3 = copy.deepcopy(lst1)
lst3[0][0] = 100
print(lst1) # [[99, 2, 3], [4, 5, 6]] Не изменился!


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

Процесс включает несколько этапов:
1. Разбор URL — браузер определяет протокол, домен и путь.
2. DNS-запрос — IP-адрес домена ищется через DNS-сервер.
3. Установка соединения — устанавливается TCP-соединение с сервером, при HTTPS — с использованием TLS.
4. Отправка HTTP-запроса — браузер отправляет GET-запрос.
5. Получение ответа — сервер отправляет HTML, CSS, JS, изображения и т. д.
6. Обработка и рендеринг — браузер обрабатывает и отображает страницу.
7. Дополнительные запросы — выполняются асинхронные вызовы, скрипты, загрузка шрифтов и т.д.


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

git stash — это команда в Git, которая сохраняет незакоммиченные изменения во временное хранилище (stash) и очищает рабочую директорию.

🚩Когда это полезно?

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

🚩Как использовать `git stash`?

Сохранить изменения в stash
git stash


Посмотреть список сохранённых изменений
git stash list


Выведет список всех stash-ов
stash@{0}: WIP on main: 1234567 Добавил новую фичу
stash@{1}: WIP on dev: 89abcde Исправил баг


Восстановить сохранённые изменения
git stash pop  # Восстановит изменения и удалит stash


ИЛИ
git stash apply  # Восстановит, но stash останется в списке


Удалить stash после применения
git stash drop stash@{0}  # Удалит конкретный stash
git stash clear # Удалит все stash'и


🚩Пример использования

Сценарий
- Ты работаешь в ветке main, но нужно срочно переключиться на dev.
- У тебя есть изменения, которые ты не хочешь коммитить.
Решение
git stash          # Сохраняем изменения
git checkout dev # Переключаемся на другую ветку
# Делаем нужную работу...
git checkout main # Возвращаемся в основную ветку
git stash pop # Восстанавливаем изменения


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

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


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