JuniorPython Developer > Основы Python > Коллекции и структуры данных
Короткий ответ Множество — неупорядоченная коллекция уникальных элементов для быстрой проверки вхождения. Словарь — коллекция пар «ключ — значение», дающая быстрый доступ к значению по уникальному ключу и сохраняющая порядок вставки. Как это работает подробнее Структуры похожи синтаксически, но решают разные задачи. Создание. Множество задаётся фигурными скобками или функцией set(), словарь — фигурными скобками с парами «ключ: значение». Пустые скобки. Пустые фигурные скобки {} создают словарь, а не множество: пустое множество создаётся только вызовом set(). Хеш-таблицы. Обе структуры построены на хешировании: у множества хешируются сами элементы, у словаря — ключи, что и обеспечивает высокую скорость поиска. Что использовать на практике Проверка вхождения. Когда нужно узнать, есть ли элемент в коллекции, и исключить дубликаты, используй множество. Соответствие данных. Когда нужно быстро получить значение по ключу, например по идентификатору пользователя, используй словарь. Операции над множествами. Для объед
data-structuresdict
MiddlePython Developer > Основы Python > Веб-фреймворки: Django, Flask, FastAPI
Короткий ответ MVC и MVT разделяют данные, бизнес-логику и представление, но распределяют роли по-разному. В MVC запросы обрабатывает явный контроллер, а в MVT эту роль берёт на себя фреймворк: view содержит логику запроса, а template отвечает за вывод. Как это работает подробнее MVT в терминах Django называют также MTV — это вариант MVC, адаптированный под философию фреймворка. MVC. Модель управляет данными и бизнес-логикой, представление показывает их пользователю, а контроллер принимает запросы и координирует модель и представление. MVT. Модель работает с данными и базой, view выполняет прикладную логику запроса, а шаблон определяет, как данные отображаются. Роль фреймворка. В Django диспетчер URL и механизм обработки запросов выполняют маршрутизацию автоматически, поэтому отдельный контроллер не нужен. Терминология. В MVT view — функция или класс, обрабатывающий запрос, а представлением занимается template. Что использовать на практике Структура проекта. Держи модели в models.py, обработчики — во views.py
architecturedjango
JuniorJava Developer > Java Core > ООП
Короткий ответ Перегрузка (overloading) — наличие в одном классе нескольких методов с одинаковым именем и разным списком параметров; нужный вариант выбирает компилятор по типам аргументов, поэтому это полиморфизм времени компиляции. Переопределение (overriding) — изменение реализации унаследованного метода в классе-наследнике при сохранении сигнатуры; реализацию выбирает JVM по фактическому типу объекта на этапе выполнения. Как это работает подробнее Механизмы удобно сравнивать по нескольким осям: где происходит, как связаны сигнатуры и когда выбирается реализация. Где происходит. Перегрузка — внутри одного класса; переопределение — между родителем и наследником. Сигнатура. При перегрузке параметры обязаны отличаться; при переопределении — обязаны совпадать, а возвращаемый тип должен быть тем же или ковариантным (подтипом). Момент выбора. Перегрузка — на этапе компиляции; переопределение — на этапе выполнения, по фактическому типу объекта. Ограничения. Переопределить можно только унаследованный не-static, не-
javaoop
MiddleJava Developer > Java Core > Исключения
Короткий ответ Exception и Error — наследники Throwable, но это разные классы проблем. Exception — событие, нарушающее нормальный ход программы, которое в большинстве случаев можно перехватить через try-catch и восстановить работу. Error — серьёзная проблема уровня JVM или окружения: приложение обычно не в силах с ней справиться, поэтому ловить Error не принято. Как это работает подробнее Exception описывает события, нарушающие нормальный ход программы, но в большинстве случаев восстановимые: IOException, SQLException (checked), а также RuntimeException и её наследники. Перехватив такое исключение через try-catch, программа обычно может продолжить работу. Error — это критические проблемы уровня JVM или окружения: OutOfMemoryError, StackOverflowError, NoClassDefFoundError, AssertionError. Дальнейшая стабильная работа часто невозможна, поэтому «чинить» их в коде не принято — нужны другие настройки JVM, исправление кода или инфраструктуры. Технически перехватить Error можно (он наследник Throwable), но делать эт
errorexceptions
MiddlePython Developer > Основы Python > Веб-фреймворки: Django, Flask, FastAPI
Короткий ответ get() возвращает ровно один объект и выбрасывает исключения DoesNotExist или MultipleObjectsReturned, если число записей не совпадает. filter() возвращает QuerySet со всеми подходящими объектами, и пустой результат для него нормален. Как это работает подробнее Методы различаются ожидаемым числом записей и типом результата. get(). Уместен, когда условие гарантированно выделяет единственную запись, например первичный ключ: Student.objects.get(id=1). filter(). Возвращает QuerySet с одной, несколькими или ни одной записью, который можно дальше уточнять и сортировать. Исключения. DoesNotExist и MultipleObjectsReturned обрабатываются через try/except с классами исключений Django. Тип результата. get() сразу даёт экземпляр модели, а filter() — ленивый QuerySet, который выполняется при обращении к данным. Пример кода Что использовать на практике Уникальные поля. Используй get() для поиска по id или другому уникальному полю. Произвольный набор. Используй filter(), когда результат может быть пустым или м
djangofilter
MiddleJava Developer > Java Core > Collections
Короткий ответ HashMap хранит пары в хэш-таблице: порядок обхода не определён и зависит от хэш-кодов и размера таблицы, операции put, get, remove в среднем O(1); допускается один null-ключ и null-значения. TreeMap хранит записи в красно-чёрном дереве: ключи всегда отсортированы — по естественному порядку (Comparable) или заданному Comparator, а все операции занимают O(log n). Как это работает подробнее TreeMap — это самобалансирующееся бинарное дерево поиска: в каждой вершине хранятся ключ, значение, ссылки на потомков и цвет (красный или чёрный); инварианты балансировки гарантируют высоту O(log n). null-ключ TreeMap не допускает, так как при вставке ключ нужно с чем-то сравнивать. Главный козырь — работа с упорядоченными данными: firstKey(), lastKey(), headMap(), tailMap(), subMap(). HashMap: порядок ключей не важен и нужна максимальная скорость. TreeMap: нужен отсортированный обход, поиск ближайших ключей или диапазонные выборки. Пример кода Что использовать на практике Используйте HashMap, когда порядок кл
big-ocollections
MiddleJava Developer > Java Core > Collections
Короткий ответ HashSet основан на HashMap (элементы — ключи карты) и не гарантирует порядка: элементы распределяются по корзинам по хэш-коду, операции добавления и поиска в среднем O(1), допускается один null. LinkedHashSet наследует HashSet и дополнительно прошивает элементы связным списком в порядке вставки. TreeSet хранит элементы отсортированными в красно-чёрном дереве за O(log n), а null не допускает. Как это работает подробнее Порядок в LinkedHashSet задаётся порядком добавления: при итерации элементы приходят именно в нём, цена — чуть больший расход памяти и немного более медленные операции. TreeSet сортирует по естественному порядку (Comparable) либо по переданному Comparator; при вставке элемент сразу сравнивается с другими, поэтому null даёт NullPointerException. Дерево позволяет отдавать диапазоны: subSet, headSet, tailSet. HashSet: максимальная скорость, порядок не важен. LinkedHashSet: нужен порядок вставки. TreeSet: нужен отсортированный обход и диапазонные операции. Пример кода Что использовать
collectionshashset
JuniorJava Developer > Java Core > Collections
HashTable синхронизирован целиком и не допускает null, HashMap быстрее и допускает один null-ключ.
Collections
JuniorPython Developer > Основы Python > Коллекции и структуры данных
Короткий ответ Метод sort() сортирует список на месте (in-place) и возвращает None, а функция sorted() принимает любой итерируемый объект и возвращает новый отсортированный список, оставляя исходный без изменений. Как это работает подробнее Выбор между ними зависит от задачи: нужен ли исходный порядок и какой именно объект сортируется. Сортировка на месте. list.sort() изменяет сам список и экономит память, потому что новая коллекция не создаётся. Новый список. sorted() работает с любым итерируемым объектом — строкой, кортежем, словарём, множеством — и всегда возвращает список. Общие параметры. Обе функции поддерживают reverse=True для сортировки по убыванию и параметр key — функцию, по результату которой сравниваются элементы, например sorted(words, key=len). Возврат None. Метод sort() не возвращает отсортированный список, поэтому присваивание его результата переменной теряет данные. Пример кода Что использовать на практике Исходный не нужен. Когда старый порядок не важен и хочется сэкономить память, использу
listspython
SeniorJava Developer > Java Core > Multithreading
Короткий ответ Оба механизма обеспечивают взаимное исключение и реентерабельны: поток, уже владеющий монитором или замком, может захватить его повторно. synchronized — встроенная конструкция языка: монитор захватывается при входе в метод или блок и автоматически освобождается при выходе, даже при исключении. ReentrantLock из java.util.concurrent.locks требует явного lock() и освобождения в finally, но даёт больше контроля. Как это работает подробнее Возможности synchronized ограничены: нельзя прервать поток, ожидающий блокировку, нельзя установить таймаут ожидания, нет честной (fair) очереди, а захват возможен только в пределах одного метода или блока. ReentrantLock предоставляет tryLock() (захват без блокировки или с таймаутом), lockInterruptibly() (прерываемое ожидание), честные замки и несколько объектов Condition для тонкого управления ожиданием. Именно tryLock с таймаутом позволяет писать код, устойчивый к deadlock: не получилось захватить блокировку — поток освобождает уже захваченные ресурсы и повторяе
javalock