Python | Вопросы собесов
13K subscribers
19 photos
1 file
265 links
Разбираем вопросы с собеседований на Python разработчика. Django, Flask, FastApi

Реклама: @easyoffer_adv

Решай тесты - t.me/+_34GCnTeJhFlNWEy
Готовься к собесам - https://t.me/+DJ4QbkWKFQAxZWZi
https://t.me/+BZJGOFky1ORjOGQ6
Download Telegram
Что такое корутина ?
Спросят с вероятностью 10%

Корутина (Coroutine) - это специальный вид функции, который позволяет приостанавливать и возобновлять выполнение в произвольный момент времени. Корутины обеспечивают кооперативную многозадачность, что означает, что они позволяют явно управлять потоком выполнения в своем коде.

Основные характеристики:

1️⃣ Асинхронность: Широко используются в асинхронном программировании, таком как асинхронные веб-серверы или сетевые клиенты. Они позволяют выполнять такие операции без блокирования основного потока выполнения.

2️⃣ yield/yield from: Для определения корутины используется ключевое слово yield или yield from, которое указывает места, где выполнение может быть приостановлено и возвращено обратно в вызывающий код.

3️⃣ Возобновление выполнения: Может быть возобновлена, чтобы продолжить выполнение с того же места, где она была приостановлена, и передать ей новые данные.

4️⃣ Сопрограммы: Их также называют сопрограммами (Subroutine), так как они представляют собой подпрограммы, которые могут быть вызваны и возобновлены.

Пример:
async def my_coroutine():
print("Starting coroutine")
await asyncio.sleep(1) # Асинхронное ожидание в течение 1 секунды
print("Coroutine completed")

# Вызов корутины
coro = my_coroutine()


Здесь async def обозначает определение асинхронной функции (корутины). Ключевое слово await используется для ожидания выполнения асинхронной операции, такой как asyncio.sleep(). Когда await используется внутри корутины, выполнение корутины приостанавливается до завершения операции, переданной в await, а затем возобновляется с последующей строки.

👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 1096 вопроса на Python разработчика. Ставь 👍 если нравится контент

🔐 База собесов | 🔐 База тестовых
Основные сущности в Django ?
Спросят с вероятностью 7%

Django - это популярный фреймворк для веб-разработки. В нем существует несколько основных сущностей, которые играют важную роль в процессе разработки веб-приложений:

1️⃣ Модели (Models):
- Модели представляют собой объекты, которые отображаются на таблицы в базе данных. Каждая модель определяет структуру данных, атрибуты и методы для работы с этими данными. Модели Django используют ORM (Object-Relational Mapping) для взаимодействия с базой данных.

2️⃣ Представления (Views):
- Представления - это функции или классы, которые обрабатывают запросы от клиента и возвращают ответы. Они содержат бизнес-логику приложения и используют данные из моделей для генерации контента для клиента.

3️⃣ Шаблоны (Templates):
- Шаблоны - это файлы HTML, которые содержат статический контент страницы и динамические данные, предоставляемые представлениями. В шаблонах используется специальный синтаксис Django (шаблонный язык) для вставки данных из контекста представления.

4️⃣ URL-маршруты (URLs):
- URL-маршруты определяют соответствие между URL-адресами запросов и функциями представлений, которые должны обрабатывать эти запросы. Они определяются в файле urls.py каждого приложения и могут включать динамические параметры.

5️⃣ Формы (Forms):
- Формы Django позволяют работать с данными, отправляемыми пользователем через веб-интерфейс. Они могут быть связаны с моделями для автоматического создания и обновления записей в базе данных, а также включают валидацию данных.

6️⃣ Административный интерфейс (Admin):
- Django поставляется с встроенным административным интерфейсом, который автоматически создается на основе определений моделей. Он предоставляет интерфейс для управления данными приложения, включая добавление, редактирование и удаление записей.

7️⃣ Настройки (Settings):
- Файл настроек Django (settings.py) содержит все конфигурации проекта, включая параметры базы данных, настройки безопасности, настройки маршрутизации и многое другое.

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

👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 1096 вопроса на Python разработчика. Ставь 👍 если нравится контент

🔐 База собесов | 🔐 База тестовых
Что такое querySet() в Django ?
Спросят с вероятностью 7%

QuerySet - это объект, который представляет набор результатов запроса к базе данных в Django. Он создается при выполнении запроса к модели с использованием менеджера объектов (Object Manager) и представляет собой список объектов, удовлетворяющих условиям запроса.

