Python 1-100 Flashcards

1
Q

Python компилируемый или интерпретируемый

13%

A

Python является интерпретируемым языком программирования.

Это означает, что исходный код Python не преобразуется в машинный код перед его выполнением, как в случае с компилируемыми языками, такими как C или Java. Вместо этого интерпретатор Python читает и выполняет исходный код на лету, строка за строкой. Однако стоит отметить, что Python использует промежуточный байт-код, что немного усложняет вопрос. Когда вы запускаете Python-программу, интерпретатор сначала компилирует исходный код в байт-код (если он еще не был скомпилирован), который затем исполняется.

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

https://easyoffer.ru/question/795

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

Какие есть типы данных в Python

83%

A

Изменяемые (mutable)

списки (list)

словари (dict)

множества (set)

байтовые массивы (byte array)

Не изменяемые (immutable)

числа (int, float, complex, long)

строки (str)

булево выражение (bool)

диапазон (range)

NoneType

frozenset

байты (byte)

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

Расскажи о своем опыте

83%

A

Я работаю Python-разработчиком уже более 5 лет. Специализируюсь в основном на веб-разработке с использованием фреймворка Django, хотя имею опыт работы и с Flask. В числе моих задач было создание и поддержка сайтов, разработка API, а также работа с базами данных, в том числе и PostgreSQL. Был вовлечен в разработку нескольких масштабных проектов, где применял микросервисную архитектуру и работал с очередями сообщений (RabbitMQ). В этих проектах я также использовал Docker для контейнеризации и AWS для деплоя приложений. Мне интересно исследовать новые возможности, поэтому я экспериментировал с машинным обучением, используя библиотеки, такие как scikit-learn и TensorFlow. Как часть команды, я всегда стараюсь быть проактивным и считаю, что хорошая коммуникация имеет важное значение для успешной разработки проектов. Помимо этого я старательно следую агил-методологиям и принципам TDD. Python - это мой основной язык программирования, но я также имею опыт работы с такими языками, как JavaScript и Java. Особо хочу отметить, что имею навыки работы с Git, что считаю очень важным для работы в команде.

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

Расскажи о своих лучших проектах

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

Что сподвигло стать Python разработчиком

53%

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

Какие у тебя планы на развитие на ближайшее будущее

43%

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

Что такое контекстный менеджер

43%

A

Это конструкция 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())
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

В чем разница между итератором и генератором

40%

A

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

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

Что такое SOLID

36%

A

S – Single Responsibility (Принцип единственной ответственности)

Каждый класс должен отвечать только за одну операцию.

O — Open-Closed (Принцип открытости-закрытости)

Классы должны  быть открыты для расширения, но закрыты для модификации.

L — Liskov Substitution (Принцип подстановки Барбары Лисков)

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

I — Interface Segregation (Принцип разделения интерфейсов)

Не следует ставить клиент в зависимость от методов, которые он не использует.

D — Dependency Inversion (Принцип инверсии зависимостей)

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

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

Что такое декораторы

36%

A

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

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

Иногда декораторы классов удобно использовать как альтернативу производным классам.

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

Что такое генератор

33%

A

Что такое генератор

Генератор – это итератор, элементы которого можно итерировать только 1 раз

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

https://easyoffer.ru/question/784

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

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

33%

A

MySQL, Oracle DB, PostgreSQL, SQLite

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

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

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

Чем init() отличается от new()

33%

A

Основное различие между этими двумя методами состоит в том, что __new__ обрабатывает создание объекта, а __init__ обрабатывает его инициализацию.

__new__ вызывается автоматически при вызове имени класса (при создании экземпляра), тогда как __init__ вызывается каждый раз, когда экземпляр класса возвращается __new__, передавая возвращаемый экземпляр в __init__ в качестве параметра self, поэтому даже если вы сохранили экземпляр где-нибудь глобально/статически и возвращали его каждый раз из __new__, для него все-равно будет каждый раз вызываться __init__.

Из вышесказанного вытекает что сначала вызывается __new__, а потом __init__

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

Что такое итератор

30%

A

Итератор (iterator) – это объект, который представляет поток данных. Повторяемый вызов метода __next__() (next() в Python 2) итератора или передача его встроенной функции next() возвращает последующие элементы потока.

Если больше не осталось данных, выбрасывается исключение StopIteration. После этого итератор исчерпан и любые последующие вызовы его метода __next__() снова генерируют исключение StopIteration.

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

https://easyoffer.ru/question/785

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

Что такое индексы и как они работают

30%

A

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

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

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

Что такое куча (heap) в SQL Server?

Прежде чем мы погрузимся в различные типы индексов SQL Server, сначала следует описать базовую структуру таблицы. Таблицы, на которых не определен кластеризованный индекс (об этом позже), сохраняются в структурах “кучи”, что означает, главным образом, отсутствие порядка хранения наборов данных на каждой странице.

Преимущества и использование кучи в SQL Server

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

Недостатки кучи в SQL Server

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

https://easyoffer.ru/question/322

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

Какие знаешь принципы ООП

30%

A
  • Абстракция
  • Наследование
  • Инкапсуляция
  • Полиморфизм

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

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

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

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

Абстракция используется, чтобы скрыть внутренние характеристики функции от пользователей.

https://easyoffer.ru/question/333

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

Расскажи про ООП в программировании

26%

A

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

Класс — тип, описывающий устройство объектов

Объект — это экземпляр класса. Класс можно сравнить с чертежом, по которому создаются объекты.

https://easyoffer.ru/question/335

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

Что может быть ключем в словаре

26%

A

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

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

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

https://easyoffer.ru/question/786

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

Что такое полиморфизм

26%

A

Полиморфизм имеет несколько форм:

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

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

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

https://easyoffer.ru/question/334

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

Что такое лямбда-функции

23%

A

Это анонимные функции. Они не резервируют имени в пространстве имен. Лямбды часто передают в функции map, reduce, filter.

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

