Это делается с использованием временного хранения или с возможностью множественного присваивания. Python предоставляет лаконичный способ, позволяющий поменять значения без дополнительных переменных.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🤔2🔥1
В Python 3.11 были добавлены новые классы исключений
BaseExceptionGroup и ExceptionGroup. Эти классы решают проблему одновременной обработки нескольких исключений, которые могут возникать в сложных ситуациях, таких как асинхронное программирование, многопоточность или обработка нескольких связанных ошибок. Давайте разберем, зачем они нужны, как их использовать и какие преимущества они дают.Ранее в Python было возможно выбросить только одно исключение за раз, и обработка нескольких исключений одновременно требовала сложного и неочевидного кода. Например:
При работе с асинхронными функциями или потоками может возникнуть сразу несколько ошибок, и их нужно корректно обработать.
В больших приложениях или библиотеках (например, при работе с
asyncio) может быть необходимость передать сразу несколько исключений, которые произошли в разных местах, как единый объект.BaseExceptionGroup и его подкласс ExceptionGroup позволяют группировать несколько исключений и выбрасывать их вместе в виде одного объекта. Это делает код более читаемым, упрощает обработку и исключает необходимость ручной агрегации ошибок.BaseExceptionGroup - это базовый класс для группировки исключений. Он наследуется от BaseException и, как правило, не используется напрямую.ExceptionGroup - это подкласс, который наследуется от Exception. Этот класс используется для обработки групп исключений, которые возникают при обычных ошибках в коде (не фатальных).Классы исключений
BaseExceptionGroup и ExceptionGroup позволяют создать "группу исключений", которая содержит несколько отдельных исключений. Это полезно, когда вам нужно:Указать несколько ошибок одновременно.
Позволить обработчику исключений работать с каждым из них.
def task_1():
raise ValueError("Ошибка в задаче 1")
def task_2():
raise TypeError("Ошибка в задаче 2")
try:
# Создаем группу исключений
raise ExceptionGroup(
"Ошибки в задачах",
[ValueError("Ошибка в задаче 1"), TypeError("Ошибка в задаче 2")]
)
except ExceptionGroup as eg:
for exc in eg.exceptions:
print(f"Обнаружено исключение: {exc}")
Результат
Обнаружено исключение: Ошибка в задаче 1
Обнаружено исключение: Ошибка в задаче 2
При обработке
ExceptionGroup можно использовать механизм фильтрации с помощью конструкции except*. Это нововведение в Python 3.11 позволяет обрабатывать разные типы исключений внутри группы по-разному.try:
raise ExceptionGroup(
"Ошибки в задачах",
[ValueError("Ошибка 1"), TypeError("Ошибка 2"), ValueError("Ошибка 3")]
)
except* ValueError as ve:
print("Обрабатываем ValueError:", ve)
except* TypeError as te:
print("Обрабатываем TypeError:", te)
Результат
Обрабатываем ValueError: Ошибка 1
Обрабатываем ValueError: Ошибка 3
Обрабатываем TypeError: Ошибка 2
Вы можете объединить связанные ошибки и передать их в одном объекте.
Использование
except* позволяет обработать каждое исключение из группы отдельно, не теряя гибкости.В асинхронных задачах (
asyncio) часто возникает несколько ошибок одновременно, и их можно группировать для дальнейшей обработки.Код становится проще и понятнее, так как не нужно вручную собирать и разбирать исключения.
Когда вы работаете с несколькими задачами, которые могут порождать ошибки одновременно (например, асинхронный код).
Когда вы хотите сообщить о нескольких связанных ошибках, не выбрасывая каждую из них отдельно.
Когда требуется раздельная обработка разных типов ошибок.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10
Это неупорядоченная коллекция уникальных элементов в Python. Это одна из встроенных структур данных языка, которая используется, когда вам нужно работать с наборами данных, исключая дубликаты и выполняя операции над множествами (например, пересечение, объединение и разность).
Элементы множества не имеют фиксированного порядка, то есть вы не можете обращаться к элементам по индексу, как в списках или кортежах.
Во множестве не может быть дубликатов. Если вы добавите во множество несколько одинаковых элементов, они будут храниться как один экземпляр.
Множества в Python изменяемы: вы можете добавлять, удалять и изменять их элементы. Однако сами элементы множества должны быть неизменяемыми (например, числа, строки, кортежи).
Операции проверки принадлежности (
in), добавления и удаления элементов работают очень быстро, благодаря использованию хэш-таблиц в реализации множества.Для создания пустого множества используется функция
set(), так как {} создаёт пустой словарьempty_set = set()
print(empty_set) # Output: set()
Вы можете передать список, строку, кортеж или другой итерируемый объект в функцию
set(). # Создание множества из списка
numbers = set([1, 2, 3, 4, 5])
print(numbers) # Output: {1, 2, 3, 4, 5}
# Создание множества из строки (уникальные символы)
chars = set("hello")
print(chars) # Output: {'h', 'e', 'l', 'o'} (порядок может быть разным)
Вы также можете использовать фигурные скобки
{} для создания множестваfruits = {"apple", "banana", "cherry"}
print(fruits) # Output: {'apple', 'banana', 'cherry'}Используется метод
add()my_set = {1, 2, 3}
my_set.add(4)
print(my_set) # Output: {1, 2, 3, 4}remove() — удаляет элемент, выбрасывая ошибку, если его нет.discard() — удаляет элемент, не выбрасывая ошибку, если его нет.my_set = {1, 2, 3}
my_set.remove(2) # Удаляем элемент 2
print(my_set) # Output: {1, 3}
my_set.discard(5) # Ошибки не будет, если элемента 5 нетpop() — удаляет и возвращает случайный элемент (так как множество неупорядочено)my_set = {1, 2, 3}
removed_element = my_set.pop()
print(removed_element) # Например: 1
print(my_set) # Например: {2, 3}my_set = {1, 2, 3}
my_set.clear()
print(my_set) # Output: set()Используется оператор
inmy_set = {1, 2, 3}
print(2 in my_set) # Output: True
print(5 in my_set) # Output: FalsePython поддерживает классические операции теории множеств:
Возвращает множество, содержащее все элементы из двух множеств.
set1 = {1, 2, 3}
set2 = {3, 4, 5}
print(set1 | set2) # Output: {1, 2, 3, 4, 5}
print(set1.union(set2)) # То же самоеВозвращает элементы, которые присутствуют в обоих множествах.
print(set1 & set2) # Output: {3}
print(set1.intersection(set2)) # То же самоеВозвращает элементы, которые присутствуют только в одном множестве (а не в другом).
print(set1 - set2) # Output: {1, 2} (только в set1)
print(set1.difference(set2)) # То же самоеВозвращает элементы, которые есть в одном из множеств, но не в обоих сразу.
print(set1 ^ set2) # Output: {1, 2, 4, 5}
print(set1.symmetric_difference(set2)) # То же самоеЕсли вам нужно создать множество, которое нельзя изменить, используйте
frozensetfrozen = frozenset([1, 2, 3])
print(frozen) # Output: frozenset({1, 2, 3})
# frozen.add(4) # Ошибка: 'frozenset' object has no attribute 'add'
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7
Оператор % возвращает остаток от деления одного числа на другое. Используется для проверки чётности, цикличности, деления по модулю и т.д.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
Обработка исключений — это механизм в программировании, который позволяет предотвращать аварийное завершение программы, если во время выполнения возникает ошибка. Вместо того чтобы программа просто "упала", обработка исключений дает возможность перехватить ошибку и обработать её безопасным способом.
В реальном коде ошибки неизбежны:
деление на ноль (
ZeroDivisionError), обращение к несуществующему индексу (
IndexError), работа с несуществующим файлом (
FileNotFoundError) и т. д. В Python для обработки исключений используется конструкция try-except.
Обработка деления на ноль
try:
x = 10 / 0 # Ошибка: деление на ноль
except ZeroDivisionError:
print("Ошибка! Деление на ноль невозможно.")
Результат: вместо аварийного завершения программы мы получаем сообщение
Ошибка! Деление на ноль невозможно.
Обработка нескольких типов исключений
try:
num = int(input("Введите число: ")) # Возможна ошибка ValueError
result = 10 / num # Возможна ошибка ZeroDivisionError
except ZeroDivisionError:
print("Ошибка! Деление на ноль.")
except ValueError:
print("Ошибка! Введите число.")
Если пользователь введет "abc", программа не завершится с ошибкой, а выведет
Ошибка! Введите число.
Использование
finally (код, который выполняется всегда) try:
file = open("data.txt", "r") # Возможна ошибка FileNotFoundError
content = file.read()
except FileNotFoundError:
print("Файл не найден!")
finally:
print("Программа завершена.") # Выполнится в любом случае
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
GIL, или глобальная блокировка интерпретатора, предотвращает одновременное выполнение нескольких потоков в интерпретаторе Python. Это упрощает реализацию интерпретатора и защищает память от ошибок, связанных с конкурентным доступом. Таким образом, он обеспечивает безопасность при многопоточности.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Когда сервер получает HTTP-запрос типа GET, он выполняет следующие действия
проверяет URL и параметры в строке запроса (например,
?id=123). находит запрашиваемый файл, данные из базы или другой ресурс.
отправляет данные клиенту (если ресурс найден — код 200, если нет — 404).
не изменяет данные на сервере, используется только для чтения.
повторные запросы дают одинаковый результат.
данные передаются через строку запроса, что не подходит для конфиденциальной информации.
import requests
response = requests.get("https://api.example.com/data", params={"id": 123})
print(response.text) # Данные с сервера
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
yield from используется в генераторах и позволяет:
- делегировать итерацию другому генератору или итерируемому объекту;
- упрощает код вложенных генераторов;
- эффективно используется в асинхронных корутинах до Python 3.5, до появления async/await.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4💊2
Оконные функции (window functions) — это специальные функции в SQL, которые выполняют вычисления по строкам внутри "окна" (группы строк), но не агрегируют их.
SELECT
id,
месяц,
продавец,
сумма,
SUM(сумма) OVER (PARTITION BY месяц) AS общий_доход_в_месяц
FROM sales;
Пронумеруем продажи каждого продавца в порядке убывания суммы.
SELECT
id,
продавец,
сумма,
ROW_NUMBER() OVER (PARTITION BY продавец ORDER BY сумма DESC) AS номер
FROM sales;
Если два продавца получили одинаковую сумму,
RANK() пропустит следующий номер, а DENSE_RANK() – нет. SELECT
продавец,
сумма,
RANK() OVER (ORDER BY сумма DESC) AS ранг_1,
DENSE_RANK() OVER (ORDER BY сумма DESC) AS ранг_2
FROM sales;
LAG() даёт предыдущее значение, LEAD() – следующее.
SELECT
месяц,
продавец,
сумма,
LAG(сумма) OVER (PARTITION BY продавец ORDER BY месяц) AS предыдущий_месяц,
LEAD(сумма) OVER (PARTITION BY продавец ORDER BY месяц) AS следующий_месяц
FROM sales;
Иногда нужно анализировать не всю группу, а только несколько соседних строк.
SELECT
месяц,
продавец,
сумма,
AVG(сумма) OVER (PARTITION BY продавец ORDER BY месяц ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) AS скользящее_среднее
FROM sales;
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
Makefile используется для автоматизации задач: сборки программ, компиляции, тестирования, упаковки. Это особенно удобно в больших проектах, где одна команда make может запускать цепочку действий с зависимостями.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥1
Существует несколько видов тестов, каждый из которых имеет свою цель и особенности.
Проверка работы отдельных модулей или функций в изоляции от других частей системы.
Ориентированы на минимальные части кода (функции, методы, классы).
Высокая скорость выполнения.
Простота написания и отладки.
Обычно пишутся разработчиками.
def add(a, b):
return a + b
def test_add():
assert add(1, 2) == 3
Проверка взаимодействия между различными модулями или компонентами системы.
Тестируют комбинации модулей и их взаимодействие.
Более сложные и медленные по сравнению с юнит-тестами.
Могут выявить проблемы в интерфейсах между модулями.
def fetch_data_from_api():
response = requests.get('https://api.example.com/data')
return response.json()
def test_fetch_data_from_api():
data = fetch_data_from_api()
assert 'key' in data
Проверка всей системы целиком на соответствие требованиям.
Тестируют систему в рабочей среде.
Включают проверку всех функциональных и нефункциональных требований.
Могут включать пользовательские сценарии.
Тестирование веб-приложения на основе реальных пользовательских сценариев, включая проверку интерфейса, баз данных и API.
Проверка соответствия системы требованиям и ожиданиям заказчика или конечного пользователя.
Часто выполняются вместе с заказчиком или пользователем.
Фокусируются на бизнес-требованиях и пользовательских сценариях.
Успешное прохождение приемочных тестов является критерием готовности системы к выпуску.
Тестирование нового функционала с участием конечных пользователей для проверки его удобства и соответствия их ожиданиям.
Убедиться, что изменения в коде не вызвали новых ошибок в уже работающем функционале.
Выполняются после внесения изменений в код.
Обычно автоматизируются и включают повторное выполнение всех или части существующих тестов.
Повторное выполнение всех юнит-тестов и интеграционных тестов после рефакторинга кода.
Проверка нефункциональных аспектов системы, таких как производительность, безопасность, удобство использования и др.
Измеряют скорость выполнения, пропускную способность и время отклика системы.
Оценивают защищенность системы от угроз и атак.
Проверяют удобство и интуитивность пользовательского интерфейса.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3