Этот объект предоставляет множество методов для выполнения операций над данными, таких как фильтрация, сортировка, обрезка (slicing), агрегация и другие. Он также лениво вычисляется, что означает, что результаты запроса к базе данных не извлекаются, пока это не потребуется, например, при выполнении итерации по нему или вызове метода, который требует выполнения запроса (например, len() или list()).

1️⃣ Фильтрация объектов:
   # Получить все объекты, у которых поле 'name' равно 'John'
queryset = MyModel.objects.filter(name='John')

2️⃣
Сортировка объектов:
   # Получить все объекты, отсортированные по полю 'date' в порядке убывания
queryset = MyModel.objects.order_by('-date')

3️⃣
Извлечение определенного количества объектов:
   # Получить первые 10 объектов
queryset = MyModel.objects.all()[:10]

4️⃣
Итерация по результатам запроса:
   # Вывести все имена объектов из QuerySet
queryset = MyModel.objects.all()
for obj in queryset:
print(obj.name)


QuerySet предоставляет мощный и гибкий способ работы с данными в Django и является ключевой частью ORM-функционала фреймворка.

👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 1096 вопроса на Python разработчика. Ставь 👍 если нравится контент

🔐 База собесов | 🔐 База тестовых
Какой принцип ООП лучше всего описывает использование интерфейсов для определения контракта, который классы должны выполнить?
Anonymous Quiz
17%
Инкапсуляция
25%
Наследование
18%
Полиморфизм
40%
Абстракция
Что можно сказать про два основных типа данных ?
Спросят с вероятностью 10%

Существует два основных типа данных: изменяемые (mutable) и неизменяемые (immutable)

1️⃣ Изменяемые (mutable):
Изменяемые типы данных могут быть изменены после создания объекта, идентификатор объекта остается неизменным.
Примеры изменяемых типов данных включают:
- Списки (list)
- Словари (dict)
- Множества (set)
- Вложенные списки и словари
 my_list = [1, 2, 3]
my_list.append(4) # изменяемый тип данных


2️⃣ Неизменяемые (immutable):
Неизменяемые типы данных не могут быть изменены после создания объекта. Если изменяется значение, создается новый объект с новым идентификатором.
Примеры неизменяемых типов данных включают:
- Целые числа (int)
- Вещественные числа (float)
- Комплексные числа (complex)
- Строки (str)
- Кортежи (tuple)
my_tuple = (1, 2, 3)
my_tuple[0] = 4 # TypeError: 'tuple' object does not support item assignment


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

👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 1096 вопроса на Python разработчика. Ставь 👍 если нравится контент

🔐 База собесов | 🔐 База тестовых
Какой принцип ООП наилучшим образом описывает разделение программы на отдельные части, каждая из которых отвечает за выполнение уникальной функции?
Anonymous Quiz
25%
Инкапсуляция
54%
Модульность
10%
Наследование
11%
Композиция
Какие есть паттерны программирования ?
Спросят с вероятностью 10%

Паттерны программирования - это bewконцептуальные решения типичных проблем, возникающих при разработке ПО. Они представляют собой bewпрактики, которые помогают создавать более эффективные, гибкие и поддерживаемые программы. Вот несколько основных:

1️⃣ Порождающие(Creational Patterns):
- Фабричный метод (Factory Method)
- Абстрактная фабрика (Abstract Factory)
- Строитель (Builder)
- Прототип (Prototype)
- Одиночка (Singleton)

2️⃣ Структурные(Structural Patterns):
- Адаптер (Adapter)
- Мост (Bridge)
- Компоновщик (Composite)
- Декоратор (Decorator)
- Фасад (Facade)
- Приспособленец (Flyweight)
- Заместитель (Proxy)

3️⃣ Поведенческие(Behavioral Patterns):
- Цепочка обязанностей (Chain of Responsibility)
- Команда (Command)
- Итератор (Iterator)
- Посредник (Mediator)
- Хранитель (Memento)
- Наблюдатель (Observer)
- Состояние (State)
- Стратегия (Strategy)
- Шаблонный метод (Template Method)
- Посетитель (Visitor)

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

👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 1096 вопроса на Python разработчика. Ставь 👍 если нравится контент