Использовать точку с запятой для разделения операторов нельзя.

https://easyoffer.ru/question/788

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

Что знаешь о наследовании

23%

A

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

https://easyoffer.ru/question/337

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

Что такое миксин

23%

A

Миксин (mix-in, анг. “примесь”), паттерн проектирования в ООП, когда в цепочку наследования добавляется небольшой класс-помощник. Например, есть класс

class NowMixin(object):
    def now():
        return datetime.datetime.utcnow()

Тогда любой класс, наследованный с этим миксином, будет иметь метод now().

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

https://easyoffer.ru/question/336

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

Что такое MRO

23%

A

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

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

Что такое Acid в SQL

20%

A

Требования ACID — набор требований, которые обеспечивают сохранность ваших данных.

  • Atomicity — Атомарность
  • Consistency — Согласованность
  • Isolation — Изолированность
  • Durability — Надёжность

Атомарность

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

Согласованность

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

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

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

Надёжность

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

https://easyoffer.ru/question/321

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

Что знаешь про декоратор Middleware

20%

A

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

На уровне языка это объект с методами process_request и process_response. Методы должны вернуть принятый объект (запрос или ответ) для дальнейшей обработки или выкинуть исключение, если что-то не в порядке. В этом случает дальнейшая обработка прекращается.

Чтобы включить Middleware, достаточно добавить путь к нему в список MIDDLEWARE.

https://easyoffer.ru/question/466

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

Расскажи о инкапсуляции

20%

A

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

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

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

https://easyoffer.ru/question/338

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

Для чего нужен PEP8

20%

A

PEP - Python Enhancement Proposals - база всех предложений как улучшить Python и что изменить. Например, PEP8 - это общепринятое руководство по написанию кода на Python.

PEP 8 – это руководство по стилю кода Python.

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

Согласованность кода упрощает его чтение другими разработчиками. А чтобы обеспечить согласованность, мы придерживаемся PEP 8.

https://easyoffer.ru/question/489

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

В чем суть принципа REST

20%

A

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

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

Что такое асинхронность

20%

A

Асинхронность — это возможность программы выполнять задачи без ожидания их завершения.

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

Асинхронное программирование может быть полезным, если:

  • программе требуется слишком много времени на выполнение всех задач;
  • имеются операции ввода-вывода, требующие одновременного выполнения;
  • есть задержка операций ввода и вывода.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
30
Q

В чем отличие асинхронности, threading’га и мультипроцессинга

16%

A

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

https://easyoffer.ru/question/227

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

В чем отличие списка от кортежа

16%

A

Списки – это изменяемые последовательности, обычно используемые для хранения однотипных данных (хотя Python не запрещает хранить в них данные разных типов). Представлены классом list.

Кортежи – это неизменяемые последовательности, обычно используемые, чтобы хранить разнотипные данные. Представлены классом tuple.

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

Для списка определены функции, которые добавляют в такой массив новый элемент, удаляют имеющийся, соединяют два массива в один. Они вызываются методами списка .append(), .pop(), .sort() и т.д.

https://easyoffer.ru/question/794

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

Что такое метаклассы

16%

A

Метакласс это «штука», которая создаёт классы.

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

 MyClass = MetaClass()
  MyObject = MyClass()

Не похоже на QA

https://easyoffer.ru/question/790

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

Что делает декоратор property

16%

A

Декоратор 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

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

Что такое магические методы

16%

A

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

Инициализация объекта: __init__
Строковые представления: __repr__ , __str__
Итерация: __iter__ , __next__ и другие

https://easyoffer.ru/question/792

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

Что относится к изменяемым типам данных и к неизменяемым

16%

A

Типы данных делятся на изменяемые (mutable) и неизменяемые (immutable) в зависимости от того, можно ли изменять значения объектов этого типа после их создания. Вот общее разделение:

Изменяемые типы данных (Mutable):

  1. Списки (List): Элементы могут быть изменены после его создания. Это значит, что вы можете добавлять, удалять или изменять элементы списка без создания нового списка.
  2. Словари (Dictionary): Элементы могут быть изменены после его создания. Вы можете добавлять, удалять или изменять пары ключ-значение словаря.
  3. Множества (Set): Элементы множества могут быть изменены после его создания. Вы можете добавлять или удалять элементы из множества.

Неизменяемые типы данных (Immutable):

  1. Строки (String): Строки являются неизменяемыми. Вы не можете изменить отдельные символы строки после ее создания.
  2. Кортежи (Tuple): Кортежи также неизменяемы. Вы не можете изменить элементы кортежа после его создания.
  3. Числовые типы (int, float, complex): Числовые типы данных также неизменяемы. Вы не можете изменить значения чисел после их создания.
  4. Неизменяемые версии структур данных: Некоторые библиотеки, такие как collections.namedtuple, предоставляют неизменяемые версии структур данных.

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

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

Что такое list comprehension

16%

A

Генераторы позволяют создавать списки с помощью одной строки кода

>>> [i for i in range(1, 11, 2)]
[1, 3, 5, 7, 9] 

List comprehension - это конструкция, которая позволяет создавать списки на основе других последовательностей (например, списков, кортежей, множеств) более компактно и читаемо.

Синтаксис list comprehension выглядит следующим образом:

[выражение for элемент in последовательность if условие]

где:

  • выражение - это выражение, которое будет применено к каждому элементу последовательности.
  • элемент - это переменная, представляющая текущий элемент последовательности.
  • последовательность - это исходная последовательность, по которой будет проходить итерация.
  • условие (необязательно) - это условие, которое фильтрует элементы последовательности.
  1. Создание списка квадратов чисел от 0 до 9:
    ~~~
    squares = [x**2 for x in range(10)]
    ~~~
  2. Фильтрация списка, оставляя только четные числа:
    ~~~
    even_numbers = [x for x in range(10) if x % 2 == 0]
    ~~~
  3. Преобразование списка строк в список их длин:
    ~~~
    strings = [“apple”, “banana”, “orange”]
    lengths = [len(s) for s in strings]
    ~~~

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

