JuniorPython Developer > Основы Python > Функции и области видимости
Короткий ответ zip() берёт элементы с одинаковыми индексами из переданных итерируемых объектов и собирает из них кортежи. Возвращается объект zip — итератор, который создаётся лениво, поэтому результат обычно преобразуют в список через list(). Как это работает подробнее Синтаксис — zip(*iterables): элементы с индексом 0 образуют первый кортеж, элементы с индексом 1 — второй и так далее. Механизм. Функция попарно соединяет элементы переданных коллекций: names[0] и scores[0] попадают в один кортеж. Короткий вход. Обход останавливается на самом коротком из переданных объектов, а лишние элементы длинных коллекций просто игнорируются. Ленивый итератор. Кортежи создаются по требованию, поэтому для просмотра результата нужен list() или прямой обход в цикле. Одноразовость. Как и любой итератор, объект zip можно использовать один раз — для повторного обхода результат сохраняют в список. Пример кода Что использовать на практике Совместный обход. Применяй for x, y in zip(a, b), чтобы идти по нескольким спискам одновреме
builtinsiterators
MiddlePython Developer > Основы Python > Веб-фреймворки: Django, Flask, FastAPI
Короткий ответ Шаблон в Django — это текстовый документ, обычно HTML-файл, который задаёт внешний вид и структуру страницы сайта; это презентационный компонент архитектуры MVT. Внутри HTML шаблон использует переменные в {{ }} и логические теги вроде {% if %} и {% for %}, чтобы подставлять данные динамически. Как это работает подробнее Представление передаёт данные в шаблон, а язык шаблонов Django (DTL) формирует итоговый HTML для пользователя. Синтаксис. Переменные записываются в двойных фигурных скобках — {{ variable }}, логика — в тегах {% tag %}, например {% if %} и {% for %}. Наследование. Базовый шаблон объявляет блоки {% block %}, а дочерние расширяют его через {% extends %}, избегая дублирования разметки. Подключение. Шаблоны лежат в едином каталоге на уровне проекта или в каталоге templates внутри каждого приложения. Движки. Помимо стандартного DTL в Django можно применять альтернативный движок Jinja2. Разделение. Django — преимущественно бэкенд-фреймворк, поэтому шаблоны отвечают только за представле
djangohtml
JuniorPython Developer > Основы Python > Основы Python
Короткий ответ В языке с динамической типизацией проверка типов происходит во время исполнения программы, а не на этапе компиляции. В Python не нужно объявлять тип переменной: интерпретатор выводит его из присвоенного значения, поэтому одна переменная может хранить объекты разных типов. Как это работает подробнее Динамическая типизация в Python сочетается с сильной: это разные оси, и вместе они определяют поведение языка. Вывод типа по значению. Переменная не привязана к типу: интерпретатор назначает его в момент присваивания, и позже переменной можно присвоить значение другого типа. Сильная типизация. Python не выполняет неявных преобразований, если они небезопасны: например, сложение строки с числом приводит к ошибке TypeError. Проверка в рантайме. Ошибки, связанные с типами, обнаруживаются при выполнении кода, а не до запуска, что требует внимательности и тестов. Пример кода Что использовать на практике Компактный код. Отсутствие объявлений типов ускоряет написание и сокращает объём кода. Аннотации типов.
duck-typingdynamic-typing
MiddlePython Developer > Основы Python > Многопоточность и асинхронность
Короткий ответ Ключевые слова async и await позволяют писать асинхронный код: функция async def становится корутиной, а await приостанавливает её до готовности ожидаемого объекта, возвращая управление циклу событий. Как это работает подробнее При вызове корутина не исполняет тело, а возвращает объект корутины, который должен работать внутри цикла событий asyncio. Корутина. Функция, объявленная через async def; без await или asyncio.run() её код не выполнится. Ожидание. await приостанавливает корутину до завершения другой корутины, asyncio-задачи или Future. Конкурентность. Пока одна корутина ждёт сеть или диск, цикл событий выполняет другие корутины. Запуск. Стандартный вход в асинхронную программу — asyncio.run(), либо await из другой корутины. Пример кода Что использовать на практике Точка входа. Запускай верхнеуровневую корутину через asyncio.run(). Группировка задач. Запускай несколько корутин конкурентно через asyncio.gather(). Тайм-ауты. Ограничивай долгие ожидания через asyncio.wait_for(). Подводные ка
asyncasyncio
MiddleJava Developer > Java Core > Multithreading
Короткий ответ BlockingQueue — интерфейс из пакета java.util.concurrent, описывающий потокобезопасную очередь с блокирующими операциями: put() ждёт, пока в заполненной очереди освободится место, а take() ждёт появления элемента в пустой. Это готовая модель «производитель — потребитель», которая избавляет от ручной синхронизации через wait/notify. Как это работает подробнее Блокирующие операции приостанавливают поток до выполнения условия: put() не завершится, пока в ограниченной очереди не освободится место, а take() — пока не появится элемент. Помимо них есть неблокирующие offer() и poll(): они сразу возвращают false или null, а версии с таймаутом ждут строго ограниченное время. Интерфейс избавляет от ручной синхронизации: не нужны ни явные блокировки, ни wait/notify, ни бесконечные циклы опроса. Очередь сама координирует потоки производителя и потребителя. ArrayBlockingQueue — ограниченная очередь на массиве с фиксированной ёмкостью. LinkedBlockingQueue — очередь на связных узлах, опционально ограниченная.
blockingqueueconcurrent
JuniorJava Developer > Java Core > JVM и память
Короткий ответ Байт-код — это промежуточное представление Java-программы: набор инструкций не для конкретного процессора, а для абстрактной вычислительной машины — JVM. Компилятор javac превращает исходный файл Hello.java в файл Hello.class, внутри которого и находится байт-код. Как это работает подробнее Байт-код компактнее исходного текста и уже содержит результат синтаксического и семантического анализа, но машинным кодом ещё не является — его исполняет JVM. Интерпретация и JIT. JVM либо интерпретирует байт-код, либо компилирует часто исполняемые участки в машинный код с помощью JIT-компилятора (Just-In-Time), что ускоряет выполнение. Связующее звено. Программу компилируют в байт-код один раз, а дальше каждая реализация JVM сама решает, как исполнить его на своей платформе. Пример кода Что использовать на практике Помнить, что результатом javac всегда является .class-файл с байт-кодом. Использовать javap -c, чтобы посмотреть реальные инструкции байт-кода. Рассматривать байт-код как единицу переносимости: о
bytecodeclass-file
JuniorJava Developer > Java Core > Core Java
JVM исполняет байт-код, classpath указывает, где искать классы и ресурсы приложения.
BasicsJVM
MiddleJava Developer > Java Core > Multithreading
Короткий ответ CompletableFuture — класс из пакета java.util.concurrent, появившийся в Java 8 и реализующий интерфейсы Future и CompletionStage. Он представляет результат асинхронной операции и позволяет писать асинхронный, событийно-ориентированный код: строить цепочки зависимых шагов, обрабатывать ошибки и комбинировать несколько операций без блокировки потока. Как это работает подробнее Классический Future ограничен: результат получается только блокирующим вызовом get(), future нельзя завершить вручную, несколько future нельзя соединить в цепочку или скомбинировать, а исключения обрабатывать неудобно. CompletableFuture можно завершить явно методом complete(value) или завершить с ошибкой через completeExceptionally(). Задачи запускаются статическими фабриками runAsync() (без результата) и supplyAsync() (с результатом). Конвейер шагов: thenApply() преобразует результат, thenAccept() потребляет его, thenCompose() соединяет future-операции, а exceptionally()/handle() обрабатывают ошибки. Несколько независимых
asynccompletablefuture
MiddleJava Developer > Java Core > Multithreading
Короткий ответ CountDownLatch позволяет одному или нескольким потокам ждать, пока набор других потоков не выполнит операции: он работает на счётчике, который уменьшается вызовами countDown(), а ожидающие блокируются в await(), пока счётчик не станет нулевым. CyclicBarrier заставляет фиксированную группу потоков встретиться в одной точке и после отпускания сбрасывается, поэтому пригоден для повторного использования. Semaphore хранит счётчик разрешений и через acquire()/release() ограничивает число потоков, одновременно работающих с ресурсом. Как это работает подробнее CountDownLatch создаётся с начальным значением счётчика и используется один раз: когда счётчик достигает нуля, все ожидающие потоки освобождаются, но восстановить latch нельзя. Классический сценарий — главный поток ждёт, пока несколько фоновых задач загрузят данные. CyclicBarrier создаётся на фиксированное число участников (parties); опционально в конструктор передаётся Runnable — барьерное действие, которое выполняется, когда все потоки достигли
countdownlatchcyclicbarrier
MiddlePython Developer > Основы Python > Объектно-ориентированное программирование
Короткий ответ Data class — класс, помеченный декоратором @dataclass из одноимённого модуля, для хранения данных. Достаточно описать поля с аннотациями типов, и декоратор автоматически сгенерирует конструктор, строковое представление и сравнение по содержимому полей. Как это работает подробнее Автогенерация. @dataclass сам создаёт __init__(), модифицированный __repr__() и __eq__(), которые для обычного класса пишут вручную. Сравнение по данным. Два экземпляра с одинаковым содержимым равны, тогда как обычный класс без __eq__ сравнивает по идентичности объектов в памяти и вернёт False. Настройка. Полям можно задавать значения по умолчанию, а поведение генерации методов регулируется параметрами декоратора. Выгода. Такой класс делает код короче, читаемее и уменьшает число ошибок, связанных с ручным написанием служебных методов. Пример кода Что использовать на практике Модели данных. Используй dataclass для структур, хранящих набор полей, вместо классов с рукописным __init__. Неизменяемость. Если объект не должен
attributesdata-classes