Python 100-199 Flashcards
Что ожидаешь от будущей работы
6%
https://youtu.be/o9EWhFiyE8E?t=842
https://youtu.be/qPdXqwnCbpQ?t=587
https://easyoffer.ru/question/610
Что знаешь о принципах программирования KISS
6%
KISS (Keep It Simple, Stupid) - это принцип проектирования ПО, который призывает к тому, чтобы решения были максимально простыми и непритязательными. Имеет следующие ключевые аспекты:
- Простота и ясность: ПО должно быть простым и понятным для понимания, как для его создателей, так и для пользователей. Простота снижает сложность, упрощает разработку и обслуживание кода.
- Отказ от избыточности: Избегайте излишних деталей и сложных конструкций в коде. Пишите только тот код, который необходим для решения задачи.
- Работоспособность и надежность: Простота не должна жертвовать работоспособностью и надежностью программы. ПО должно продолжать работать правильно и стабильно при любых условиях.
- Легкость сопровождения и расширения: ПО должно быть легко поддерживаемым и расширяемым. Простой код легче изменить, доработать и адаптировать под новые требования.
Принцип KISS подчеркивает важность обеспечения минимального количества сложности в ПО, что способствует повышению его читаемости, надежности и производительности. Он учитывает тот факт, что чем проще решение, тем менее вероятно наличие ошибок и проблем в будущем.
https://easyoffer.ru/question/494
Назови четыре уровня изоляции транзакций
6%
В стандарте ANSI/ISO SQL определены четыре уровня изоляции транзакций:
- READ UNCOMMITTED (Неподтвержденное чтение):
Это самый низкий уровень изоляции.
Позволяет одной транзакции видеть изменения, внесенные другой, даже если эти изменения еще не зафиксированы (т.е., транзакция еще не завершена).
Возможно возникновение проблем с неподтвержденным чтением и потерянными обновлениями.
- READ COMMITTED (Подтвержденное чтение):
Этот уровень гарантирует, что транзакция увидит только изменения, которые были подтверждены другими.
Избегает проблем с неподтвержденным чтением, но может возникнуть проблема с повторяемым чтением.
- REPEATABLE READ (Повторяемое чтение):
Гарантирует, что каждый раз, когда транзакция читает данные, она видит те же самые данные, что и в начале, даже если другая вносит изменения в эти данные.
Избегает проблемы с повторяемым чтением, но может привести к проблемам с фантомными записями (phantom reads).
- SERIALIZABLE (Сериализуемость):
Это самый высокий уровень изоляции.
Гарантирует, что все операции чтения и записи будут видеть состояние данных, как если бы они выполнялись последовательно (одна за другой), даже если фактически они выполняются параллельно.
Избегает проблем с повторяемым чтением и фантомными записями, но может привести к увеличению блокировок и ухудшению производительности.
Выбор уровня изоляции зависит от конкретных требований вашего приложения к согласованности данных и производительности.
https://easyoffer.ru/question/318
Какие минусы есть у индекса
6%
Индексы в базах данных - это мощный инструмент для оптимизации запросов и ускорения доступа к данным, но они также имеют некоторые минусы:
- Затраты на хранение: Они занимают дополнительное место на диске для хранения дополнительной структуры данных. Это может быть значительным фактором для больших таблиц с множеством индексов.
- Затраты на обновление: При вставке, обновлении или удалении записей из таблицы они также должны быть обновлены, чтобы отразить изменения. Это может привести к дополнительным затратам на обслуживание индексов и замедлить операции записи.
- Ухудшение производительности при обновлении: Их обновление может потребовать блокировки и увеличить время выполнения операций обновления, особенно для таблиц с большим количеством индексов.
- Выбор неоптимальных индексов: Неправильно выбранные или ненужные индексы могут привести к избыточному использованию ресурсов и ухудшению производительности запросов.
- Фрагментация индексов: Постоянные операции вставки, обновления и удаления могут привести к их фрагментации, что может уменьшить их эффективность.
- Необходимость перестройки: Иногда они требуют перестройки для оптимизации их производительности, особенно если таблица значительно изменилась или индекс стал фрагментированным.
Несмотря на эти минусы, правильно спроектированные и использованные индексы могут значительно улучшить производительность запросов к базе данных. Поэтому важно тщательно оценивать их необходимость и выбирать наиболее подходящие для конкретных запросов и таблиц.
https://easyoffer.ru/question/317
Какие есть уровни изоляции транзакций
6%
Изоляция в смысле ACID означает, что конкурентно выполняемые транзакции изолированы друг от друга — они не могут помешать друг другу. Классические учебники по базам данных понимают под изоляцией сериализуемость (serializability). То есть каждая транзакция выполняется так, будто она единственная во всей базе. БД гарантирует, что результат фиксации транзакций такой же, как если бы они выполнялись последовательно (serially, одна за другой), хотя в реальности они могут выполняться конкурентно.
Чтение зафиксированных данных (read comitted):
Самый базовый уровень изоляции транзакций — чтение зафиксированных данных. Он обеспечивает две гарантии:
При чтении из БД клиент видит только зафиксированные данные (никаких «грязных» операций чтения).
При записи в БД можно перезаписывать только зафиксированные данные (никаких «грязных» операций записи).
«Грязные» операции чтения. Клиент читает записанные другим клиентом данные до их фиксации. Уровень изоляции чтения зафиксированных данных и более сильные предотвращают «грязные» операции чтения.
«Грязные» операции записи. Клиент перезаписывает данные, которые другой клиент записал, но еще не зафиксировал. Практически все реализации транзакций предотвращают «грязные» операции записи.
Изоляция снимков состояния и воспроизводимое чтение:
Ее идея состоит в том, что каждая из транзакций читает данные из согласованного снимка состояния БД, то есть видит данные, которые были зафиксированы в базе на момент ее (транзакции) начала. Даже если данные затем были изменены другой транзакцией, каждая транзакция видит только старые данные, по состоянию на конкретный момент времени. Позволяет предотвратить асимметрии чтения.
Асимметрия чтения (невоспроизводимое чтение). Клиент видит различные части базы данных по состоянию на разные моменты времени. Чаще всего такую проблему предотвращают с помощью изоляции снимков состояния, при которой транзакция читает данные из согласованного снимка состояния, соответствующего определенному моменту времени. Обычно это реализуется благодаря многоверсионному управлению конкурентным доступом (MVCC).
Сериализуемость (serializability):
Обычно считается самым сильным уровнем изоляции. Она гарантирует, что даже при конкурентном выполнении транзакций результат останется таким же, как и в случае их последовательного (по одной за раз) выполнения, без всякой конкурентности. Следовательно, база данных гарантирует, что правильно выполняющиеся последовательно транзакции будут столь же правильно выполняться конкурентно. Другими словами, база предотвращает все возможные состояния гонки.
Большинство современных БД, обеспечивающих сериализуемость, применяют один из трех методов:
По-настоящему последовательное выполнение транзакций. Если вы можете сделать отдельные транзакции очень быстрыми, причем количество транзакций, обрабатываемых за единицу времени на одном ядре CPU, достаточно невелико, то для обработки этот вариант окажется простым и эффективным.
Двухфазная блокировка. На протяжении десятилетий она была стандартным способом обеспечения сериализуемости, но многие приложения стараются ее не использовать из-за плохих показателей производительности.
Сериализуемая изоляция снимков состояния (SSI). Довольно свежий алгоритм, лишенный практически всех недостатков предыдущих подходов. В нем используется оптимистический подход, благодаря чему транзакции выполняются без блокировок. Перед фиксацией транзакции выполняется проверка, и если выполнение было несериализуемым, то транзакция прерывается без фиксации.
https://easyoffer.ru/question/316
Что такое шардирование
6%
Шардирование (sharding) - это метод горизонтального масштабирования, который позволяет распределить данные по нескольким серверам или узлам (шардам). Этот метод используется для улучшения производительности и масштабируемости баз данных, особенно в случае больших объемов данных или высокой нагрузки.
Как правило, при шардировании данные разбиваются на несколько фрагментов (шардов), и каждый шард хранится на отдельном сервере или узле. Разделение происходит по определенному критерию, например, по значению ключа или хеш-функции. Это позволяет равномерно распределить данные и запросы между различными узлами, уменьшить нагрузку на них и повысить общую производительность системы.
Преимущества:
- Масштабируемость: Этот метод позволяет распределить данные по нескольким серверам, что увеличивает общую производительность и способность обрабатывать большие объемы данных.
- Устойчивость к отказам: Распределение данных между несколькими узлами делает систему более устойчивой к отказам, так как отказ одного узла не приводит к полной недоступности данных.
- Балансировка нагрузки: Равномерное распределение данных между шардами позволяет более эффективно распределять нагрузку между серверами и узлами.
- Гибкость: Позволяет настроить базу данных под конкретные требования производительности и нагрузки, выбрав оптимальное количество и конфигурацию шардов.
Однако шардирование также имеет свои недостатки, такие как сложность настройки и управления, потенциальные проблемы с консистентностью данных и сложность выполнения запросов, которые требуют доступа к данным, хранящимся на нескольких шардах. Поэтому необходимо внимательно оценить преимущества и недостатки перед внедрением шардирования в систему.
https://easyoffer.ru/question/315
В чем разница между Posgres и MySQL
6%
PostgreSQL и MySQL - это две реляционные базы данных, предоставляющие функциональность SQL и используются в различных приложениях и проектах. Вот основные различия:
- Лицензия:
- PostgreSQL распространяется под лицензией, которая является свободной и открытой.
- MySQL распространяется под двумя лицензиями: GNU GPL и коммерческой.
- Реализация стандартов SQL:
- PostgreSQL стремится к полной совместимости со стандартами SQL и реализует широкий спектр ее функций, включая более сложные аналитические и поддержку оконных функций.
- MySQL свободно интерпретирует стандарты SQL и может не поддерживать некоторые более продвинутые возможности, предоставляемые PostgreSQL.
- Синтаксис и функциональность:
- PostgreSQL обычно считается более мощным и гибким в плане возможностей и функциональности. Он предоставляет богатый набор типов данных, поддержку транзакций, горизонтальное масштабирование и другие продвинутые функции.
- MySQL, с другой стороны, часто используется для более простых задач и может быть более прямым в использовании. Он имеет более ограниченный набор типов данных и функциональность, но при этом может быть проще в настройке и использовании.
- Производительность:
- Обе базы данных обеспечивают хорошую производительность для большинства типичных приложений. Однако для конкретных сценариев использования и типов запросов производительность может различаться.
- В целом, MySQL может проявлять себя лучше в некоторых случаях, особенно при использовании кэширования и оптимизаций для конкретных запросов.
- Расширяемость и экосистема:
- PostgreSQL имеет богатую экосистему инструментов и расширений, которые могут быть использованы для улучшения и расширения его функциональности.
- MySQL также имеет широкую поддержку и большое сообщество пользователей, но его экосистема может быть не такой обширной.
Обе базы данных имеют свои сильные и слабые стороны, и выбор между ними зависит от конкретных требований и характеристик вашего приложения.
https://easyoffer.ru/question/314
Что знаешь про нормализацию
6%
Нормализация - это процесс организации данных с целью уменьшения избыточности и обеспечения целостности данных. Процесс включает в себя разделение данных на отдельные таблицы и установление связей между этими таблицами. Основные принципы нормализации определены в нормальных формах.
Вот основные принципы:
- Первая нормальная форма (1NF):
- Все атрибуты в таблице должны быть атомарными, то есть каждый атрибут должен содержать только одно значение.
- Все повторяющиеся группы атрибутов должны быть удалены.
- Вторая нормальная форма (2NF):
- Таблица должна находиться в 1NF.
- Каждый нетривиальный атрибут должен быть полностью функционально зависим от первичного ключа, то есть отсутствие частичной функциональной зависимости.
- Третья нормальная форма (3NF):
- Таблица должна находиться в 2NF.
- Нет зависимостей на основе неключевых атрибутов, то есть отсутствие транзитивных зависимостей.
- Нормальная форма Бойса-Кодда (BCNF):
- Расширение третьей нормальной формы, в котором дополнительное требование состоит в том, чтобы каждое нетривиальное функциональное зависимость A → B, где B не является ключом, было зависимым только от кандидат-ключа.
- Четвертая нормальная форма (4NF):
- После разделения данных в 3NF, не должно быть многозначных зависимостей относительно многозначных зависимостей.
- Пятая нормальная форма (5NF):
- Основная цель - минимизировать избыточные связи между таблицами путем удаления зависимостей и разделения данных.
Применение нормализации в базе данных позволяет уменьшить дублирование данных, уменьшить объем хранимой информации, обеспечить более простой доступ к данным и повысить целостность данных. Однако следует помнить, что избыточная нормализация может привести к увеличению сложности запросов и ухудшению производительности. Поэтому необходимо находить баланс между нормализацией и производительностью системы.
https://easyoffer.ru/question/313
Что такое Docker Compose
6%
Docker Compose - это инструмент для определения и запуска многоконтейнерных приложений с помощью простого файла конфигурации YAML. Он позволяет вам определить конфигурацию вашего приложения в виде сервисов, каждый из которых может быть запущен в отдельном контейнере, и объединить эти сервисы в единое приложение.
Основные функции:
- Определение сервисов: Вы можете определить несколько сервисов, которые составляют ваше приложение, в файле docker-compose.yml. Каждый сервис может быть описан с использованием различных параметров, таких как образ, сетевые настройки, переменные окружения и другие параметры конфигурации.
- Запуск и управление приложением: Он позволяет запускать и управлять многоконтейнерными приложениями одной командой. Вы можете использовать команды типа
docker-compose up
для запуска приложения на основе конфигурации из файла docker-compose.yml. - Сетевая конфигурация: Автоматически настраивает сеть между контейнерами, позволяя им взаимодействовать друг с другом через сеть. Вы также можете определить пользовательские сети и связи между сервисами в файле конфигурации.
- Переопределение параметров: Вы можете переопределить параметры конфигурации сервисов из командной строки при запуске приложения, что позволяет настраивать поведение приложения для различных сред или конфигураций.
- Управление жизненным циклом контейнеров: Обеспечивает простой способ управления жизненным циклом контейнеров, включая их запуск, остановку, перезапуск и удаление.
Docker Compose упрощает развертывание и управление многоконтейнерными приложениями, делая процесс разработки и тестирования более эффективным и удобным.
https://easyoffer.ru/question/52
Что дает poetry
6%
Poetry - это инструмент для управления зависимостями и пакетами в проектах. Он предоставляет удобный способ управления зависимостями, виртуальными окружениями, сборкой и публикацией пакетов. Вот несколько основных возможностей:
- Управление зависимостями: Этот инструмент использует файл pyproject.toml для определения зависимостей проекта. Этот файл содержит информацию о зависимостях вашего проекта, включая название пакета, версию и другие метаданные. Он позволяет легко добавлять, удалять и обновлять зависимости с помощью команды
poetry add
. - Виртуальные окружения: Автоматически создает виртуальное окружение для вашего проекта и управляет зависимостями внутри этого окружения. Это позволяет изолировать зависимости проекта от других проектов и предотвращает конфликты версий пакетов.
- Управление проектом: Предоставляет удобные команды для управления проектом, такие как создание нового проекта, установка зависимостей, управление сценариями (scripts) и т.д.
- Сборка и публикация пакетов: С помощью этого инструмента вы можете легко собирать и публиковать свои пакеты на PyPI. Он автоматически создает файлы METADATA и setup.py для вашего пакета и предоставляет удобные команды для сборки и публикации.
- Консистентность и предсказуемость: Стремится обеспечить консистентность и предсказуемость в управлении зависимостями и средой выполнения проекта. Он использует блокировку версий для фиксации версий зависимостей и гарантирует, что проект будет воспроизводимым на разных системах.
В целом, Poetry предоставляет удобный и современный способ управления зависимостями и проектами, что делает процесс разработки более эффективным и удобным.
https://easyoffer.ru/question/54
Что такое виртуальное окружение
6%
Виртуальное окружение (virtual environment) - это изолированная среда, в которой устанавливаются зависимости и библиотеки для конкретного проекта, отделенная от системной установки. Эта среда позволяет изолировать проекты друг от друга и от системы, а также управлять зависимостями внутри каждого проекта без вмешательства в системные установки.
Преимущества использования:
- Изоляция зависимостей: Это позволяет устанавливать и использовать определенные версии библиотек и зависимостей для каждого проекта, без влияния на другие проекты или системные установки. Позволяет избежать конфликтов между версиями библиотек и обеспечивает надежность и воспроизводимость проекта.
- Управление зависимостями: Позволяет устанавливать, обновлять и удалять зависимости для конкретного проекта независимо от других проектов. Это делает управление зависимостями более гибким и удобным.
- Изоляция проекта: Использование виртуальных окружений позволяет легко переносить проекты между различными системами или средами разработки, так как все зависимости и настройки окружения хранятся локально внутри проекта.
- Безопасность и стабильность: Изоляция проекта от системных установок помогает избежать возможных проблем совместимости или несовместимости зависимостей и обеспечивает стабильность и надежность работы проекта.
Для создания и использования виртуального окружения часто используются инструменты, такие как virtualenv
, venv
или сторонние инструменты управления зависимостями, такие как Pipenv
или Poetry
.
https://easyoffer.ru/question/60
Какие инструменты для виртуального окружения используются
6%
Для создания и управления виртуальными окружениями существует несколько инструментов. Вот некоторые из наиболее распространенных:
- virtualenv: Это один из самых популярных инструментов для создания виртуальных окружений. Он позволяет создавать изолированные среды, в которых можно устанавливать и использовать зависимости для конкретных проектов.
- venv: Это встроенный инструмент для создания виртуальных окружений, доступный начиная с Python 3.3. Он предоставляет функциональность, аналогичную virtualenv, но является частью стандартной библиотеки.
- Pipenv: Это инструмент для управления зависимостями и виртуальными окружениями. Он комбинирует возможности управления зависимостями с помощью
pip
и создания виртуальных окружений с помощьюvirtualenv
илиvenv
. Pipenv также автоматически создает и активирует виртуальное окружение для каждого проекта. - Poetry: Это современный инструмент для управления зависимостями и виртуальными окружениями. Он предоставляет возможности для управления зависимостями, создания виртуальных окружений, управления сценариями (scripts) и публикации пакетов. Poetry использует файл pyproject.toml для определения зависимостей и настроек проекта.
Эти инструменты предоставляют удобные способы создания и управления виртуальными окружениями, что помогает изолировать зависимости проектов и обеспечить надежность и воспроизводимость работы приложений. Выбор конкретного инструмента зависит от ваших предпочтений и требований проекта.
https://easyoffer.ru/question/61
Как работает хеш таблица
6%
Хеш-таблица (hash table) - это структура данных, которая использует хэш-функцию для быстрого поиска, вставки и удаления элементов. В основе ее работы лежит идея преобразования ключей элементов в числовые значения (хэши), которые затем используются для определения местоположения элементов в таблице.
Вот основные шаги работы:
- Хэширование ключей: Каждый ключ элемента преобразуется в числовое значение с помощью хэш-функции. Она берет ключ и преобразует его в индекс (хэш), который указывает на ячейку или слот в массиве.
- Разрешение коллизий: Поскольку разные ключи могут быть преобразованы в один и тот же хэш (коллизия), необходимо иметь механизм разрешения коллизий. Существуют различные методы разрешения коллизий, такие как метод цепочек (chaining) и метод открытой адресации (open addressing).
- Метод цепочек: В этом методе каждая ячейка представляет собой связный список элементов с одним и тем же хэшем. При коллизии элемент добавляется в соответствующий список.
- Метод открытой адресации: В нем, если возникает коллизия, ищется следующая свободная ячейка в таблице (обычно с помощью другой хэш-функции или последовательного поиска), где элемент может быть помещен.
- Доступ к элементам: Для доступа к элементу нужно выполнить следующее:
- Применить хэш-функцию к ключу, чтобы определить индекс в таблице.
- В ячейке таблицы есть элемент(ы), сравнить ключ(и) с искомым.
- Ключ совпадает, элемент найден.
- Ключ не совпадает, применить метод разрешения коллизий для поиска элемента.
- Вставка и удаление элементов: Процесс вставки и удаления элементов аналогичен процессу доступа к элементам. Сначала вычисляется хэш ключа, затем используется метод разрешения коллизий для вставки или удаления элемента.
Хеш-таблицы обеспечивают быстрый доступ к элементам в среднем случае за время O(1), что делает их эффективным инструментом для реализации ассоциативных массивов, множеств и других структур данных, требующих эффективного поиска, вставки и удаления элементов.
https://easyoffer.ru/question/187
Чем хорош FastAPI
6%
FastAPI - это фреймворк для создания веб-приложений, который обеспечивает высокую производительность, интуитивно понятный синтаксис и автоматическую генерацию документации API. Вот несколько причин, почему он является хорошим выбором:
- Высокая производительность: Основан на Starlette, асинхронном фреймворке для веб-приложений, и использует асинхронные возможности Python 3.7+ для обеспечения высокой производительности. Это позволяет обрабатывать большое количество запросов одновременно и эффективно использовать ресурсы сервера.
- Декларативный синтаксис: Предоставляет декларативный синтаксис для определения маршрутов и схем данных с использованием аннотаций. Это делает код более читаемым и понятным, а также упрощает разработку и поддержку приложения.
- Автоматическая генерация документации: Автоматически создает интерактивную документацию API на основе аннотаций и типов данных. Это позволяет разработчикам быстро создавать и документировать API без дополнительного кодирования.
- Встроенная поддержка асинхронности: Полностью поддерживает асинхронные операции и обработку запросов, что позволяет создавать высокопроизводительные веб-приложения, используя асинхронные возможности.
- Встроенная валидация данных: Автоматически выполняет валидацию входных данных на основе аннотаций и схем данных Pydantic. Это позволяет обрабатывать ошибки и неправильные запросы до того, как они достигнут обработчика маршрута, что обеспечивает более надежное и безопасное приложение.
- Интеграция с OpenAPI и Swagger UI: Генерирует спецификацию OpenAPI для вашего API автоматически, что позволяет использовать сторонние инструменты и сервисы для автоматической генерации клиентских библиотек и тестирования. Он также включает встроенную поддержку Swagger UI для просмотра и тестирования API через веб-интерфейс.
В целом, FastAPI предоставляет простой и эффективный способ создания высокопроизводительных веб-приложений с автоматической генерацией документации API и встроенной поддержкой асинхронности.
https://easyoffer.ru/question/579
Что знаешь о хеш функции
6%
Хэш-функция (hash function) - принимает входные данные (например, строку или байтовую последовательность) и преобразует их в фиксированный размерный хэш (хэш-значение), которое обычно представляет собой строку фиксированной длины. Основная цель состоит в том, чтобы быстро и эффективно преобразовывать входные данные в хэш-значения, которые можно использовать для различных целей, таких как проверка целостности данных, поиск и сравнение элементов, хранение паролей и т. д.
Вот несколько ключевых особенностей:
- Единообразие (Uniformity): Должна обеспечивать равномерное распределение хэш-значений по всем возможным входным данным. Это означает, что каждое возможное хэш-значение должно иметь одинаковую вероятность быть сгенерированным для любых входных данных.
- Однозначность (Deterministic): Для одних и тех же входных данных эта функция всегда должна генерировать одно и то же хэш-значение. Это позволяет использовать ее для проверки целостности данных и сравнения элементов.
- Быстродействие (Efficiency): Должна быть эффективной и быстрой, чтобы обеспечить высокую производительность при обработке больших объемов данных.
- Равномерное распределение (Uniform distribution): Должна равномерно распределять хэш-значения по всем возможным выходным диапазонам. Это помогает снизить вероятность коллизий.
- Необратимость (Irreversibility): Должна быть необратимой, то есть невозможно восстановить исходные данные из хэш-значения. Это обеспечивает безопасность данных, так как злоумышленники не могут получить доступ к исходным данным, имея только хэш-значение.
Примеры широко используемых хэш-функций включают SHA-1, SHA-256, MD5 и другие. В зависимости от конкретных требований и применений, выбирается подходящая хэш-функция.
https://easyoffer.ru/question/186
Что такое HTTP и HTTPs
6%
HTTP - протокол передачи данных, который используется для обмена информацией. Он определяет формат и структуру сообщений, и правила взаимодействия между клиентом и сервером. Является основным протоколом для передачи веб-страниц, изображений, и других ресурсов.
Основные характеристики:
- Простота: Использует структуру запросов и ответов, состоящую из заголовков и тела сообщения. Это делает его легким в использовании.
- Состояние: Является протоколом без состояния, что означает, что каждый запрос обрабатывается независимо от предыдущих запросов. Сервер не хранит информацию о состоянии клиента между запросами.
- Безопасность: Не обеспечивает шифрование данных, передаваемых между клиентом и сервером, что делает передачу не безопасной.
HTTPS - защищенная версия протокола HTTP, которая обеспечивает шифрование данных и безопасную передачу информации между клиентом и сервером. HTTPS использует протокол TLS или его предшественника SSL для шифрования данных и проверки подлинности сервера.
Основные характеристики:
- Шифрование данных: Использует шифрование для защиты данных, передаваемых между клиентом и сервером. Это обеспечивает конфиденциальность и целостность данных во время их передачи по сети.
- Аутентификация сервера: Обеспечивает аутентификацию сервера, что позволяет клиенту убедиться в том, что он связывается с правильным сервером и предотвращает атаки типа “перехват и подмена”.
- Доверие и сертификаты: Использует цифровые сертификаты для аутентификации серверов и создания доверия между клиентом и сервером. Сертификаты выдаются доверенными ЦС, которые проверяют подлинность серверов и подтверждают их легитимность.
Использование HTTPS рекомендуется для всех веб-сайтов и веб-приложений, особенно для тех, которые обрабатывают конфиденциальные данные пользователей, такие как пароли, данные кредитных карт и личная информация. HTTPS обеспечивает безопасную и защищенную передачу данных, защищая пользователей от различных видов атак и вмешательства.
https://easyoffer.ru/question/691
Как распределяешь свое рабочее время
6%
https://youtu.be/oB_COeDpNas?t=421
https://youtu.be/SJxgQFKp2qc?t=442
https://easyoffer.ru/question/492
Что такое async
6%
“async” - используется для определения асинхронных функций и контекста выполнения. Оно связано с асинхронным программированием, которое позволяет эффективно использовать асинхронные операции ввода-вывода (I/O), такие как сетевые запросы, базы данных и другие блокирующие операции, без блокировки основного потока выполнения.
Основные концепции:
- Асинхронные функции (async functions): Функции определяются с помощью ключевого слова “async”. Они могут содержать асинхронные операции и выражения, которые могут быть приостановлены и продолжены позже, когда завершится операция ввода-вывода. Для объявления этой функции используется синтаксис:
async def my_async_function(): # Асинхронные операции
- Контекст выполнения асинхронного кода (async context): Код выполняется в асинхронном контексте, который создается с помощью ключевого слова “asyncio”. Контекст выполнения обеспечивает механизм управления выполнением асинхронного кода и планирования операций. Для входа в этот контекст используется синтаксис:
import asyncio async def main(): # Асинхронный код asyncio.run(main())
- Ожидание асинхронных операций (await): В этих функциях можно использовать ключевое слово “await” для ожидания завершения асинхронных операций ввода-вывода. Оператор “await” блокирует выполнение данной функции до тех пор, пока эта операция не будет завершена. Например:
async def fetch_data(url): # Ожидание завершения сетевого запроса response = await aiohttp.get(url) return response
Асинхронное программирование позволяет эффективно использовать ресурсы процессора и управлять множеством асинхронных операций ввода-вывода без блокировки основного потока выполнения. Это особенно полезно в веб-приложениях и сервисах, которые часто выполняют большое количество асинхронных операций, таких как сетевые запросы и базы данных.
https://easyoffer.ru/question/231
Для чего можно использовать celery
6%
Celery - это очередь задач (task queue), которая позволяет выполнять задачи асинхронно и распределять их между различными рабочими процессами или узлами. Она обычно используется для выполнения долгих и трудоемких операций в фоновом режиме, таких как обработка задач веб-приложений, отправка электронных писем, генерация отчетов, обработка изображений, а также многие другие.
Вот некоторые типичные сценарии использования Celery:
- Обработка задач в фоновом режиме: Позволяет обрабатывать задачи в фоновом режиме, что позволяет вашему веб-приложению быстро возвращать ответ пользователю, не ожидая завершения выполнения задачи. Это особенно полезно для выполнения операций, которые могут занимать длительное время, таких как обработка данных или генерация отчетов.
- Отправка электронных писем: Может использоваться для отправки электронных писем асинхронно. Это позволяет вашему приложению отправлять уведомления и письма пользователям без блокировки основного потока выполнения.
- Обработка изображений: Может использоваться для обработки изображений асинхронно. Например, вы можете использовать его для изменения размера изображений, преобразования форматов или применения фильтров без задержки ответа вашего приложения.
- Периодические задачи: Поддерживает периодические задачи, которые могут выполняться автоматически по расписанию. Это позволяет вам запускать задачи на основе времени, что особенно полезно для выполнения регулярных обновлений и обслуживания.
- Распределенные вычисления: Позволяет распределенно выполнять задачи на различных узлах или рабочих процессах, что позволяет обрабатывать большие объемы данных и операций параллельно.
Celery предоставляет гибкую и мощную инфраструктуру для асинхронного выполнения задач, что делает его полезным инструментом для множества приложений и сценариев использования.
https://easyoffer.ru/question/232
В чём суть проекта Celery
6%
Проект Celery представляет собой распределенную систему для выполнения асинхронных задач. Он позволяет создавать, планировать и выполнять задачи параллельно на нескольких рабочих узлах или процессах, что обеспечивает масштабируемость и эффективное использование ресурсов.
Основные компоненты проекта Celery:
- Брокер сообщений (Message Broker): Использует брокер сообщений для передачи задач между клиентскими приложениями и рабочими процессами. Популярными брокерами сообщений для Celery являются RabbitMQ, Redis и Apache Kafka.
- Очередь задач (Task Queue): Очередь задач является центральной частью Celery и отвечает за прием, хранение и распределение задач между рабочими процессами. Очередь задач позволяет эффективно управлять и планировать выполнение задач в асинхронной среде.
- Рабочий процесс (Worker): Рабочий процесс - это процесс или узел, который выполняет асинхронные задачи, полученные из очереди задач. Клиентское приложение отправляет задачи в очередь, а затем рабочие процессы забирают и выполняют эти задачи в фоновом режиме.
- Задача (Task): Задача представляет собой функцию или метод, которая должна быть выполнена асинхронно. Она может быть определена с использованием декоратора
@task
и добавлена в очередь задач для выполнения. - Результат (Result): Позволяет получать результат выполнения задачи после ее завершения. Результат может быть получен немедленно или асинхронно, в зависимости от настроек и требований приложения.
Проект Celery обеспечивает гибкую и масштабируемую инфраструктуру для выполнения асинхронных задач. Он широко используется для обработки фоновых задач в веб-приложениях, обработки данных, отправки электронных писем, создания расписаний и многих других сценариев использования, где требуется асинхронная обработка и выполнение задач.
https://easyoffer.ru/question/233
Что тебе известно о бинарном дереве
6%
Бинарное дерево - это структура данных, состоящая из узлов, каждый из которых имеет не более двух потомков: левого и правого. Каждый узел содержит некоторое значение (ключ) и ссылки на его левого и правого потомков (или на None, если потомок отсутствует).
Основные характеристики бинарного дерева:
- Корень (Root): Это верхний узел дерева, от которого начинается структура.
- Уровень (Level): Каждый узел дерева расположен на определенном уровне. Уровень корня равен 0, уровень его детей равен 1 и так далее.
- Листья (Leaves): Это узлы дерева, у которых отсутствуют потомки. То есть они конечные в дереве.
- Высота (Height): Это количество уровней в дереве. Максимальная высота бинарного дерева равна максимальному количеству уровней от корня до самого далекого листа.
- Балансировка (Balanced): Бинарное дерево называется сбалансированным, если разница в высоте между левым и правым поддеревьями на каждом узле не превышает 1. Такие деревья обеспечивают эффективный поиск, вставку и удаление элементов.
- Порядок (Traversal): Существуют различные способы обхода бинарного дерева для выполнения операций с его элементами. Эти методы включают в себя префиксный (pre-order), инфиксный (in-order) и постфиксный (post-order) обходы.
- Операции: Бинарное дерево обычно поддерживает операции вставки, удаления и поиска элементов. Эти операции выполняются за время O(log n) в сбалансированных деревьях и до O(n) в худшем случае в несбалансированных.
Бинарные деревья широко применяются в компьютерных науках для построения эффективных структур данных, таких как двоичные поисковые деревья, кучи и многие другие. Они позволяют эффективно хранить, обрабатывать и извлекать данные, делая их незаменимым инструментом в различных алгоритмах и приложениях.
https://easyoffer.ru/question/181
Для чего подходят асинхронные операции
6%
- Чтобы сэкономить время
- Чтобы ускорить работу программы
- Чтобы программа не зависала ожидая вычислений со стороны, а продолжала работу
- Чтобы непрерывно выполнять большое количество заданий
Асинхронные операции подходят для решения задач, которые включают в себя блокирующие операции ввода-вывода (I/O-bound operations), то есть операции, которые требуют времени на ожидание ответа от внешних источников данных, таких как сетевые запросы, операции с базой данных, чтение и запись файлов и т. д.
Преимущества использования асинхронных операций:
- Улучшение производительности: Позволяют эффективно использовать ресурсы процессора, так как они не блокируют основной поток выполнения в ожидании завершения операции I/O. Вместо этого, когда операция завершается, управление передается другим операциям, что позволяет увеличить производительность приложения.
- Масштабируемость: Обеспечивают лучшую масштабируемость приложений, особенно в случае большого количества одновременных запросов. При использовании сетевых приложений, например, они позволяют обрабатывать тысячи или даже миллионы одновременных подключений.
- Улучшение отзывчивости приложения: Использование позволяет сделать ваше приложение более отзывчивым, так как оно не будет блокироваться при выполнении долгих операций I/O. Пользователи будут получать быстрый ответ от приложения даже в случае выполнения долгих операций.
- Экономия ресурсов: Позволяют более эффективно использовать ресурсы сервера, так как они позволяют обрабатывать большое количество запросов с использованием меньшего количества потоков или процессов.
Примеры задач, для которых подходят асинхронные операции, включают в себя веб-серверы, API, обработку данных в реальном времени, микросервисы, чаты и мессенджеры, а также любые приложения, работающие с большим объемом асинхронных запросов и операций I/O.
https://easyoffer.ru/question/234
Что знаешь о принципах программирования DRY
6%
DRY (Don’t Repeat Yourself) - это принцип, который подразумевает, что каждая часть знаний или функциональности в программе должна иметь единственное, безошибочное и авторитетное представление в рамках системы. Он бращает внимание на избегание дублирования кода, данных и концепций в программном коде.
Основные идеи, связанные с этим принципом:
- Избегайте дублирования кода: Дублирование кода увеличивает сложность кодовой базы, делает ее труднее в поддержке и изменении. Поэтому следует стараться избегать повторения одинаковых или похожих кусков кода.
- Разделение кода на модули и функции: Часто используемый код должен быть вынесен в отдельные функции или модули, чтобы он мог быть повторно использован в различных частях программы.
- Использование абстракций и шаблонов проектирования: Использование абстракций и шаблонов проектирования позволяет создавать универсальные решения, которые можно использовать повторно в различных контекстах.
- Управление данными: Дублирование данных также может привести к проблемам согласованности и целостности. Поэтому следует стремиться к хранению данных в единственном источнике и использованию ссылок на него в других частях программы.
Преимущества применения этого принципа:
- Уменьшение объема кода: Избегание дублирования кода приводит к уменьшению объема кода, что облегчает его понимание и поддержку.
- Улучшение читаемости кода: Код становится более понятным и читаемым, так как повторяющиеся фрагменты убираются в отдельные функции или модули.
- Облегчение обслуживания: Изменения в программе требуют меньше усилий, так как они вносятся в единственном месте, а не в нескольких копиях кода.
Принцип DRY является одним из основных принципов разработки ПО и помогает создавать более эффективный, гибкий и поддерживаемый код.
https://easyoffer.ru/question/495
Какие коллекции из модуля collections знаешь
6%
Модуль collections
предоставляет различные специализированные коллекции, которые расширяют функциональность встроенных, таких как списки, словари, множества и др. Некоторые из наиболее часто используемых коллекций из этого модуля:
-
namedtuple
: Создает именованные кортежи, которые представляют собой легковесную альтернативу определению собственных классов для представления данных. -
deque
: Это двусторонняя очередь (double-ended queue), которая предоставляет эффективные операции добавления и удаления элементов как в начале, так и в конце коллекции. -
Counter
: Это подсчетчик элементов, который подсчитывает количество вхождений каждого элемента в последовательность и предоставляет удобный доступ к этим значениям. -
OrderedDict
: Это словарь, который помнит порядок вставки элементов, что полезно при итерации и выводе результатов в определенном порядке. -
defaultdict
: Это словарь, который автоматически создает значения по умолчанию для отсутствующих ключей при первом обращении к ним. -
ChainMap
: Представляет собой объединение нескольких словарей в один и обеспечивает удобный способ просмотра и обновления значений в этих словарях. -
UserDict
: Это базовый класс, который позволяет создавать пользовательские классы словарей, наследуясь от него и переопределяя методы словаря. -
UserList
: АналогичноUserDict
, но для списков. -
UserString
: АналогичноUserDict
, но для строк.
Эти коллекции предоставляют дополнительные возможности и улучшают функциональность базовых коллекций, делая их более удобными и эффективными для использования в различных сценариях.
https://easyoffer.ru/question/805
Что знаешь о итерируемых типах данных
6%
Итерируемые типы данных представляют собой объекты, которые могут быть перебраны поэлементно с использованием цикла или функции, такой как for
или while
. Это включает в себя типы данных, которые содержат последовательности элементов, такие как списки, строки, кортежи, множества и словари, а также другие объекты, которые реализуют протокол итератора.
Вот основные характеристики итерируемых типов данных:
- Поддержка итерации: Предоставляют возможность перебора элементов с использованием циклов или функций итерации, таких как
for
иwhile
. - Использование встроенной функции
iter()
: Функцияiter()
может быть использована для создания итератора из итерируемого объекта. Он предоставляет метод\_\_next\_\_()
, который возвращает следующий элемент из итерируемого объекта по требованию. - Использование встроенной функции
next()
: Функцияnext()
может быть использована для получения следующего элемента из итератора. Когда все элементы итерируемого объекта были извлечены, вызывается исключениеStopIteration
. - Поддержка для циклов
for
: Такие объекты могут быть использованы в циклеfor
для последовательного перебора элементов. - Использование встроенных методов: Также предоставляют встроенные методы для работы с элементами, такие как методы списков (
append()
,extend()
,remove()
, и т. д.).
Итерируемые типы данных являются фундаментальными для работы с коллекциями элементов и широко используются в различных аспектах программирования, включая обработку данных, манипулирование строками, работу с файлами, а также в различных структурах данных и алгоритмах.
https://easyoffer.ru/question/806
Какие способы есть написать свой генератор
6%
Можно через Выражение генератор
Или через Функцию генератор используя yield
https://easyoffer.ru/question/807
В чем разница между MRO2 и MRO3
6%
В том, что с python3 все классы начали наследоваться от класса object.
MRO2 (Method Resolution Order 2) и MRO3 (Method Resolution Order 3) являются алгоритмами разрешения порядка вызова методов в множественном наследовании. Эти алгоритмы используются для определения того, какой метод будет вызван при обращении к методу экземпляра класса, когда этот метод присутствует в нескольких классах, связанных цепочкой наследования.
Основное отличие между MRO2 и MRO3 заключается в том, как они обрабатывают классы, которые имеют одинаковые имена методов в цепочке наследования.
- MRO2 (Python 2): В Python 2 использовался алгоритм MRO2, который был основан на алгоритме C3 Linearization. Он приводил к проблемам с алгоритмическими рекурсивными зависимостями в некоторых случаях множественного наследования, особенно когда классы имели сложные структуры наследования.
- MRO3 (Python 3): В Python 3 был заменен на более усовершенствованный алгоритм MRO3, который является модифицированным алгоритмом C3 Linearization. Он решает проблемы, связанные с амбигуитетом при разрешении порядка вызова методов в множественном наследовании и обеспечивает более предсказуемое поведение в таких случаях.
Основным преимуществом MRO3 является его способность разрешать конфликты имен методов в множественном наследовании более точно и надежно, что упрощает и смягчает проблемы, связанные с неоднозначностью при определении порядка вызова методов. Это позволяет разработчикам писать более структурированный и надежный код с использованием множественного наследования.
https://easyoffer.ru/question/808
Как на уровне Python реализован декоратор
6%
Декораторы реализованы как функции, которые принимают другую функцию в качестве аргумента и возвращают новую функцию. Это позволяет изменять поведение или добавлять функциональность существующим без изменения их исходного кода. Вот пример простого декоратора:
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
Как бы сделал все значения списка уникальными
6%
Можно сделать все значения списка уникальными, преобразовав его в множество (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
Что такое мутабельные и иммутабельные типы данных
6%
Мутабельные (изменяемые) и иммутабельные (неизменяемые) типы данных определяются по их способности изменяться после создания.
- Иммутабельные типы данных:
Не могут быть изменены после создания.
Если вы пытаетесь изменить значение иммутабельного объекта, на самом деле создается новый объект с измененным значением.
Примеры таких данных включают числа (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
Что такое замыкания
6%
Синтаксически это выглядит как функция, находящаяся целиком в теле другой функции. При этом вложенная внутренняя функция содержит ссылки на локальные переменные внешней функции. Каждый раз при выполнении внешней функции происходит создание нового экземпляра внутренней функции, с новыми ссылками на переменные внешней.
Замыкание (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
Что такое модуль
6%
Модуль – функционально законченный фрагмент программы, оформленный в виде отдельного файла с исходным кодом или поименованной непрерывной её части. Модули позволяют разбивать сложные задачи на более мелкие в соответствии с принципом модульности. Файл, который содержит исходный код на языке 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
Что такое args6
https://easyoffer.ru/question/814
Что такое kwargs
6%
Термин “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
Что такое аннотации типов
6%
Аннотации типов- это синтаксическая особенность, которая позволяет указывать типы переменных, аргументов функций и возвращаемых значений функций в коде. Они не влияют на выполнение программы, но могут быть использованы в качестве средства документирования кода и инструмента статического анализа (например, с помощью инструментов статической типизации, таких как 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
Что такое глубокая копия
6%
Глубокая копия (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
Что такое поверхностная копия
6%
Поверхностная копия (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
Что такое итерируемый объект
6%
Итерируемый объект — это объект, который может быть перебран поэлементно с помощью цикла 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
В чем разница между copy() и deepcopy()6
6%
Глубокая копия deepcopy() создает новую и отдельную копию всего объекта или списка со своим уникальным адресом памяти. Это означает, что любые изменения, внесенные вами в новую копию объекта или списка, не будут отражаться в исходной. Этот процесс происходит следующим образом: сначала создается новый список или объект, а затем рекурсивно копируются все элементы из исходного в новый.
Поверхностное копирование copy() также создает отдельный новый объект или список, но вместо копирования дочерних элементов в новый объект оно просто копирует ссылки на их адреса памяти. Следовательно, если вы сделаете изменение в исходном объекте, оно будет отражено в скопированном объекте, и наоборот. Короче говоря, обе копии зависят друг от друга.
https://easyoffer.ru/question/820