🔐 База собесов | 🔐 База тестовых
Какой тип данных можно использовать в качестве ключа в словаре Python, при условии что он должен быть неизменяемым и хешируемым?
Anonymous Quiz
5%
Списки
8%
Словари
76%
Кортежи, если все их элементы хешируемы
11%
Множества
Чем отличаются классы от миксинов (mixin) ?
Спросят с вероятностью 7%

Классы и миксины (mixin) - это два различных концепта, но они могут быть взаимосвязаны и использоваться вместе. Вот основные различия:

1️⃣ Классы:
- являются основными строительными блоками объектно-ориентированного программирования.
- Они определяют поведение и состояние объектов, которые создаются на основе этих классов.
- Может быть абстрактным или конкретным, иметь атрибуты, методы, конструкторы и другие спецификации.
- Их экземпляры могут быть созданы непосредственно из определенного класса.

2️⃣ Миксины (mixin):
- Классы, которые предназначены для повторного использования функциональности в различных классах.
- Они обычно содержат методы или атрибуты, которые могут быть включены в другие классы.
- Обычно не предназначены для создания экземпляров, они используются для наследования и комбинирования функциональности с другими классами.
- Их спользование позволяет избежать дублирования кода и создать гибкие и модульные системы.

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

👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 1096 вопроса на Python разработчика. Ставь 👍 если нравится контент

🔐 База собесов | 🔐 База тестовых
Какую связь использовать для расширения стандартного юзера ?
Спросят с вероятностью 7%

Для расширения стандартной модели пользователя (User) обычно используется связь "один к одному" (OneToOne). Это позволяет создать дополнительную модель, которая будет связана с моделью пользователя и содержать дополнительные поля и методы, необходимые вашему приложению. Для этого вы можете создать новую модель, которая будет содержать информацию, которую вы хотите добавить к стандартной модели пользователя, и затем создать связь "один к одному" между новой и моделью пользователя.
from django.contrib.auth.models import User
from django.db import

class UserProfile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
# Дополнительные поля для расширения модели пользователя
date_of_birth = models.DateField()
avatar = models.ImageField(upload_to='avatars/')

# Дополнительные методы и свойства
def get_full_name(self):
return f'{self.user.first_name} {self.user.last_name}'

def str(self):
return self.user.username


В этом примере UserProfile- это модель, которая расширяет стандартную модель пользователя (User) с дополнительными полями date_of_birthи avatar. Связь OneToOneField указывает на то, что каждый объект UserProfile связан с одним и только одним объектом User.

👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 1096 вопроса на Python разработчика. Ставь 👍 если нравится контент

🔐 База собесов | 🔐 База тестовых
Что означает querySet() ленивые ?
Спросят с вероятностью 7%

"Ленивый" QuerySet означает, что выполнение запроса к базе данных откладывается до того момента, когда данные фактически понадобятся в вашем коде. Когда вы создаете его, например, с помощью метода filter() или all(), Django не выполняет фактический запрос к базе данных. Вместо этого он создает объект QuerySet, который представляет собой запрос к базе данных и может быть дальше модифицирован (фильтрован, сортирован и т.д.).

Только когда вы начинаете использовать результаты этого QuerySet, например, вызывая метод list(), count() или проходя по нему в цикле, Django выполняет запрос к базе данных и возвращает результаты.
# Создаем QuerySet, но запрос к базе данных не выполняется
queryset = MyModel.objects.filter(status='active')

# Запрос к базе данных выполняется только в этот момент
results = list(queryset)

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

👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 1096 вопроса на Python разработчика. Ставь 👍 если нравится контент

🔐 База собесов | 🔐 База тестовых
Как реализован many to many в Django ?
Спросят с вероятностью 7%

Связь many-to-many реализуется с помощью специального типа поля - ManyToManyField. Это поле позволяет связать одну модель с несколькими объектами другой модели и наоборот без создания дополнительной промежуточной модели.

Для создания связи many-to-many между двумя моделями, вы должны сначала определить поле ManyToManyField в одной из моделей, указав в качестве аргумента модель, с которой вы хотите установить связь.
from django.db import models

class Author(models.Model):
name = models.CharField(max_length=100)

class Book(models.Model):
title = models.CharField(max_length=100)
authors = models.ManyToManyField(Author)


В этом примере у модели Book есть поле authors, которое является связью many to many с моделью Author. Теперь каждая книга может иметь несколько авторов, и каждый автор может быть связан с несколькими книгами.