https://easyoffer.ru/question/789

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

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

13%

A

Пример:

Как 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. Это области, над которыми я активно работаю и стремлюсь усовершенствовать.

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

Какие основные HTTP методы знаешь

13%

A

Основные методы HTTP, которые широко используются при взаимодействии с веб-серверами, включают следующие:

  1. GET: Запрашивает представление ресурса. GET-запросы обычно используются для получения данных от сервера. Они могут быть кэшированы и остаются в истории браузера. Они ограничены в размере.
  2. POST: Отправляет данные для обработки на сервере. POST-запросы часто используются для отправки данных HTML-формы на сервер для обработки. Они не кэшируются и не остаются в истории браузера. Они могут отправлять большие объемы данных.
  3. PUT: Загружает содержимое запроса на указанный URI. Если ресурс существует, он перезаписывается. Если ресурс не существует, сервер может создать его с использованием предоставленных данных.
  4. DELETE: Удаляет указанный ресурс.
  5. PATCH: Применяет частичные модификации к ресурсу. Обычно используется для обновления ресурса с частичными данными.
  6. HEAD: Запрашивает заголовки, которые будут возвращены, как если бы был сделан запрос GET, но без тела ответа.
  7. OPTIONS: Используется для запроса возможностей и параметров коммуникации для указанного ресурса.
  8. TRACE: Используется для тестирования соединения по маршруту к ресурсу. Он выполняет циклический обход маршрутизации, который включает в себя передачу запроса через все узлы маршрута.

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

https://easyoffer.ru/question/687

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

Что знаешь про ORM

13%

A

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

Вот некоторые ключевые аспекты ORM:

  1. Сопоставление объектов и таблиц: ORM обеспечивает сопоставление между объектами в коде программы и таблицами в базе данных. Каждый класс объекта соответствует таблице в базе данных, а атрибуты класса соответствуют столбцам в этой таблице.
  2. Операции CRUD: ORM позволяет выполнять операции CRUD (Create, Read, Update, Delete) непосредственно с объектами в коде программы, а не писать SQL-запросы вручную. Это делает работу с базой данных более удобной и абстрагирует разработчика от деталей работы с SQL.
  3. Отношения между объектами: ORM позволяет определять отношения между объектами, такие как один-к-одному, один-ко-многим, многие-ко-многим и другие. Это делает моделирование сложных структур данных более удобным и понятным.
  4. Миграции базы данных: Некоторые ORM-фреймворки также предоставляют механизмы миграции базы данных, которые позволяют автоматически обновлять структуру базы данных при изменении моделей объектов в коде программы.
  5. Производительность: Хорошие ORM-фреймворки обеспечивают оптимизацию запросов и загрузки данных, что позволяет улучшить производительность приложения и сократить время разработки.

Некоторые известные ORM-фреймворки включают SQLAlchemy, Django ORM, Peewee и Pony ORM. Каждый из них имеет свои особенности и преимущества, и выбор зависит от конкретных потребностей и предпочтений проекта.

https://easyoffer.ru/question/767

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

Что знаешь про singleton

13%

A

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

  1. Одиночный экземпляр: У класса есть только один экземпляр, который создается при первом обращении к нему, а затем повторно используется при последующих вызовах.
  2. Глобальный доступ: Singleton предоставляет глобальную точку доступа к своему экземпляру, что позволяет другим объектам получить доступ к этому экземпляру через общедоступный метод или свойство.
  3. Ленивая инициализация: Экземпляр класса создается только при первом обращении к нему, а не заранее, что позволяет оптимизировать использование ресурсов и избегать ненужного создания объектов.Пример реализации singleton:
    ~~~
    class Singleton:
    _instance = Nonedef __new__(cls):
    if cls._instance is None:
    cls._instance = super().__new__(cls)
    return cls._instance

Использование
s1 = Singleton()
s2 = Singleton()
print(s1 is s2) # Вывод: True, потому что s1 и s2 ссылаются на один и тот же экземпляр класса Singleton
~~~
В этом примере метод \_\_new\_\_ переопределяется таким образом, чтобы при первом вызове он создавал новый экземпляр класса, а при последующих вызовах возвращал уже созданный экземпляр. Таким образом, у класса Singleton всегда есть только один экземпляр.

41
Q

Threading что это

13%

A

Threading - это механизм, который позволяет создавать и управлять параллельными потоками выполнения внутри одного процесса. Поток (thread) - это наименьшая единица обработки внутри процесса, которая может выполняться параллельно с другими потоками.

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

  1. Параллельное выполнение: Потоки позволяют выполнять несколько частей кода (потоков) параллельно в пределах одного процесса. Это позволяет эффективно использовать многоядерные процессоры и улучшить производительность программы.
  2. Совместное использование ресурсов: Потоки разделяют общие ресурсы, такие как память или файлы, что может привести к проблемам с синхронизацией доступа к этим ресурсам, поэтому важно использовать механизмы синхронизации, такие как блокировки, для обеспечения безопасного доступа к общим данным из разных потоков.
  3. Глобальная интерпретаторская блокировка (GIL): Существует GIL, который предотвращает одновременное выполнение нескольких потоков на уровне байткода в одном процессе. Это может ограничивать эффективность потоков для CPU-интенсивных задач, но не мешает параллельному выполнению операций ввода-вывода.
  4. Модуль threading: Существует встроенный модуль threading, который предоставляет высокоуровневый интерфейс для создания и управления потоками. Он обеспечивает классы Thread для создания потоков, а также средства синхронизации, такие как блокировки, условные переменные и семафоры.

https://easyoffer.ru/question/229

42
Q

В чем разница сравнение через is и “==”

13%

A

== проверяет, одинаковые ли значения у переменных.

is проверяет, указывают ли переменные на один и тот же объект.

a = [1, 2]
b = [1, 2]

