Python 1-100 Flashcards
Python компилируемый или интерпретируемый
13%
Python является интерпретируемым языком программирования.
Это означает, что исходный код Python не преобразуется в машинный код перед его выполнением, как в случае с компилируемыми языками, такими как C или Java. Вместо этого интерпретатор Python читает и выполняет исходный код на лету, строка за строкой. Однако стоит отметить, что Python использует промежуточный байт-код, что немного усложняет вопрос. Когда вы запускаете Python-программу, интерпретатор сначала компилирует исходный код в байт-код (если он еще не был скомпилирован), который затем исполняется.
Но в конечном итоге, основное выполнение кода происходит через интерпретацию, что делает Python интерпретируемым языком.
https://easyoffer.ru/question/795
Какие есть типы данных в Python
83%
Изменяемые (mutable)
списки (list)
словари (dict)
множества (set)
байтовые массивы (byte array)
Не изменяемые (immutable)
числа (int, float, complex, long)
строки (str)
булево выражение (bool)
диапазон (range)
NoneType
frozenset
байты (byte)
Расскажи о своем опыте
83%
Я работаю Python-разработчиком уже более 5 лет. Специализируюсь в основном на веб-разработке с использованием фреймворка Django, хотя имею опыт работы и с Flask. В числе моих задач было создание и поддержка сайтов, разработка API, а также работа с базами данных, в том числе и PostgreSQL. Был вовлечен в разработку нескольких масштабных проектов, где применял микросервисную архитектуру и работал с очередями сообщений (RabbitMQ). В этих проектах я также использовал Docker для контейнеризации и AWS для деплоя приложений. Мне интересно исследовать новые возможности, поэтому я экспериментировал с машинным обучением, используя библиотеки, такие как scikit-learn и TensorFlow. Как часть команды, я всегда стараюсь быть проактивным и считаю, что хорошая коммуникация имеет важное значение для успешной разработки проектов. Помимо этого я старательно следую агил-методологиям и принципам TDD. Python - это мой основной язык программирования, но я также имею опыт работы с такими языками, как JavaScript и Java. Особо хочу отметить, что имею навыки работы с Git, что считаю очень важным для работы в команде.
Расскажи о своих лучших проектах
Что сподвигло стать Python разработчиком
53%
Какие у тебя планы на развитие на ближайшее будущее
43%
Что такое контекстный менеджер
43%
Это конструкция with , которая предоставляет управление к доступу к некому ресурсу.
На контекстный менеджер возлагается 2 функции:
Что нужно сделать в момент когда необходим доступ к ресурсу
Что нужно сделать когда доступ уже не нужен
Встроенная функция open открывает и закрывает объект
Контекстные менеджеры упрощают запись блоков try-finally. Оператор with позволяет разработчикам писать свой код в сжатом и понятном виде.
Пример менеджера контекста для открытия файла
class FileManager: def \_\_init\_\_(self, filename, mode): self.filename = filename self.mode = mode self.file = None def \_\_enter\_\_(self): try: self.file = open(self.filename, self.mode) return self.file except FileNotFoundError: print("Error: File not found") raise def \_\_exit\_\_(self, exc_type, exc_val, exc_tb): if self.file: self.file.close() with FileManager("test.txt", "r") as f: if f: print(f.read())
В чем разница между итератором и генератором
40%
Итераторы используются для перебора группы элементов (например, в списке). Генераторы представляют собой способ реализации итераторов. В них применяется yield для возврата выражения из функции, но в остальном генератор ведет себя как обычная функция.
Что такое SOLID
36%
S – Single Responsibility (Принцип единственной ответственности)
Каждый класс должен отвечать только за одну операцию.
O — Open-Closed (Принцип открытости-закрытости)
Классы должны быть открыты для расширения, но закрыты для модификации.
L — Liskov Substitution (Принцип подстановки Барбары Лисков)
Если П является подтипом Т, то любые объекты типа Т, присутствующие в программе, могут заменяться объектами типа П без негативных последствий для функциональности программы.
I — Interface Segregation (Принцип разделения интерфейсов)
Не следует ставить клиент в зависимость от методов, которые он не использует.
D — Dependency Inversion (Принцип инверсии зависимостей)
Модули верхнего уровня не должны зависеть от модулей нижнего уровня. И те, и другие должны зависеть от абстракций. Абстракции не должны зависеть от деталей. Детали должны зависеть от абстракций.
Что такое декораторы
36%
Декоратором называется функция, которая принимает функцию с таким же именем, как у исходной, но с расширенной функциональностью. Декораторы часто используются во фреймворках, чтобы упростить интеграцию пользовательских функций с фреймворком.
Паттерн Декоратор настолько полезен, что в Python встроена специальная поддержка для него. В Python декорировать можно как функции, так и методы. Кроме того, Python поддерживает декораторы классов: функции, которые принимают класс в качестве аргумента и возвращают новый класс с таким же именем, как у исходного, но с дополненной функциональностью.
Иногда декораторы классов удобно использовать как альтернативу производным классам.
Что такое генератор
33%
Что такое генератор
Генератор – это итератор, элементы которого можно итерировать только 1 раз
Элементы генератора итерируются только 1 раз, потому что они не хранятся в памяти все вместе, а создаются на лету
Генераторы это способ реализации итераторов
Генератор можно реализовать как функцию или как выражение
https://easyoffer.ru/question/784
Какие базы данных использовал в работе
33%
MySQL, Oracle DB, PostgreSQL, SQLite
Реляционные базы данных — это система хранения и организации информации, имеющей установленные отношения, что обеспечивает возможность для быстрого доступа. В этом случае данные упорядочиваются с использованием табличных форм, содержащих сведения об их сущности. Строки и столбцы в таких таблицах представляют заранее установленные категории данных.
Такой способ структурирования информации делает процедуру доступа к ней более гибкой и быстрой. Именно это обстоятельство способствовало тому, что такой тип баз данных получил наибольшее распространение. Они поддерживают стандартный язык программирования – SQL. Это популярная система для хранения и обработки информации. В рамках SQL используются также встроенные языки реляционных баз данных: DDL для таблиц (применяют для описания данных) и DML для работы с данными.
Чем init() отличается от new()
33%
Основное различие между этими двумя методами состоит в том, что __new__ обрабатывает создание объекта, а __init__ обрабатывает его инициализацию.
__new__ вызывается автоматически при вызове имени класса (при создании экземпляра), тогда как __init__ вызывается каждый раз, когда экземпляр класса возвращается __new__, передавая возвращаемый экземпляр в __init__ в качестве параметра self, поэтому даже если вы сохранили экземпляр где-нибудь глобально/статически и возвращали его каждый раз из __new__, для него все-равно будет каждый раз вызываться __init__.
Из вышесказанного вытекает что сначала вызывается __new__, а потом __init__
Что такое итератор
30%
Итератор (iterator) – это объект, который представляет поток данных. Повторяемый вызов метода __next__() (next() в Python 2) итератора или передача его встроенной функции next() возвращает последующие элементы потока.
Если больше не осталось данных, выбрасывается исключение StopIteration. После этого итератор исчерпан и любые последующие вызовы его метода __next__() снова генерируют исключение StopIteration.
Итераторы обязаны иметь метод __iter__, который возвращает сам объект итератора, так что любой итератор также является итерабельным объектом и может быть использован почти везде, где принимаются итерабельные объекты.
https://easyoffer.ru/question/785
Что такое индексы и как они работают
30%
Индекс - объект базы данных, который позволяет быстрее производить запросы к БД.
Таблицы в базе данных могут иметь большое количество строк, которые хранятся в произвольном порядке, и их поиск по заданному критерию путём последовательного просмотра таблицы строка за строкой может занимать много времени. Индекс формируется из значений одного или нескольких столбцов таблицы и указателей на соответствующие строки таблицы и, таким образом, позволяет искать строки, удовлетворяющие критерию поиска. Ускорение работы с использованием индексов достигается в первую очередь за счёт того, что индекс имеет структуру, оптимизированную под поиск — например, сбалансированного дерева.
Для оптимальной производительности запросов индексы обычно создаются на тех столбцах таблицы, которые часто используются в запросах. Для одной таблицы может быть создано несколько индексов. Однако увеличение числа индексов замедляет операции добавления, обновления, удаления строк таблицы, поскольку при этом приходится обновлять сами индексы. Кроме того, индексы занимают дополнительный объем памяти, поэтому перед созданием индекса следует убедиться, что планируемый выигрыш в производительности запросов превысит дополнительную затрату ресурсов компьютера на сопровождение индекса.
Что такое куча (heap) в SQL Server?
Прежде чем мы погрузимся в различные типы индексов SQL Server, сначала следует описать базовую структуру таблицы. Таблицы, на которых не определен кластеризованный индекс (об этом позже), сохраняются в структурах “кучи”, что означает, главным образом, отсутствие порядка хранения наборов данных на каждой странице.
Преимущества и использование кучи в SQL Server
Основной вариант использования для реализации структуры кучи состоит в требовании быстрой вставки данных в вашу таблицу. Подумайте о журнализации или аудите таблицы, в которую постоянно записываются новые данные. Со структурой кучи движку базы данных нет необходимости выяснять куда вставлять новые данные. Он просто добавляет данные на последнюю страницу, а если она заполнена, добавляет новую страницу и записывается данные туда.
Недостатки кучи в SQL Server
Запросы к таблице кучи могут быть очень медленными. Особенно тогда, когда отсутствуют также и некластеризованные индексы на этой таблице. При отсутствии каких-либо индексов каждый запрос, который обращается к таблице кучи, должен выполнять полное сканирование таблицы, а мы все знаем, насколько дорого это обходится, если таблица имеет большой размер.
https://easyoffer.ru/question/322
Какие знаешь принципы ООП
30%
- Абстракция
- Наследование
- Инкапсуляция
- Полиморфизм
Наследование — способ создания класса. Его суть заключается в том, что функциональность нового класса наследуются от уже существующего класса. Новый класс называется производным (дочерним). Существующий — базовым (родительским).
Инкапсуляция
Мы можем ограничить доступ к методам и переменным, что предотвратит модификацию данных — это и есть инкапсуляция. Приватные атрибуты выделяются нижним подчеркиванием: одинарным _ или двойным __.
Полиморфизм — особенность ООП, позволяющая использовать одну функцию для разных форм (типов данных).
Абстракция используется, чтобы скрыть внутренние характеристики функции от пользователей.
https://easyoffer.ru/question/333
Расскажи про ООП в программировании
26%
Это парадигма программирования, в которой основными концепциями являются понятия объектов и классов.
Класс — тип, описывающий устройство объектов
Объект — это экземпляр класса. Класс можно сравнить с чертежом, по которому создаются объекты.
https://easyoffer.ru/question/335
Что может быть ключем в словаре
26%
Словари в питоне представляют собой хеш-таблицы. Вместо ключей в словаре, по сути, используется хэши. (Благодаря этому поиск по словарю происходит быстро и эффективно)
Соответственно, ключом в словаре может быть любой хэшируемый тип данных, а это все не изменяемые типы данных
Кортеж (tupl) не может быть ключом в словаре, в том случае если в нем изменяемые типы данных.
https://easyoffer.ru/question/786
Что такое полиморфизм
26%
Полиморфизм имеет несколько форм:
- Специальный (Ad-Hoc) (в некоторых языках представлен механизмом перегрузки методов)
- Параметрический (в некоторых языках представлен дженериками)
- Полиморфизм подтипов (достигается с помощью механизмов наследования и апкаста). Когда говорят о полиморфизме чаще всего имеют в виду его
Полиморфизм - возможность схожим типам данных, которые явно заданы иерархией наследования иметь различные реализации (с помощью переопределения методов и апкаста)
Также в языках программирования и теории типов полиморфизмом называется способность функции обрабатывать данные разных типов.
https://easyoffer.ru/question/334
Что такое лямбда-функции
23%
Это анонимные функции. Они не резервируют имени в пространстве имен. Лямбды часто передают в функции map, reduce, filter.
Лямбды в Питоне могут состоять только из одного выражения. Используя синтаксис скобок, можно оформить тело лямбды в несколько строк.
Использовать точку с запятой для разделения операторов нельзя.
https://easyoffer.ru/question/788
Что знаешь о наследовании
23%
Наследование - механизм языка, который позволяет описывать новый класс на основе существующего. В “истинном” ООП нужно для обеспечения реализации полиморфизма. Как самостоятельная единица - не нужно и даже вредно, потому что является причиной сильного связывания. Наследованию лучше предпочитать композицию.
https://easyoffer.ru/question/337
Что такое миксин
23%
Миксин (mix-in, анг. “примесь”), паттерн проектирования в ООП, когда в цепочку наследования добавляется небольшой класс-помощник. Например, есть класс
class NowMixin(object): def now(): return datetime.datetime.utcnow()
Тогда любой класс, наследованный с этим миксином, будет иметь метод now().
В названия миксинов принято добавлять слово Mixin, так как не существует никакого механизма для понимания полноценный это класс или миксин. Миксин технически является самым обычным классом.
https://easyoffer.ru/question/336
Что такое MRO
23%
MRO – method resolution order, порядок разрешения методов. Алгоритм, по которому следует искать метод в случае, если у класса два и более родителей.
В классических классах поиск при наследовании по ссылкам на имена осуществляется в следующем порядке:
Сначала экземпляр
Затем его класс
Далее все суперклассы его класса с обходом сначала с глубину, а затем слева направо
Используется первое обнаруженное вхождение. Такой порядок называется DFLR (Обход в глубину и слева направо).
При наследовании классов нового стиля применяется правило MRO (порядок разрешения методов), т.е. линеаризованный обход дерева классов, причем вложенный элемент наследования становится доступным в атрибуте __mro__ данного класса. Такой алгоритм называется C3-линеаризация. Наследование по правилу MRO осуществляется приблизительно в следующем порядке.
Перечисление всех классов, наследуемых экземпляром, по правилу поиска DFLR для классических классов, причем класс включается в результат поиска столько раз, сколько он встречается при обходе.
Просмотр в полученном списке дубликатов классов, из которых удаляются все, кроме последнего (крайнего справа) дубликата в списке.
Упорядочение по правилу MRO применяется при наследовании и вызове встроенной функции super(), которая всегда вызывает следующий по правилу MRO класс (относительно точки вызова).
Пример наследования в неромбовидных иерархических деревьях:
class D: attr = 3 # D:3 E:2 class B(D) pass # | | class E: attr = 2 # B C:1 class C(E): attr = 1 # / / class A(B, C): pass # A X = A() # | print(X.attr) # X DFLR = [X, A, B, D, C, E] # MRO = [X, A, B, D, C, E, object] # И в версии 3.х и в версии 2.х (всегда) выводит строку "3"
Пример наследования в ромбовидных иерархических деревьях:
class D: attr = 3 # D:3 D:3 class B(D) pass # | | class C(D): attr = 1 # B C:1 class A(B, C): pass # / / X = A() # A print(X.attr) # | # X DFLR = [X, A, B, D, C, D] # MRO = [X, A, B, C, D, object] (сохраняет только последний дубликат D) # Выводит строку "1" в версии 3.х, строку "3" в версии 2.х ("1" если D(object))
https://easyoffer.ru/question/787
Что такое Acid в SQL
20%
Требования ACID — набор требований, которые обеспечивают сохранность ваших данных.
- Atomicity — Атомарность
- Consistency — Согласованность
- Isolation — Изолированность
- Durability — Надёжность
Атомарность
Гарантирует, что каждая транзакция будет выполнена полностью или не будет выполнена совсем. Не допускаются промежуточные состояния.
Согласованность
Вытекает из предыдущего. Благодаря тому, что транзакция не допускает промежуточных результатов, база остается согласованной. То есть все ячейки таблицы обновлены нужным нам образом.
Изолированность
Во время выполнения транзакции параллельные транзакции не должны оказывать влияния на её результат. Это достигается блокированием данных с которыми работает транзакция или версионированием (это когда внутри базы при каждом обновлении создается новая версия данных и сохраняется старая).
Надёжность
Если пользователь получил подтверждение от системы, что транзакция выполнена, он может быть уверен, что сделанные им изменения не будут отменены из-за какого-либо сбоя. Обесточилась система, произошел сбой в оборудовании? На выполненную транзакцию это не повлияет.
https://easyoffer.ru/question/321
Что знаешь про декоратор Middleware
20%
Middleware – особый объект, который обычно изменяет входящий запрос или исходящий ответ. Например, добавляет заголовки, делает предварительные проверки. Middleware нужен, когда требуется подвергнуть обработке все запросы приложения.
На уровне языка это объект с методами process_request и process_response. Методы должны вернуть принятый объект (запрос или ответ) для дальнейшей обработки или выкинуть исключение, если что-то не в порядке. В этом случает дальнейшая обработка прекращается.
Чтобы включить Middleware, достаточно добавить путь к нему в список MIDDLEWARE.
https://easyoffer.ru/question/466
Расскажи о инкапсуляции
20%
Ограничение доступа к составляющим объект компонентам (методам и свойствам). Инкапсуляция делает некоторые из компонентов доступными только внутри класса.
Инкапсуляция - механизм языка, позволяющий объединить данные и методы, работающие с этими данными, в единый объект и скрыть детали реализации от пользователя.
Подлинное назначение инкапсуляции — собрать в одном месте знания, относящиеся к устройству некой сущности, правилам обращения и операциям с ней. Инкапсуляция появилась гораздо раньше, чем принято думать. Модули в программах на C — это инкапсуляция. Подпрограммы на ассемблере — это инкапсуляция. Противоположность инкапсуляции — размазывание знаний о функционировании чего-либо по всей программе.
https://easyoffer.ru/question/338
Для чего нужен PEP8
20%
PEP - Python Enhancement Proposals - база всех предложений как улучшить Python и что изменить. Например, PEP8 - это общепринятое руководство по написанию кода на Python.
PEP 8 – это руководство по стилю кода Python.
В этом документе представлены общепринятые соглашения о написании кода на Python. Эти соглашения касаются отступов, форматирования, табуляции, максимальной длины строки, организации импорта, межстрочного интервала и т. д.
Согласованность кода упрощает его чтение другими разработчиками. А чтобы обеспечить согласованность, мы придерживаемся PEP 8.
https://easyoffer.ru/question/489
В чем суть принципа REST
20%
REST (Representational state transfer «передача состояния представления») – соглашение о том, как выстраивать сервисы. Под REST часто имеют в виду т.н. HTTP REST API. Как правило, это веб-приложение с набором URLов – конечных точек. Урлы принимают и возвращают данные в формате JSON. Тип операции задают методом HTTP-запроса, например:
- GET – получить объект или список объектов
- POST – создать объект
- PUT – обновить существующий объект
- PATCH – частично обновить существующий объект
- DELETE – удалить объект
- HEAD – получить метаданные объекта
REST-архитектура активно использует возможности протокола HTTP, чтобы избежать т.н. “велосипедов” – собственных решений. Например, параметры кеширования передаются стандартными заголовками Cache, If-Modified-Since, ETag. Авторизация – заголовком Authentication.
REST это архитектурный стиль для проектирования слабо связанных HTTP приложений, что часто используется при разработке веб-сервисов. REST не диктует правил как это должно быть имплементировано на low уровне, он лишь дает высокоуровневые гайдлайны и оставляет тебе свободу для того, чтобы воплотить собственную реализацию.
Для веб-служб, построенных с учётом REST (то есть не нарушающих накладываемых им ограничений), применяют термин «RESTful».
В отличие от веб-сервисов (веб-служб) на основе SOAP, не существует «официального» стандарта для RESTful веб-API. Дело в том, что REST является архитектурным стилем, в то время как SOAP является протоколом.
REST определяет 6 архитектурных ограничений, соблюдение которых позволит создать настоящий RESTful API:
- Единообразие интерфейса
- Клиент-сервер
- Отсутствие состояния
- Кэширование
- Слои
- Код по требованию (необязательное ограничение)
Единообразие интерфейса Вы должны придумать API интерфейс для ресурсов системы, доступный для пользователей системы и следовать ему во что бы то ни стало. Ресурс в системе должен иметь только один логичный URI, который должен обеспечивать способ получения связанных или дополнительных данных. Всегда лучше ассоциировать (синонимизировать) ресурс с веб-страницей.
Любой ресурс не должен быть слишком большим и содержать все и вся в своем представлении. Когда это уместно, ресурс должен содержать ссылки (HATEOAS: Hypermedia as the Engine of Application State), указывающие на относительные URI для получения связанной информации.
Кроме того, представления ресурсов в системе должны следовать определенным рекомендациям, таким как соглашения об именах, форматы ссылок или формат данных (xml или / и json).
Как только разработчик ознакомится с одним из ваших API, он сможет следовать аналогичному подходу для других API.
**Клиент-сервер **
По сути, это означает, что клиентское приложение и серверное приложение ДОЛЖНЫ иметь возможность развиваться по отдельности без какой-либо зависимости друг от друга. Клиент должен знать только URI ресурса и больше ничего. Сегодня это нормальная практика в веб-разработке, поэтому с вашей стороны ничего особенного не требуется. Будь проще.
Серверы и клиенты также могут заменяться и разрабатываться независимо, если интерфейс между ними не изменяется.
**Отсутствие состояния **
Рой Филдинг черпал вдохновение из HTTP, и это отражается в этом ограничении. Сделайте все клиент-серверное взаимодействие без состояний. Сервер не будет хранить информацию о последних HTTP-запросах клиента. Он будет рассматривать каждый запрос как новый. Нет сессии, нет истории.
Если клиентское приложение должно быть приложением с отслеживанием состояния для конечного пользователя, когда пользователь входит в систему один раз и после этого выполняет другие авторизованные операции, то каждый запрос от клиента должен содержать всю информацию, необходимую для обслуживания запроса, включая сведения об аутентификации и авторизации.
Клиентский контекст не должен храниться на сервере между запросами. Клиент отвечает за управление состоянием приложения.
Кеширование
В современном мире кеширование данных и ответов имеет первостепенное значение везде, где это применимо/возможно. Кэширование повышает производительность на стороне клиента и расширяет возможности масштабирования для сервера, поскольку нагрузка уменьшается.
В REST кэширование должно применяться к ресурсам, когда это применимо, и тогда эти ресурсы ДОЛЖНЫ быть объявлены кешируемыми. Кеширование может быть реализовано на стороне сервера или клиента.
Хорошо настроенное кеширование частично или полностью исключает некоторые взаимодействия клиент-сервер, что еще больше повышает масштабируемость и производительность.
Слои
REST позволяет вам использовать многоуровневую архитектуру системы, в которой вы развертываете API-интерфейсы на сервере A, храните данные на сервере B, a запросы аутентифицируете, например, на сервере C. Клиент обычно не может сказать, подключен ли он напрямую к конечному серверу или к посреднику.
Код по требованию (необязательное ограничение)
Это опциональное ограничение. Большую часть времени вы будете отправлять статические представления ресурсов в форме XML или JSON. Но когда вам нужно, вы можете вернуть исполняемый код для поддержки части вашего приложения, например, клиенты могут вызывать ваш API для получения кода визуализации виджета интерфейса пользователя. Это разрешено
Все вышеперечисленные ограничения помогают вам создать действительно RESTful API, и вы должны следовать им. Тем не менее, иногда вы можете столкнуться с нарушением одного или двух ограничений. Не беспокойтесь, вы все еще создаете API RESTful, но не «труЪ RESTful».
https://easyoffer.ru/question/686
Что такое асинхронность
20%
Асинхронность — это возможность программы выполнять задачи без ожидания их завершения.
Асинхронное программирование усложняет программы, но с его помощью можно их оптимизировать и повысить эффективность. Оно позволяет всем задачам в вашем коде выполняться одновременно (этого синхронные процессы обеспечить не могут).
Асинхронное программирование может быть полезным, если:
- программе требуется слишком много времени на выполнение всех задач;
- имеются операции ввода-вывода, требующие одновременного выполнения;
- есть задержка операций ввода и вывода.
В чем отличие асинхронности, threading’га и мультипроцессинга
16%
Главное отличие в разделении памяти. Процессы независимы друг от друга, имеют раздельные адресные пространства, идентификаторы, ресурсы. Треды исполняются в совместном адресном порстранстве, имеют общий доступ к памяти, переменным, загруженным модулям.
https://easyoffer.ru/question/227
В чем отличие списка от кортежа
16%
Списки – это изменяемые последовательности, обычно используемые для хранения однотипных данных (хотя Python не запрещает хранить в них данные разных типов). Представлены классом list.
Кортежи – это неизменяемые последовательности, обычно используемые, чтобы хранить разнотипные данные. Представлены классом tuple.
На уровне языка отличаются тем, что в кортеж нельзя добавить или убрать элемент. На уровне интерпретатора различий нет. Обе коллекции представлены массивом указателей на структуру PyObject.
Для списка определены функции, которые добавляют в такой массив новый элемент, удаляют имеющийся, соединяют два массива в один. Они вызываются методами списка .append(), .pop(), .sort() и т.д.
https://easyoffer.ru/question/794
Что такое метаклассы
16%
Метакласс это «штука», которая создаёт классы.
Мы создаём класс для того, чтобы создавать объекты, так? А классы являются объектами. Метакласс это то, что создаёт эти самые объекты. Они являются классами классов, можно представить это себе следующим образом:
MyClass = MetaClass() MyObject = MyClass()
Не похоже на QA
https://easyoffer.ru/question/790
Что делает декоратор property
16%
Декоратор property
используется для создания вычисляемых атрибутов класса. Он позволяет определить методы getter
, setter
и deleter
для атрибута класса, что обеспечивает более гибкий доступ к данным объекта. Вот как работает каждый из этих методов:
1. Getter (метод получения):
- Помеченный декоратором @property
, представляет собой метод, который возвращает значение атрибута.
- Вызывается при обращении к атрибуту без использования скобок или при обращении через свойство.
2. Setter (метод установки):
- Помеченный декоратором @property.setter
, представляет собой метод, который устанавливает значение атрибута.
- Вызывается при попытке установить новое значение атрибута.
3. Deleter (метод удаления):
- Помеченный декоратором @property.deleter
, представляет собой метод, который удаляет атрибут.
- Вызывается при использовании оператора del
для удаления атрибута.
Вот пример использования property
:
class Circle: def \_\_init\_\_(self, radius): self._radius = radius @property def radius(self): return self._radius @radius.setter def radius(self, value): if value <= 0: raise ValueError("Радиус должен быть положительным числом") self._radius = value @radius.deleter def radius(self): del self._radius Использование c = Circle(5) print(c.radius) # Вывод: 5 c.radius = 10 print(c.radius) # Вывод: 10 del c.radius # print(c.radius) # Вызовет AttributeError, так как атрибут удален
В этом примере метод radius()
используется как getter, radius.setter
используется для установки нового значения атрибуту, а radius.deleter
используется для удаления атрибута.
https://easyoffer.ru/question/791
Что такое магические методы
16%
Это специальные методы в python, обрамленные двумя нижними подчеркиваниями
Инициализация объекта: __init__
Строковые представления: __repr__ , __str__
Итерация: __iter__ , __next__ и другие
https://easyoffer.ru/question/792
Что относится к изменяемым типам данных и к неизменяемым
16%
Типы данных делятся на изменяемые (mutable) и неизменяемые (immutable) в зависимости от того, можно ли изменять значения объектов этого типа после их создания. Вот общее разделение:
Изменяемые типы данных (Mutable):
- Списки (List): Элементы могут быть изменены после его создания. Это значит, что вы можете добавлять, удалять или изменять элементы списка без создания нового списка.
- Словари (Dictionary): Элементы могут быть изменены после его создания. Вы можете добавлять, удалять или изменять пары ключ-значение словаря.
- Множества (Set): Элементы множества могут быть изменены после его создания. Вы можете добавлять или удалять элементы из множества.
Неизменяемые типы данных (Immutable):
- Строки (String): Строки являются неизменяемыми. Вы не можете изменить отдельные символы строки после ее создания.
- Кортежи (Tuple): Кортежи также неизменяемы. Вы не можете изменить элементы кортежа после его создания.
- Числовые типы (int, float, complex): Числовые типы данных также неизменяемы. Вы не можете изменить значения чисел после их создания.
- Неизменяемые версии структур данных: Некоторые библиотеки, такие как
collections.namedtuple
, предоставляют неизменяемые версии структур данных.
Изменяемые типы данных могут быть полезны для хранения и изменения коллекций данных, в то время как неизменяемые типы данных обеспечивают безопасность данных и подходят для хранения значений, которые не должны изменяться после создания.
Что такое list comprehension
16%
Генераторы позволяют создавать списки с помощью одной строки кода
>>> [i for i in range(1, 11, 2)] [1, 3, 5, 7, 9]
List comprehension - это конструкция, которая позволяет создавать списки на основе других последовательностей (например, списков, кортежей, множеств) более компактно и читаемо.
Синтаксис list comprehension выглядит следующим образом:
[выражение for элемент in последовательность if условие]
где:
-
выражение
- это выражение, которое будет применено к каждому элементу последовательности. -
элемент
- это переменная, представляющая текущий элемент последовательности. -
последовательность
- это исходная последовательность, по которой будет проходить итерация. -
условие
(необязательно) - это условие, которое фильтрует элементы последовательности.
- Создание списка квадратов чисел от 0 до 9:
~~~
squares = [x**2 for x in range(10)]
~~~ - Фильтрация списка, оставляя только четные числа:
~~~
even_numbers = [x for x in range(10) if x % 2 == 0]
~~~ - Преобразование списка строк в список их длин:
~~~
strings = [“apple”, “banana”, “orange”]
lengths = [len(s) for s in strings]
~~~
List comprehension делает код более кратким и выразительным, особенно для простых преобразований и фильтраций данных. Однако не следует злоупотреблять им, чтобы избежать снижения читаемости кода.
https://easyoffer.ru/question/789
Какие области в профессиональной деятельности у тебя развиты слабо
13%
Пример:
Как Python разработчик, мои слабые места включают следующее: 1. High-Performance Computing: Хотя у меня есть опыт работы с большими наборами данных, мне благо бы развивать свои навыки в области высокопроизводительных вычислений, чтобы максимизировать эффективность и оптимизацию кода. 2. C/C++ Integration: Мне нужно углубить свои знания в интеграции Python с C/C++, что может быть полезно при работе над проектами, которые требуют большей производительности и уровня контроля, которые предоставляет C/C++. 3. DevOps: Хотя я имею определенное представление о DevOps и использовал некоторые инструменты, такие как Docker и Jenkins, мне нужно дальше исследовать и развивать эти навыки. 4. Front-end Development: Я сконцентрировался больше на back-end разработке, поэтому у меня меньше опыта в front-end технологиях. 5. Машинное обучение/искусственный интеллект: Хотя я имею базовые знания в этой области, она по-прежнему сложна и постоянно расширяется, поэтому определенно есть место для обучения и развития. 6. Знание фреймворков: Я использовал Django и Flask для некоторых проектов, но у меня ограниченные знания о других фреймворках, таких как Pyramid и Tornado. Это области, над которыми я активно работаю и стремлюсь усовершенствовать.
Какие основные HTTP методы знаешь
13%
Основные методы HTTP, которые широко используются при взаимодействии с веб-серверами, включают следующие:
- GET: Запрашивает представление ресурса. GET-запросы обычно используются для получения данных от сервера. Они могут быть кэшированы и остаются в истории браузера. Они ограничены в размере.
- POST: Отправляет данные для обработки на сервере. POST-запросы часто используются для отправки данных HTML-формы на сервер для обработки. Они не кэшируются и не остаются в истории браузера. Они могут отправлять большие объемы данных.
- PUT: Загружает содержимое запроса на указанный URI. Если ресурс существует, он перезаписывается. Если ресурс не существует, сервер может создать его с использованием предоставленных данных.
- DELETE: Удаляет указанный ресурс.
- PATCH: Применяет частичные модификации к ресурсу. Обычно используется для обновления ресурса с частичными данными.
- HEAD: Запрашивает заголовки, которые будут возвращены, как если бы был сделан запрос GET, но без тела ответа.
- OPTIONS: Используется для запроса возможностей и параметров коммуникации для указанного ресурса.
- TRACE: Используется для тестирования соединения по маршруту к ресурсу. Он выполняет циклический обход маршрутизации, который включает в себя передачу запроса через все узлы маршрута.
Это основные методы HTTP, но также существуют и другие, менее используемые. Понимание этих методов важно при разработке веб-приложений и работы с веб-серверами.
https://easyoffer.ru/question/687
Что знаешь про ORM
13%
ORM (Object-Relational Mapping) - это техника, которая позволяет представить данные из реляционной базы данных в виде объектов в объектно-ориентированном коде. С помощью ORM разработчики могут работать с данными, как если бы они были объектами, а не записями в базе данных, что облегчает работу и повышает производительность.
Вот некоторые ключевые аспекты ORM:
- Сопоставление объектов и таблиц: ORM обеспечивает сопоставление между объектами в коде программы и таблицами в базе данных. Каждый класс объекта соответствует таблице в базе данных, а атрибуты класса соответствуют столбцам в этой таблице.
- Операции CRUD: ORM позволяет выполнять операции CRUD (Create, Read, Update, Delete) непосредственно с объектами в коде программы, а не писать SQL-запросы вручную. Это делает работу с базой данных более удобной и абстрагирует разработчика от деталей работы с SQL.
- Отношения между объектами: ORM позволяет определять отношения между объектами, такие как один-к-одному, один-ко-многим, многие-ко-многим и другие. Это делает моделирование сложных структур данных более удобным и понятным.
- Миграции базы данных: Некоторые ORM-фреймворки также предоставляют механизмы миграции базы данных, которые позволяют автоматически обновлять структуру базы данных при изменении моделей объектов в коде программы.
- Производительность: Хорошие ORM-фреймворки обеспечивают оптимизацию запросов и загрузки данных, что позволяет улучшить производительность приложения и сократить время разработки.
Некоторые известные ORM-фреймворки включают SQLAlchemy, Django ORM, Peewee и Pony ORM. Каждый из них имеет свои особенности и преимущества, и выбор зависит от конкретных потребностей и предпочтений проекта.
https://easyoffer.ru/question/767