Вы можете работать со связью many to many так же, как с другими полями модели. Например, вы можете добавлять, удалять и получать связанные объекты, а также выполнять запросы к ним.
# Создание книги и добавление авторов
book = Book.objects.create(title='Book Title')
author1 = Author.objects.create(name='Author 1')
author2 = Author.objects.create(name='Author 2')
book.authors.add(author1, author2)

# Получение всех книг, написанных определенным автором
author = Author.objects.get(name='Author 1')
books = author.book_set.all()

# Получение всех авторов книги
book = Book.objects.get(title='Book Title')
authors = book.authors.all()


Связь many to many автоматически создает промежуточную таблицу для хранения связей между объектами двух моделей. Эта таблица создается скрытно и обрабатывается фреймворком Django, что делает работу с такими связями удобной и прозрачной для разработчика.

👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 1096 вопроса на Python разработчика. Ставь 👍 если нравится контент

🔐 База собесов | 🔐 База тестовых
Для чего подходят асинхронные операции ?
Спросят с вероятностью 7%

Асинхронные операции подходят для решения задач, которые включают в себя блокирующие операции ввода-вывода (I/O-bound operations), то есть операции, которые требуют времени на ожидание ответа от внешних источников данных, таких как сетевые запросы, операции с базой данных, чтение и запись файлов и т. д.

Преимущества использования асинхронных операций:

Улучшение производительности: Позволяют эффективно использовать ресурсы процессора, так как они не блокируют основной поток выполнения в ожидании завершения операции I/O. Вместо этого, когда операция завершается, управление передается другим операциям, что позволяет увеличить производительность приложения.

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

Улучшение отзывчивости приложения: Использование позволяет сделать ваше приложение более отзывчивым, так как оно не будет блокироваться при выполнении долгих операций I/O. Пользователи будут получать быстрый ответ от приложения даже в случае выполнения долгих операций.

Экономия ресурсов: Позволяют более эффективно использовать ресурсы сервера, так как они позволяют обрабатывать большое количество запросов с использованием меньшего количества потоков или процессов.

Примеры задач, для которых подходят асинхронные операции, включают в себя веб-серверы, API, обработку данных в реальном времени, микросервисы, чаты и мессенджеры, а также любые приложения, работающие с большим объемом асинхронных запросов и операций I/O.

👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 1096 вопроса на Python разработчика. Ставь 👍 если нравится контент

🔐 База собесов | 🔐 База тестовых
Что такое миграция ?
Спросят с вероятностью 7%

Миграция (migration) - это процесс автоматического изменения структуры базы данных на основе изменений в определении моделей. Когда вы вносите изменения в структуру моделей, например, добавляете новое поле, удаляете существующее поле или изменяете тип данных поля, вы создаете миграцию.

Миграции - это набор инструкций, которые описывают, как нужно изменить структуру базы данных, чтобы она соответствовала новому определению моделей. Эти процессы создаются с помощью инструмента командной строки manage.py и хранятся в директории migrations внутри каждого приложения.

Процесс работы с миграциями обычно выглядит следующим образом:

1️⃣ Вы вносите изменения в определения моделей(например, добавляете новое поле или изменяете существующее).

2️⃣ Создаете миграцию с помощью команды makemigrations. Django анализирует изменения в моделях и создает новую миграцию в соответствующей директории migrations.

3️⃣ Применяете миграцию к базе данных с помощью команды migrate. Django выполнит все новые миграции и применит изменения к базе данных.

Примеры типовых операций:

- makemigrations: Создание новой миграции на основе изменений в моделях.
- migrate: Применение всех непримененных миграций и обновление структуры базы данных.
- showmigrations: Показывает статус всех миграций в приложении.
- sqlmigrate: Показывает SQL-код для определенной миграции.
- squashmigrations: Объединение нескольких миграций в одну.

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

👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 1096 вопроса на Python разработчика. Ставь 👍 если нравится контент

🔐 База собесов | 🔐 База тестовых
В чем преимущество ORM перед созданием запросов вручную ?
Спросят с вероятностью 7%

ORM (Object-Relational Mapping) предоставляет абстракцию над базой данных, позволяя вам работать с данными, как с объектами, вместо того чтобы писать SQL-запросы вручную. Вот несколько преимуществ ORM перед созданием запросов вручную:

1️⃣ Более высокий уровень абстракции: Он позволяет вам думать о данных в терминах объектов и их связей, что делает код более понятным и легким для сопровождения. Вам не нужно думать о том, как представить данные в базе данных, так как ORM делает это за вас.