print(a == b) #True
print(a is b) #False

https://easyoffer.ru/question/797

43
Q

Мультипроцессинг что это

13%

A

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

Основные концепции мультипроцессинга:

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

https://easyoffer.ru/question/228

44
Q

Что такое slots

13%

A

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

Слоты активно используются в библиотеках requests и falcon.

Недостатотк: нельзя присвоить классу поле, которого нет в слотах. Не работают методы __getattr__ и __setattr__. Решение: включить в __slots__ элемент __dict__

45
Q

Расскажи о сложностях с которыми столкнулся во время обучения

13%

A

Пример:

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

46
Q

Кем себя видишь через два года при работе в фуллтайм

10%

A

Пример:

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

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

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

47
Q

Для чего нужен сериализатор

10%

A

Сериализация – это процесс сохранения объектов в двоичном или строковом виде для хранения, передачи и восстановления. Обратный процесс называется десериализацией. Термины-синонимы маршалинг/анмаршалинг

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

Вот несколько причин, по которым сериализаторы могут быть полезными:

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

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

48
Q

Какие есть коды ответов HTTP

10%

A

Коды сгруппированы в 5 классов:

Информационные 100 - 199
Успешные 200 - 299
Перенаправления 300 - 399
Клиентские ошибки 400 - 499
Серверные ошибки 500 – 599

100+ Информационные

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

200+ Успешные

Возвращаются в случае успешной обработки клиентского запроса.

300+ Редиректы

если серверу нужно перенаправить клиента.

400+ Клиентские ошибки

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

500+ Серверные ошибки

Ответ с кодами из этой категории приходит, если на стороне сервера возникла ошибка.

49
Q

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

10%

A

GET

Позволяет запросить некоторый конкретный ресурс. Дополнительные данные могут быть переданы через строку запроса (Query String) в составе URL (например, ?param=value).О составляющих URL мы поговорим чуть позже.

POST

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

HEAD

Здесь придется забежать немного вперед и сказать, что обычно сервер в ответ на запрос возвращает заголовок и тело, в котором содержится запрашиваемый ресурс. Данный метод при использовании его в запросе позволит получить только заголовки, которые сервер бы вернул при получении GET-запроса к тому же ресурсу. Запрос с использованием данного метода обычно производится для того, чтобы узнать размер запрашиваемого ресурса перед его загрузкой.

PUT

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

DELETE

Позволяет удалить существующие ресурсы на сервере. Если использование данного метода настроено некорректно, то это может привести к атаке типа «Отказ в обслуживании» (Denial of Service, DoS) из-за удаления критически важных файлов сервера.

OPTIONS

Позволяет запросить информацию о сервере, в том числе информацию о допускаемых к использованию на сервере HTTP-методов.

PATCH

Позволяет внести частичные изменения в указанный ресурс по указанному расположению.

50
Q

Что такое Docker

10%

A

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

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

  1. Контейнеры: Нужны для упаковки приложений и их зависимостей в единую среду. Контейнеры изолированы друг от друга и от хост-системы, что обеспечивает надежную и консистентную среду выполнения приложений.
  2. Образы: Шаблоны для создания контейнеров. Они включают в себя все необходимые компоненты приложения и его зависимости. Образы могут быть созданы вручную или автоматически с использованием Dockerfile, который описывает конфигурацию контейнера.
  3. Dockerfile: Текстовый файл, который содержит инструкции для создания образа. Он определяет все этапы установки и настройки приложения в контейнере, что позволяет автоматизировать процесс создания образов.
  4. Реестр Docker: Сервис, который хранит образы. Он позволяет разработчикам делиться образами и использовать их для создания контейнеров на различных хост-системах.
  5. Docker Engine: Основной компонент, который управляет созданием, запуском и управлением контейнерами. Он включает в себя клиентские и серверные компоненты, которые общаются между собой с помощью API.
  6. Docker Compose: Инструмент для определения и запуска многоконтейнерных приложений. Он позволяет определять структуру приложения и его зависимости в файле docker-compose.yml, что упрощает развертывание и управление многочастными приложениями.

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

https://easyoffer.ru/question/43

51
Q

Какие фреймворки/библиотеки в основном используешь

10%

A
52
Q

Как себя оцениваете как разработчика

10%

A
53
Q

Почему решил заняться программированием

10%

A
54
Q

Расскажи о ситуации, когда приходилось делегировать поставленные задачи

10%

A
55
Q

Какое направление разработки интересует

10%

A

Пример:

Мои интересы в области разработки на Python довольно широкие, но в основном я сконцентрирован на следующих направлениях:

Web-разработка: Я использую Django и Flask для создания мощных и эффективных веб-приложений.
Анализ данных: Python является основным языком для большинства аналитиков данных и ученых-дата, и этот аспект является очень привлекательным для меня.
Машинное обучение: Я заинтересован в возможностях машинного обучения и его применении в различных областях.
Скрапинг данных: У меня есть опыт использования Python для извлечения и анализа данных из веб-сайтов.
Разработка API: Я также работал над разработкой и интеграцией API, используя Python.
Я всегда готов изучать и применять новые технологии и практики для улучшения своих проектов и расширения своих навыков в разработке на Python.

56
Q

Расскажите с какими проблемами сталкивались в своих проектах

10%

A
57
Q

Был ли у тебя опыт работы в команде

10%

A
58
Q

Как справлялся с сложностями в команде

10%

A
59
Q

Почему выбрал направление бекэнд

10%

A
60
Q

Как видишь свою идеальную команду

10%

A
61
Q

Что тебе известно про нереляционные базы данных

10%

A

