JuniorPython Developer > Основы Python > Коллекции и структуры данных
Короткий ответ Список — изменяемая коллекция: его содержимое можно менять после создания. Кортеж — неизменяемый: элементы задаются один раз, и изменить их нельзя. Как это работает подробнее Разница в изменяемости влечёт важные практические следствия. Хешируемость. Кортеж можно использовать как ключ словаря или элемент множества, а список — нет, поскольку он изменяем. Память и скорость. Кортеж обычно занимает меньше памяти и создаётся быстрее, чем список с теми же элементами. Соглашение о данных. Список принято использовать для однородных последовательностей, а кортеж — для разнородных, фактически как запись, например пара «адрес и порт». Один элемент. Кортеж из одного элемента создаётся только с запятой: (1,), иначе (1) — просто число в скобках. Что использовать на практике Изменяемые данные. Если элементы нужно дополнять, удалять или сортировать на месте — выбирай список. Неизменяемый контракт. Для фиксированного набора значений, ключа словаря или быстрого доступа к набору данных подходит кортеж. Структуры-з
data-structuresimmutable
JuniorPython Developer > Основы Python > Основы Python
Короткий ответ == проверяет равенство значений двух объектов, а is — ссылаются ли переменные на один и тот же объект в памяти. Для сравнения содержимого используют ==, а is — для синглтонов вроде None. Как это работает подробнее Результаты операторов могут расходиться: одинаковые значения часто хранятся в разных объектах. Равенство значений. == сравнивает содержимое объектов и возвращает true, когда оно эквивалентно, даже если объекты разные. Идентичность. is истинен только когда обе переменные хранят ссылку на один и тот же объект. Синглтоны. None, True и False существуют в единственном экземпляре, поэтому сравнение через is надёжно и быстрее. Пример кода Что использовать на практике Сравнение значений. Для строк, списков, чисел и других данных всегда применяй ==. Проверка на None. Используй идиоматичную запись x is None — она надёжна и быстрее. Осторожность с is. Для значений на is не полагайся: интерпретатор может кэшировать объекты. Подводные камни Кэш малых чисел. CPython переиспользует целые от -5 до 25
comparisonequality
MiddleBackend Developer > Платформа и асинхронность > OS & Systems
Процесс имеет изолированное адресное пространство, потоки одного процесса разделяют память.
BackendOS & Systems
JuniorJava Developer > Java Core > Основы Java
Короткий ответ Оператор == для ссылочных типов сравнивает ссылки: результат true, только если переменные указывают на один и тот же объект в памяти; для примитивов он сравнивает значения. Метод equals() предназначен для сравнения содержимого объектов, но в базовом Object он реализован через ==, поэтому классы, где важно логическое равенство, — прежде всего String — переопределяют его. Как это работает подробнее == для примитивов — сравнение значений, например 5 == 5 верно. == для ссылок — reference equality: проверка, что ссылки ведут на один объект; сравнение с null делается именно так. equals() — content equality: сравнение содержимого; переопределение требует согласованного hashCode(). Object.equals() — по умолчанию делегирует ==, поэтому без переопределения разные объекты с одинаковыми данными считаются неравными. Пример кода Что использовать на практике Сравнивай строки и другие объекты по содержимому через equals(), а не через ==. == используй для примитивов, проверки на null и случаев, когда важно, что
comparisonequals
JuniorJava Developer > Java Core > Collections
Короткий ответ Различие — во внутренней структуре. ArrayList построен на динамическом массиве Object[]: доступ по индексу — O(1), вставка или удаление в середине — O(n) из-за сдвига, добавление в конец — амортизированно O(1). LinkedList — двусвязный список: каждый элемент обёрнут в узел со ссылками на соседей; вставка в найденную позицию сводится к перестановке ссылок, но поиск позиции идёт перебором за O(n). Как это работает подробнее ArrayList хранит элементы в массиве, который автоматически расширяется при заполнении; элементы лежат подряд, поэтому итерация быстрая и хорошо используется кэш процессора. LinkedList на каждый элемент создаёт отдельный объект-узел со ссылками на предыдущий и следующий; узлы разбросаны по памяти, поэтому структура проигрывает и ArrayList, и более современным коллекциям. Доступ по индексу: у ArrayList O(1), у LinkedList — перебор от начала или конца, O(n). Вставка в середину: у ArrayList сдвиг последующих элементов — O(n); у LinkedList после поиска узла — O(1), но сам поиск стои
arraylistbig-o
MiddlePython Developer > Основы Python > Веб-фреймворки: Django, Flask, FastAPI
Короткий ответ Flask — лёгкий микрофреймворк с базовой маршрутизацией и каркасом, где остальные библиотеки разработчик выбирает сам. Django — полнофункциональный фреймворк со встроенными ORM, аутентификацией, админ-панелью и шаблонами. Flask берут за гибкость, Django — за структуру и скорость разработки крупных проектов. Как это работает подробнее Разница — в объёме встроенных возможностей и жёсткости архитектуры. Микрофреймворк. Flask даёт маршрутизацию и простейший каркас, а ORM, аутентификацию и другие инструменты подключают расширениями: обычно SQLAlchemy или PyMongo. Batteries included. Django включает встроенные ORM, аутентификацию, админ-панель, маршрутизацию URL и систему шаблонов. Структура. У Django фиксированная архитектура проекта, что даёт единообразие, но кривая обучения круче. Базы данных. Встроенный ORM Django поддерживает PostgreSQL, MySQL, SQLite и Oracle, а Flask по умолчанию ORM не имеет. Что использовать на практике Flask. Бери для API, микросервисов и небольших или средних приложений с г
djangoflask
JuniorJava Developer > Java Core > Строки
Короткий ответ Все три класса работают со строками, но различаются неизменяемостью и потокобезопасностью. String неизменяем: любой «изменяющий» метод создаёт новую строку. StringBuilder и StringBuffer изменяемы: они модифицируют внутренний буфер через append, insert, replace, не создавая новые объекты. Методы StringBuffer объявлены synchronized, поэтому он потокобезопасен, но медленнее StringBuilder. Как это работает подробнее StringBuffer существует с Java 1.0, его методы синхронизированы; StringBuilder появился в Java 5 как несинхронизированный аналог. Вне циклов компилятор сам превращает конкатенацию через + в вызовы StringBuilder, но внутри цикла это не спасает от множества промежуточных объектов. String — неизменяемый, подходит для строк, которые не меняются; переиспользуется в пуле. StringBuilder — изменяемый, без синхронизации, самый быстрый в однопоточном коде; появился в Java 5. StringBuffer — изменяемый, методы synchronized, потокобезопасный, но медленнее; существует с Java 1.0. Компилятор — простая
immutabilityjava
MiddlePython Developer > Основы Python > Многопоточность и асинхронность
Короткий ответ Threading выполняет потоки в одном процессе: они разделяют память и легко обмениваются данными, но для CPU-bound задач ограничены GIL. Multiprocessing запускает отдельные процессы со своей памятью и интерпретатором — они не ограничены GIL и действительно параллельно исполняются на разных ядрах. Как это работает подробнее Выбор между модулями — классический компромисс между лёгкостью и общим доступом к памяти (потоки) и изоляцией с настоящим параллелизмом (процессы). Потоки. Живут внутри одного процесса, создаются быстро, легко обмениваются данными через общую память, но требуют синхронизации блокировками и очередями. Процессы. Каждый имеет собственную память и свой интерпретатор, не ограничен GIL и может исполняться на отдельном ядре, однако создаётся тяжелее. Изоляция. Падение одного процесса не рушит остальные, но обмен данными между ними сложнее: очереди, pipe или общая память. Критерий выбора. Потоки предпочтительны для ввода-вывода, процессы — для вычислительных задач, которым нужны все яд
gilmultiprocessing
JuniorPython Developer > Основы Python > Исключения и контекстные менеджеры
Короткий ответ В блок try помещают код, который может выбросить исключение, а except перехватывает ошибки. Блок else срабатывает, только когда исключения не было, а finally выполняется всегда — независимо от того, произошла ошибка или нет. Как это работает подробнее Конструкция управляет ошибками времени выполнения, не давая программе прерваться в произвольном месте. Несколько except. Для разных типов ошибок пишут отдельные блоки или один блок с кортежем типов исключений. Блок else. Выполняется только при успешном завершении try, без единого исключения. Блок finally. Предназначен для очистки и работает всегда: закрытие файлов, освобождение ресурсов. Порядок блоков. Фиксирован: сначала try, затем один или несколько except, потом else и finally. Неперехваченная ошибка. Исключение передаётся наружу во внешние обработчики, а без них интерпретатор завершает программу и печатает информацию об ошибке. Пример кода Что использовать на практике Только опасный код. В try помещай лишь операции, которые реально могут брос
error-handlingexceptions
MiddleProduct Manager > Discovery и приоритизация > Приоритизация
Фреймворк не принимает решение за менеджера: он делает аргументы сравнимыми и обсуждаемыми.
ПриоритизацияПродукт