2️⃣ Безопасность и защита от SQL-инъекций: При его использовании данные параметризуются автоматически, что защищает от SQL-инъекций. ORM обрабатывает множество проблем безопасности данных, таких как экранирование специальных символов и форматирование значений.

3️⃣ Переносимость: При его использовании код становится более переносимым между различными СУБД, так как ORM обрабатывает различия в синтаксисе SQL и внутреннем устройстве СУБД.

4️⃣ Удобство в использовании: Он предоставляет более простой и выразительный способ работы с данными. Он облегчает создание, изменение и удаление записей в базе данных, а также обеспечивает возможность работы с данными на уровне объектов Python.

5️⃣ Меньше повторяющегося кода: Он автоматически генерирует большую часть SQL-кода, что сокращает объем повторяющегося кода и упрощает разработку.

6️⃣ Интеграция с языком программирования: Он позволяет использовать язык программирования для создания и выполнения запросов к базе данных, что делает код более читаемым и понятным.

Хотя ORM имеет множество преимуществ, иногда в некоторых ситуациях создание запросов вручную может быть более эффективным. Это обычно происходит в случае выполнения сложных SQL-операций или когда необходимо получить максимальную производительность. Однако в большинстве случаев ORM обеспечивает более удобный и безопасный способ работы с базой данных.

👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 1096 вопроса на Python разработчика. Ставь 👍 если нравится контент

🔐 База собесов | 🔐 База тестовых
Какая сложность основных операций в коллекциях ?
Спросят с вероятностью 7%

Временная сложность (в худшем случае) основных операций в коллекциях зависит от типа коллекции и реализации конкретной структуры данных. Вот общие характеристики сложности основных операций для некоторых типов коллекций:

1️⃣ Список (List):
- Доступ к элементу по индексу (indexing): O(1)
- Вставка в конец (append): O(1)
- Вставка в начало (insert): O(n)
- Удаление элемента по индексу (pop): O(n)
- Удаление элемента по значению (remove): O(n)
- Поиск элемента (in): O(n)

2️⃣ Словарь (Dictionary):
- Доступ к элементу по ключу (get): O(1)
- Вставка элемента (set): O(1)
- Удаление элемента по ключу (del): O(1)
- Проверка наличия ключа (in): O(1)
- Перебор всех элементов: O(n)

3️⃣ Множество (Set):
- Добавление элемента (add): O(1)
- Удаление элемента (remove): O(1)
- Проверка наличия элемента (in): O(1)
- Перебор всех элементов: O(n)

4️⃣ Кортеж (Tuple):
- Доступ к элементу по индексу (indexing): O(1)
- Перебор всех элементов: O(n)

Важно отметить, что эти сложности могут варьироваться в зависимости от реализации конкретной структуры данных и конкретных операций. Например, вставка в середину списка может иметь сложность O(n), если при этом требуется сдвигать все элементы вправо, чтобы освободить место для нового элемента. Поэтому при выборе структуры данных для конкретной задачи важно учитывать типичные операции, которые будут выполняться с данными, и их ожидаемую сложность.

👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 1096 вопроса на Python разработчика. Ставь 👍 если нравится контент

🔐 База собесов | 🔐 База тестовых
Какие очевидные недостатки у рекурсии ?
Спросят с вероятностью 7%

Хотя рекурсия является мощным инструментом и может использоваться для решения множества задач, у нее также есть несколько очевидных недостатков:

1️⃣ Потребление памяти: Каждый вызов функции создает новый фрейм стека, который содержит локальные переменные, аргументы и возвратный адрес. При глубокой рекурсии стек может быстро заполниться, что может привести к его переполнению (stack overflow).

2️⃣ Сложность отладки: Рекурсивные функции могут быть сложными для отладки из-за их неявной структуры. При отладке программы может быть трудно отследить порядок вызовов функций и значения аргументов.

3️⃣ Сложность понимания: Может быть трудно понять рекурсивные функции из-за их структуры и необходимости думать о базовом случае и шаге.

4️⃣ Производительность: В некоторых случаях рекурсивные решения могут быть менее эффективными по сравнению с итеративными. Это связано с накладными расходами на вызов функции и управление стеком.

5️⃣ Возможность зацикливания: Некорректная реализация рекурсивной функции может привести к бесконечной рекурсии, если базовый случай не достигнут или условие выхода из нее неверно определено.

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

👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 1096 вопроса на Python разработчика. Ставь 👍 если нравится контент

🔐 База собесов | 🔐 База тестовых