Нереляционные базы данных (NoSQL) - это тип баз данных, который отличается от традиционных реляционных по своей структуре и модели данных. Вот их некоторые общие характеристики:

  1. Гибкая схема данных: В отличие от реляционных баз данных, которые требуют строгой схемы данных, нереляционные обычно позволяют хранить разнородные данные с разной структурой в одной и той же базе данных. Это делает их более гибкими и масштабируемыми для хранения различных типов данных.
  2. Горизонтальное масштабирование: Многие нереляционные базы данных разработаны с учетом горизонтального масштабирования, что позволяет им эффективно масштабироваться на большие объемы данных и высокие нагрузки. Это достигается за счет распределения данных по нескольким узлам кластера.
  3. Модели данных: Нереляционные базы данных могут поддерживать различные модели данных, такие как ключ-значение, документные, столбцовые и графовые модели. Каждая модель предоставляет специализированные возможности для хранения и обработки данных.
  4. Производительность: Нереляционные базы данных часто обладают высокой производительностью при обработке больших объемов данных и параллельном выполнении запросов. Это делает их популярным выбором для приложений с высокими требованиями к производительности и масштабируемости.
  5. Примеры нереляционных баз данных: Некоторые из наиболее известных нереляционных баз данных включают MongoDB (документная модель), Cassandra (столбцовая модель), Redis (ключ-значение), Neo4j (графовая модель) и Amazon DynamoDB (ключ-значение и документная модель).

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

https://easyoffer.ru/question/319

62
Q

Что такое транзакция

10%

A

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

Мы можем сказать, что транзакция – это распространение изменений в БД. Например, если мы создаём, изменяем или удаляем запись, то мы выполняем транзакцию. Крайне важно контролировать транзакции для гарантирования.

Основные концепции (свойства) транзакции описываются аббревиатурой ACID – Atomicity, Consistency, Isolation, Durability (Атомарность, Согласованность, Изолированность, Долговечность).

Атомарность:

Атомарность гарантирует, что любая транзакция будет зафиксирована только целиком (полностью). Если одна из операций в последовательности не будет выполнена, то вся транзакция будет отменена. Тут вводится понятие “отката” (rollback). Т.е. внутри последовательности будут происходить определённые изменения, но по итогу все они будут отменены (“откачены”) и по итогу пользователь не увидит никаких изменений.

Согласованность:

Это означает, что любая завершённая транзакция (транзакция, которая достигла завершения транзакции – end of transaction) фиксирует только допустимые результаты. Например, при переводе денег с одного счёта на другой, в случае, если деньги ушли с одного счёта, они должны прийти на другой (это и есть согласованность системы). Списание и зачисление – это две разные транзакции, поэтому первая транзакция пройдёт без ошибок, а второй просто не будет. Именно поэтому крайне важно учитывать это свойство и поддерживать баланс системы.

Изолированность:

Каждая транзакция должна быть изолирована от других, т.е. её результат не должен зависеть от выполнения других параллельных транзакций. На практике, изолированность крайне труднодостижимая вещь, поэтому здесь вводится понятие “уровни изолированности” (транзакция изолируется не полностью).

Долговечность:

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

https://easyoffer.ru/question/320

63
Q

Что такое git

10%

A

Распределённая система управления версиями. Разработан Линусом Торвальдсом, для удобной разработки ядра Linux.

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

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

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

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

https://easyoffer.ru/question/41

64
Q

Отличия rebase от merge

10%

A

git merge - принимает содержимое ветки источника и объединяет их с целевой веткой. В этом процессе изменяется только целевая ветка. История исходных веток остается неизменной.

git rebase — еще один способ перенести изменения из одной ветки в другую. Rebase сжимает все изменения в один «патч». Затем он интегрирует патч в целевую ветку. В отличие от слияния, перемещение перезаписывает историю, потому что она передает завершенную работу из одной ветки в другую. В процессе устраняется нежелательная история.

65
Q

Что такое BigO notation

10%

A

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

Big O notation обозначается как O(f(n)), где f(n) - это функция, описывающая рост времени выполнения или используемой памяти в зависимости от размера входных данных (n). Например, если алгоритм выполняется за время, пропорциональное n^2, то его временная сложность будет O(n^2).

Вот некоторые из наиболее распространенных классов сложности:

  1. O(1): Константная сложность. Время выполнения алгоритма не зависит от размера входных данных. Примером может служить доступ к элементу массива по индексу.
  2. O(log n): Логарифмическая сложность. Время выполнения алгоритма логарифмически зависит от размера входных данных. Примером может служить бинарный поиск в отсортированном массиве.
  3. O(n): Линейная сложность. Время выполнения алгоритма линейно зависит от размера входных данных. Примером может служить итерация по всем элементам в массиве.
  4. O(n log n): Линейно-логарифмическая сложность. Примером может служить сортировка слиянием.
  5. O(n^2): Квадратичная сложность. Время выполнения алгоритма квадратично зависит от размера входных данных. Примером может служить вложенные циклы с полным проходом по всем элементам вложенного массива.
  6. O(2^n): Экспоненциальная сложность. Время выполнения алгоритма экспоненциально зависит от размера входных данных. Примером может служить задача о коммивояжере с использованием метода полного перебора.

Big O notation помогает разработчикам анализировать и сравнивать эффективность алгоритмов и выбирать наиболее подходящий вариант для конкретной задачи.

https://easyoffer.ru/question/178

66
Q

Зачем нужен метод super в классе

10%

A

uper() нужен для того чтобы вызвать метод у родительского класса

Чаще всего это используется в Init, чтобы не повторять код и не присваивать атрибуты в дочернем классе
~~~
class Person:
def __init__(self, name, surname):
self.name = name
self.surname = surname

class Doctor(Person):
def __init__(self, name, surname, age):
super().__init__(name, surname)
self.age = age
~~~

https://easyoffer.ru/question/340

67
Q

Что такое абстрактные классы

10%

A

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

Абстрактный метод - это метод, который объявлен в абстрактном классе, но не имеет реализации. Он служит как бы шаблоном для метода, который должен быть реализован в подклассах.
~~~
from abc import ABC, abstractmethod

class Animal(ABC):
def __init__(self, name, age):
self.name = name
self.age = age

@abstractmethod
def make_sound(self):
    pass

class Dog(Animal):
def make_sound(self):
return “Woof!”

class Cat(Animal):
def make_sound(self):
return “Meow!”
~~~

Зачем они нужны?

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

https://easyoffer.ru/question/341

68
Q

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

10%

A

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

На уровне языка это объект с методами process_request и process_response. Методы должны вернуть принятый объект (запрос или ответ) для дальнейшей обработки или выкинуть исключение, если что-то не в порядке. В этом случает дальнейшая обработка прекращается.

Чтобы включить Middleware, достаточно добавить путь к нему в список MIDDLEWARE.

69
Q

Чем отличаются декораторы classmethod и staticmethod

10%

A

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

  1. classmethod:

Декоратор преобразует обычный метод класса в тот, который принимает первым аргументом ссылку на класс (обычно называемый cls).
Это означает, что метод classmethod может обращаться к атрибутам и вызывать другие методы класса через ссылку на сам класс, а не через экземпляр класса.
Может использоваться, например, для создания альтернативных конструкторов класса или для работы с классовыми переменными.
Пример classmethod:
~~~
class MyClass:
class_attribute = 123

@classmethod
def class_method(cls):
    return cls.class_attribute

print(MyClass.class_method()) # Выведет: 123
~~~
2. staticmethod:

Декоратор создает метод класса, который не принимает ссылку на сам класс (неявно или явно), и не принимает ссылку на экземпляр класса (обычно называемый self).
Это означает, что staticmethod является статическим методом и может быть вызван как из класса, так и из экземпляра класса, но не имеет доступа к атрибутам и методам класса или экземпляра.
Статические методы могут быть полезны для группировки связанных функций внутри класса или для создания методов, которые не требуют доступа к состоянию класса или экземпляра.
Пример staticmethod:
~~~
class MyClass:
@staticmethod
def static_method():
return “This is a static method”

print(MyClass.static_method()) # Выведет: This is a static method
~~~
Основное отличие между classmethod и staticmethod заключается в том, что classmethod принимает ссылку на класс, а staticmethod - нет.

https://easyoffer.ru/question/798

70
Q

Что происходит в момент итерации по списку

10%

A

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

  1. Инициализация итератора: Создается итератор для списка, который будет использоваться для последовательного доступа к его элементам.
  2. Получение следующего элемента: Итератор используется для получения следующего элемента списка. При первой итерации начинается с первого элемента списка, а затем последовательно переходит к каждому следующему элементу.
  3. Выполнение операций над элементом: На каждой итерации цикла можно выполнять операции с полученным элементом списка, например, выводить его значение, изменять его или выполнять какие-то другие действия.
  4. Проверка завершения итерации: Итерация продолжается до тех пор, пока не будут обработаны все элементы списка. Когда все элементы списка будут обработаны, итерация завершится.
  5. Остановка итерации: После обработки всех элементов списка итератор сообщит, что элементы закончились, и итерация завершится. При этом возможно применение исключения StopIteration, хотя в большинстве случаев он обрабатывается автоматически при использовании цикла for или других конструкций итерации.

Пример итерации по списку с использованием цикла for:
~~~
my_list = [1, 2, 3, 4, 5]

for item in my_list:
print(item)
~~~
В этом примере цикл for проходит по каждому элементу списка my_list, начиная с первого элемента и заканчивая последним, и выводит значение каждого элемента на экран.

https://easyoffer.ru/question/799

71
Q

Что такое GIL

10%

A

В любой момент может выполняться только один поток Python. Глобальная блокировка интерпретатора — GIL — тщательно контролирует выполнение тредов. GIL гарантирует каждому потоку эксклюзивный доступ к переменным интерпретатора (и соответствующие вызовы C-расширений работают правильно).

Принцип работы прост: потоки удерживают GIL, пока выполняются. Однако они освобождают его при блокировании для операций ввода-вывода. Каждый раз, когда поток вынужден ждать, другие, готовые к выполнению потоки, используют свой шанс запуститься.

Когда поток начинает работу, он выполняет захват GIL. Спустя какое-то время планировщик процессов решает, что текущий поток поработал достаточно, и передает управление следующему потоку. Поток №2 видит, что GIL захвачен, так что он не продолжает работу, а погружает себя в сон, уступая процессор потоку №1.

Но поток не может удерживать GIL бесконечно. До Python 3.3 GIL переключался каждые 100 инструкций машинного кода. В поздних версиях GIL может быть удержан потоком не дольше 5 мс. GIL также освобождается, если поток совершает системный вызов, работает с диском или сетью.

Проблема в том, что из-за GIL далеко не все задачи могут быть решены в тредах. Напротив, их использование чаще всего снижает быстродействие программы (при CPU-bound задачах). С использованием тредов требуется следить за доступом к общим ресурсам: словарям, файлам, соединением к БД.

  • GIL упрощает интеграцию non thread safe библиотек на С. Благодаря GIL у нас так много быстрых модулей и биндингов почти ко всему.
  • Библиотекам на C доступен механизм управления GIL. Так, например, NumPy отпускает его на долгих операциях.
    По сути, GIL в питоне делает бесполезной идею применять потоки для параллелизма в вычислительных задачах. Они будут работать последовательно даже на многопроцессорной системе. На CPU Bound задачах программа не ускорится, а только замедлится, так как теперь потокам придется делить пополам процессорное время. При этом I/O операции GIL не замедлит, так как перед системным вызовом поток отпускает GIL.

https://easyoffer.ru/question/800

72
Q

Разница между одинарным и двойным подчеркиванием Python

10%

A

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

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

Обычно используется для обозначения временных или ненужных переменных. Например, при распаковке кортежа в цикле можно использовать _ для игнорирования значений, которые вам не нужны
~~~
for , value in some_list_of_tuples:
# используем только значение, переменная _ игнорируется
print(value)
Может использоваться для предотвращения конфликтов с зарезервированными словами, такими как lambda или class. Например:
class
= “MyClass” # избегаем конфликта с зарезервированным словом class
~~~
2. Двойное подчеркивание \_\_:

В начале имени атрибута или метода (например, \_\_attribute или \_\_method) используется для создания “приватных” атрибутов и методов. Такие атрибуты и методы становятся “скрытыми” внутри класса и не могут быть непосредственно доступны за пределами класса или его подклассов (хотя они могут быть доступны через механизм именования манглинга).
Используется для имитации перегрузки методов операторов. Например, метод \_\_add\_\_() может быть использован для переопределения оператора сложения + для объектов класса.
Пример приватного атрибута и перегрузки оператора:
~~~
class MyClass:
def __init__(self):
self.__private_attribute = 42

def \_\_add\_\_(self, other):
    return self.\_\_private_attribute + other

obj = MyClass()
print(obj.__private_attribute) # Ошибка, так как __private_attribute является приватным атрибутом
print(obj.__add__(8)) # Выведет: 50, перегрузка оператора сложения
~~~

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

https://easyoffer.ru/question/801

73
Q

Как в функцию передаются аргументы, по ссылке или по значению

10%

A

В скобках функции через запятую.

https://easyoffer.ru/question/802

74
Q

Что знаешь про два основных типа данных Python

10%

A

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

1. Изменяемые (mutable):

Изменяемые типы данных могут быть изменены после создания объекта, идентификатор объекта остается неизменным.
Примеры изменяемых типов данных включают:
- Списки (list)
- Словари (dict)
- Множества (set)
- Вложенные списки и словари

Пример:
~~~
my_list = [1, 2, 3]
my_list.append(4) # изменяемый тип данных
~~~

2. Неизменяемые (immutable):

Неизменяемые типы данных не могут быть изменены после создания объекта. Если изменяется значение, создается новый объект с новым идентификатором.
Примеры неизменяемых типов данных включают:
- Целые числа (int)
- Вещественные числа (float)
- Комплексные числа (complex)
- Строки (str)
- Кортежи (tuple)

Пример:
~~~
my_tuple = (1, 2, 3)
my_tuple[0] = 4 # TypeError: ‘tuple’ object does not support item assignment
~~~
Понимание разницы между изменяемыми и неизменяемыми типами данных важно для эффективного использования их в вашем коде. Часто используются как изменяемые, так и неизменяемые типы данных, и выбор между ними зависит от конкретной задачи и требований к программе.

https://easyoffer.ru/question/803

75
Q

Какие магические методы и для чего используются

10%

A

Магическими метода называют методы, имена которых начинаются и заканчиваются двойным подчеркиванием. Магические они потому, что почти никогда не вызываются явно. Их вызывают встроенные функции или синтаксические конструкции. Например, функция len() вызывает метод __len__() переданного объекта. Метод __add__(self, other) вызывается автоматически при сложении оператором +.

Перечислим некоторые магические методы:

__init__: инициализатор класса
__add__: сложение с другим объектом
__eq__: проверка на равенство с другим объектом
__iter__: возвращает итератор

https://easyoffer.ru/question/804

76
Q

Что знаешь о сложности алгоритма

10%

A

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

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

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

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

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

https://easyoffer.ru/question/179

77
Q

Что быстрее, словарь или список

10%

A

Поиск будет быстрее в dict и set, потому что это хеш-таблицы, доступ к элементу которых выполняется за O(1). Для list и tuple поиск будет выполняться в среднем за O(n).

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

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

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

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

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

78
Q

Что такое корутина в Python

10%

A

Это асинхронные функции, которые объявляются через async.

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

https://easyoffer.ru/question/230

79
Q

Какие паттерны программирования знаешь

10%

A

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

1. Порождающие(Creational Patterns):

  • Фабричный метод (Factory Method)
  • Абстрактная фабрика (Abstract Factory)
  • Строитель (Builder)
  • Прототип (Prototype)
  • Одиночка (Singleton)

2. Структурные(Structural Patterns):

  • Адаптер (Adapter)
  • Мост (Bridge)
  • Компоновщик (Composite)
  • Декоратор (Decorator)
  • Фасад (Facade)
  • Приспособленец (Flyweight)
  • Заместитель (Proxy)

3. Поведенческие(Behavioral Patterns):

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

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

https://easyoffer.ru/question/490

80
Q

Назови основные сущности в Django

6%

A

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

  1. Модели (Models):

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

  1. Представления (Views):

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

  1. Шаблоны (Templates):

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

  1. URL-маршруты (URLs):

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

  1. Формы (Forms):

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

  1. Административный интерфейс (Admin):

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

  1. Настройки (Settings):

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

https://easyoffer.ru/question/536

81
Q

Что такое querySet() в Django

6%

A

https://easyoffer.ru/question/537

82
Q

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

6%

A

https://easyoffer.ru/question/538

83
Q

Что означает querySet() ленивые

6%

A

https://easyoffer.ru/question/539

84
Q

Как реализован many to many в Django

6%

A

https://easyoffer.ru/question/540

85
Q

С какими трудностями сталкивался в командной разработке

6%

A
86
Q

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

6%

A
87
Q

Что такое миграция

6%

A

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

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

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

  1. Вы вносите изменения в определения моделей(например, добавляете новое поле или изменяете существующее).
  2. Создаете миграцию с помощью команды makemigrations. Django анализирует изменения в моделях и создает новую миграцию в соответствующей директории migrations.
  3. Применяете миграцию к базе данных с помощью команды migrate. Django выполнит все новые миграции и применит изменения к базе данных.

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

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

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

https://easyoffer.ru/question/768

88
Q

В чем преимущество ORM перед созданием запросов вручную

6%

A

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

  1. Более высокий уровень абстракции: Он позволяет вам думать о данных в терминах объектов и их связей, что делает код более понятным и легким для сопровождения. Вам не нужно думать о том, как представить данные в базе данных, так как ORM делает это за вас.
  2. Безопасность и защита от SQL-инъекций: При его использовании данные параметризуются автоматически, что защищает от SQL-инъекций. ORM обрабатывает множество проблем безопасности данных, таких как экранирование специальных символов и форматирование значений.
  3. Переносимость: При его использовании код становится более переносимым между различными СУБД, так как ORM обрабатывает различия в синтаксисе SQL и внутреннем устройстве СУБД.
  4. Удобство в использовании: Он предоставляет более простой и выразительный способ работы с данными. Он облегчает создание, изменение и удаление записей в базе данных, а также обеспечивает возможность работы с данными на уровне объектов Python.
  5. Меньше повторяющегося кода: Он автоматически генерирует большую часть SQL-кода, что сокращает объем повторяющегося кода и упрощает разработку.
  6. Интеграция с языком программирования: Он позволяет использовать язык программирования для создания и выполнения запросов к базе данных, что делает код более читаемым и понятным.

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

https://easyoffer.ru/question/769

89
Q

Какая сложность основных операций в коллекциях

6%

A

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

  1. Список (List):
  • Доступ к элементу по индексу (indexing): O(1)
  • Вставка в конец (append): O(1)
  • Вставка в начало (insert): O(n)
  • Удаление элемента по индексу (pop): O(n)
  • Удаление элемента по значению (remove): O(n)
  • Поиск элемента (in): O(n)
  1. Словарь (Dictionary):
  • Доступ к элементу по ключу (get): O(1)
  • Вставка элемента (set): O(1)
  • Удаление элемента по ключу (del): O(1)
  • Проверка наличия ключа (in): O(1)
  • Перебор всех элементов: O(n)
  1. Множество (Set):
  • Добавление элемента (add): O(1)
  • Удаление элемента (remove): O(1)
  • Проверка наличия элемента (in): O(1)
  • Перебор всех элементов: O(n)
  1. Кортеж (Tuple):
  • Доступ к элементу по индексу (indexing): O(1)
  • Перебор всех элементов: O(n)

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

https://easyoffer.ru/question/184

90
Q

Какие очевидные недостатки у рекурсии

6%

A

Неоптимизированная рекурсия приводит к накладным расходам ресурсов. При большом количестве итераций можно превысить лимит на число рекурсивных вызовов (recursion depth limit reached), но при возникновении такой необходимости скорее всего вы делаете что-то не так, и лучше присмотритесь к другим инструментам (стэк, например).

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

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

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

https://easyoffer.ru/question/183

91
Q

Какой самый сложный проект у тебя был

6%

A
92
Q

Какие преимущества рекурсивного подхода

6%

A

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

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

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

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

https://easyoffer.ru/question/182

93
Q

Что возвращает метод init

6%

A

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

Пример:
~~~
class MyClass:
def __init__(self, x, y):
self.x = x
self.y = y

obj = MyClass(10, 20)
~~~
В этом примере, при создании нового объекта obj класса MyClass с аргументами 10 и 20, вызывается данный метод, который устанавливает атрибуты x и y нового объекта.

Хотя метод \_\_init\_\_() не возвращает никакого значения, вы можете явно указать его вернуть что-то, если это необходимо, но это не типичное использование этого метода и может привести к путанице при чтении кода. Обычно \_\_init\_\_() используется только для инициализации объекта, а не для возврата значений.

https://easyoffer.ru/question/342

94
Q

Что делает метод new

6%

A

Основное различие между этими двумя методами состоит в том, что __new__ обрабатывает создание объекта, а __init__ обрабатывает его инициализацию.

__new__ вызывается автоматически при вызове имени класса (при создании экземпляра), тогда как __init__ вызывается каждый раз, когда экземпляр класса возвращается __new__, передавая возвращаемый экземпляр в __init__ в качестве параметра self, поэтому даже если вы сохранили экземпляр где-нибудь глобально/статически и возвращали его каждый раз из __new__, для него все-равно будет каждый раз вызываться __init__.

Из вышесказанного вытекает что сначала вызывается __new__, а потом __init__

https://easyoffer.ru/question/343

95
Q

Что такое классы

6%

A

Класс — тип, описывающий устройство объектов. Другими словами, это описание сущности, у которой есть определенный набор свойств и методов.

Шаблон или инструкция для создания объектов = экзмпляров класса

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

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

  1. Атрибуты: Переменные, хранящие данные, связанные с классом. Атрибуты могут быть публичными (доступными извне класса), защищенными (доступными только внутри класса и его подклассов) или приватными (доступными только внутри класса).
  2. Методы: Функции, определенные внутри класса и используемые для работы с атрибутами объектов этого класса. Методы могут изменять состояние объекта или возвращать какие-то значения.
  3. Инициализатор: Специальный метод \_\_init\_\_(), который вызывается при создании нового объекта класса и используется для инициализации его атрибутов.
  4. Конструктор: Специальный метод \_\_new\_\_(), который вызывается перед \_\_init\_\_() и используется для создания нового экземпляра класса.
  5. Деструктор: Специальный метод \_\_del\_\_(), который вызывается при удалении объекта из памяти и используется для освобождения ресурсов или выполнения других операций при завершении работы объекта.

Пример определение:
~~~
class MyClass:
def __init__(self, x):
self.x = x

def my_method(self):
    return self.x * 2

Создание объекта класса MyClass
obj = MyClass(10)
print(obj.my_method()) # Выводит: 20
~~~
В этом примере определен класс MyClass, у которого есть атрибут x, инициализируемый при создании объекта, и метод my_method(), который возвращает удвоенное значение атрибута x объекта. Создается объект класса MyClass с атрибутом x, равным 10, и вызывается метод my_method() для этого объекта.

96
Q

Чем отличаются классы от миксинов (mixin)

6%

A

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

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

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

https://easyoffer.ru/question/345

97
Q

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

6%

A
98
Q

Был ли опыт в написании личных проектов

6%

A