Код на салфетке
2.22K subscribers
747 photos
14 videos
2 files
789 links
Канал для тех, кому интересно программирование на Python и не только.

Сайт: https://pressanybutton.ru/
Чат: https://t.iss.one/+Li2vbxfWo0Q4ZDk6
Заметки автора: @writeanynotes

Реклама и взаимопиар: @Murzyev1995
Сотрудничество и др.: @proDreams
Download Telegram
Что выведет этот код? №42

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

Пример данных в таблице books:
- id: 1, title: "The Great Gatsby", rating: 4, description: "A classic novel about the 1920s."
- id: 2, title: "To Kill a Mockingbird", rating: 3, description: "A novel about racial injustice."
- id: 3, title: "1984", rating: 5, description: "A dystopian social science fiction."

Код ниже показывает, как это можно реализовать с помощью SQLAlchemy 2.

Что выведет этот код?
🔥5
Вчера мы опубликовали задачу, в которой нужно было обновить информацию о книге в базе данных, если её рейтинг ниже среднего по библиотеке и нового предложенного значения. Многие участники отметили, что задача оказалась не такой простой, как казалось на первый взгляд, из-за условий, которые могли легко быть упущены.

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

Пример данных в таблице:
- id: 1, title: "The Great Gatsby", rating: 4, description: "A classic novel about the 1920s."
- id: 2, title: "To Kill a Mockingbird", rating: 3, description: "A novel about racial injustice."
- id: 3, title: "1984", rating: 5, description: "A dystopian social science fiction."

Посмотрите на код ниже и определите, что произойдёт, если мы попытаемся обновить книгу "The Great Gatsby" с новым рейтингом 5 и новым описанием "A classic novel about the American dream.":

sync def update_book_info(
title: str, new_rating: int, new_description: str
) -> None:
async with session_maker() as session:
avg_rating_stmt = select(func.avg(Book.rating)).correlate_except(Book)
avg_rating = await session.execute(avg_rating_stmt)
avg_rating_value = avg_rating.scalar()

stmt = select(Book).where(Book.title == title)
result = await session.execute(stmt)
book = result.scalar_one_or_none()

if (
book
and book.rating < new_rating
and book.rating < avg_rating_value
):
stmt = (
update(Book)
.where(Book.id == book.id)
.values(rating=new_rating, description=new_description)
)
await session.execute(stmt)
await session.commit()


await update_book_info(
title="The Great Gatsby",
new_rating=5,
new_description="A classic novel about the American dream.",
)


Разбор кода:
1. Получение среднего рейтинга всех книг:
- Сначала вычисляется средний рейтинг всех книг в библиотеке с помощью запроса avg_rating_stmt = select(func.avg(Book.rating)).correlate_except(Book). Это значение будет использоваться для проверки, может ли рейтинг книги быть обновлён.
- В нашем примере средний рейтинг всех книг равен (4 + 3 + 5) / 3 = 4.

2. Поиск книги по названию:
- Следующим шагом программа ищет книгу с названием "The Great Gatsby". Если она найдена, то её данные загружаются для дальнейшей проверки.

3. Проверка условий:
- Программа проверяет три условия:
- Книга существует (она найдена в базе).
- Текущий рейтинг книги меньше нового рейтинга.
- Текущий рейтинг книги меньше среднего рейтинга по библиотеке.

В нашем случае, рейтинг книги "The Great Gatsby" равен 4. Новый рейтинг — 5. Средний рейтинг всех книг — 4.

4. Почему обновление не произойдёт:
- Хотя рейтинг книги меньше нового предложенного значения (4 < 5), он не меньше среднего рейтинга (4 = 4). Это значит, что одно из условий не выполнено, и обновления не будет.

Итог:
Книга "The Great Gatsby" не будет обновлена, так как её текущий рейтинг равен среднему рейтингу всех книг, что не позволяет пройти последнюю проверку.

Правильный ответ:
Ничего не произойдёт, так как не соответствует условиям.

Как это исправить:
Если вы хотите обновить книгу при равенстве рейтинга со средним, можно изменить условие проверки на book.rating <= avg_rating_value, чтобы включить случаи, когда рейтинг книги равен среднему.
🤯5🔥1
Привет, друзья!

Прошла еще одна неделя, и у нас накопилось много интересных материалов: статьи, новости и полезные советы. Вот наш недельный дайджест:

Понедельник (14.10.2024) Дайджест за предыдущую неделю

Вторник (15.10.2024) Знаете ли вы, как использовать Namespace и cgroups для обеспечения изоляции при контейнеризации?

Среда (16.10.2024)

Четверг (17.10.2024) FastAPI 4. Модель пользователя и Alembic

Пятница (18.10.2024) Пятничный кинорелакс

Суббота (19.10.2024) Задача

Воскресенье (20.10.2024) Текстовый разбор задачи


Спасибо, что остаетесь с нами! Надеемся, что эти материалы будут вам полезны. Удачи в новой неделе!

С уважением,
Команда канала "Код на салфетке".

#дайджест #материалы #новости #код_на_салфетке
🔥8
Хотите узнать, как использовать multiprocessing в Python для обхода ограничений GIL?

В одном из прошлых постов мы говорили о том, как GIL ограничивает параллельное выполнение задач. Сегодня посмотрим на практический пример использования модуля multiprocessing.

import multiprocessing

def heavy_computation(n):
return sum(i * i for i in range(n))

if __name__ == '__main__':
numbers = [10**7 + i for i in range(4)]
with multiprocessing.Pool(4) as pool:
results = pool.map(heavy_computation, numbers)
print(results)


Здесь GIL не позволит выполнить heavy_computation в нескольких потоках, так как это CPU-нагруженная задача. Чтобы обойти это ограничение, мы использовали модуль multiprocessing:

- Создается пул из 4 процессов: Pool(4).
- Каждый процесс работает в своей копии интерпретатора, обходя GIL.
- Функция выполняется параллельно на разных ядрах.

Код на салфетке x Кусочки кода
🔥9👍2🤩2
Сравнение hashmap C/C++ с dict Python (часть 3)
Автор: Eugene Kaddo

Данная статья продолжит рассмотрение темы отличия hash table C/C++ от dict Python и способов их реализации.


Читать пост в Telegram

Файлы к посту, можно получить в боте по коду: 646514

Пост на сайте
Поддержать проект на Boosty
Поддержать проект в Telegram

#Python #Сравнение_Python_и_C #C #C++ #hash_map #hash_table #dict
🔥6🤩2
🐍 Телеграм-канал PythonProgggg 📢

Хотите глубже погрузиться в увлекательный мир программирования на Python? Не ищите дальше, чем телеграм-канал PythonProgggg! 🚀

Присоединяйтесь к нам на https://t.iss.one/PythonProgggg и приготовьтесь к ежедневной порции благ Python! 🎉

🔸 Почему стоит выбрать PythonProgggg?

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

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

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

Примеры кода: черпайте вдохновение из множества практических примеров кода, которые вы можете изучить и применить в своих собственных проектах.

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

Не упустите возможность стать профессионалом Python! Присоединяйтесь к нам сегодня на https://t.iss.one/PythonProgggg. Вместе раскроем весь потенциал программирования на Python! 🐍💻
4🔥3🤡2👍1
Приветствую!

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

Фильм: Гипнотик

Год: 2024

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

Приятного просмотра и до встречи на следующей неделе с новым кинопостом!
🔥4
Что выведет этот код? №43

Задача:
Вы разрабатываете API для обработки информации о заказах в интернет-магазине. Требуется создать Pydantic-модель Order, которая принимает список товаров, каждый из которых представлен как словарь с полями id и quantity. Используйте Pydantic для преобразования и проверки данных:

- id должен всегда быть строкой;
- quantity — целым числом, и если меньше или равен нулю, должно автоматически подставляться значение по умолчанию — 1.

Посмотрите на код ниже и выберите, что он выведет:
🔥2
Вчерашняя задача оказалась не сложной для большинства из вас. Правильный ответ выбрали 67% участников. Давайте разберем подробно, почему именно так и как работает данный код. Это поможет лучше понять тонкости работы Pydantic, особенно с валидацией и обработкой данных в моделях.

Задача:
Вы разрабатываете API для обработки информации о заказах в интернет-магазине. Требуется создать Pydantic-модель Order, которая принимает список товаров, каждый из которых представлен как словарь с полями id и quantity. Используйте Pydantic для преобразования и проверки данных:

- id должен всегда быть строкой;
- quantity — целым числом, и если меньше или равен нулю, должно автоматически подставляться значение по умолчанию — 1.

Код задачи:
from pydantic import BaseModel, Field, ValidationError, field_validator

class Item(BaseModel):
id: str
quantity: int = Field(default=1, gt=0)

@field_validator("id", mode="before")
def id_to_str(cls, v):
return str(v)


class Order(BaseModel):
items: list[Item]


order_data = {"items": [{"id": 123, "quantity": -5}, {"id": "456", "quantity": "3"}, {"id": 789}]}

order = Order(**order_data)
print(order.items)


**Что происходит в коде?**

1. Класс Item

Для каждого товара в заказе создается отдельный объект Item. Он содержит два поля: id и quantity.

- Преобразование id к строке: К полю id применяется валидатор @field_validator("id", mode="before"). Этот валидатор срабатывает перед основной валидацией и преобразует переданное значение в строку. Это значит, что, например, числовой id 123 автоматически конвертируется в строку "123". Таким образом, независимо от исходного типа данных, id всегда становится строкой.

- Проверка quantity на положительное значение: Поле quantity имеет ограничение gt=0, что означает "должно быть больше нуля". Если в данных указывается значение, не соответствующее этому условию (например, отрицательное число), Pydantic выбрасывает ValidationError. Также quantity имеет значение по умолчанию — 1. Если quantity не указано, автоматически подставится это значение.

2. Класс Order

Класс Order содержит список товаров items, где каждый элемент должен соответствовать модели Item. Благодаря этому, при создании заказа Pydantic автоматически проверяет каждый элемент items и применяет к ним правила, заданные в Item.


Передаваемые данные `order_data`

- Первый элемент: {"id": 123, "quantity": -5}
- Поле id преобразуется в строку "123" с помощью валидатора id_to_str.
- Поле quantity указано как -5, что нарушает условие gt=0 (больше нуля). Поэтому при попытке создать объект Item с такими данными Pydantic выбросит ValidationError.
- Второй элемент: {"id": "456", "quantity": "3"}
- id уже строка, и ваПосмотрим на передаваемые данные:лидатор оставляет его как есть.
- quantity передан как строка "3", но Pydantic автоматически конвертирует её в целое число 3, что удовлетворяет условию gt=0.
- Третий элемент: {"id": 789}
- Поле id преобразуется в строку "789".
- Поле quantity не указано, поэтому используется значение по умолчанию 1.


Почему возникает ошибка?

При создании объекта Order Pydantic проверяет каждый элемент в списке items. Первый элемент нарушает условие gt=0 из-за отрицательного значения quantity, и это приводит к ValidationError. В результате объект Order не создается, и программа останавливается на этом этапе.

Правильный ответ: ValidationError

Таким образом, ValidationError помогает нам избежать ошибок при создании заказа с некорректными данными, таких как отрицательное количество. Этот инструмент позволяет создавать более надежные API, автоматически преобразуя и проверяя данные.
🔥6🤩1
Привет, друзья!

Прошла еще одна неделя, и у нас накопилось много интересных материалов: статьи, новости и полезные советы. Вот наш недельный дайджест:

Понедельник (21.10.2024) Дайджест за предыдущую неделю

Вторник (22.10.2024) Хотите узнать, как использовать multiprocessing в Python для обхода ограничений GIL?

Среда (23.10.2024)

Четверг (24.10.2024) Сравнение hashmap C/C++ с dict Python (часть 3)

Пятница (25.10.2024) Пятничный кинорелакс

Суббота (26.10.2024) Задача

Воскресенье (27.10.2024) Текстовый разбор задачи


Спасибо, что остаетесь с нами! Надеемся, что эти материалы будут вам полезны. Удачи в новой неделе!

С уважением,
Команда канала "Код на салфетке".

#дайджест #материалы #новости #код_на_салфетке
🔥72👍2
Всем привет!

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

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

И я задумался, а почему бы не переписать её на современных технологиях? Подумано - сделано! Я начал работу по переписываю официальной библиотеки.

И так, версия 0.1.1, что сделано на данный момент?
- Написаны модели данных платежа для запроса и ответа.
- Написан класс конфигурации и АПИ клиента
- Начат класс платежа. Написан и работает метод создания платежа.

Работы ещё много... Но, надеюсь, что это всё не зря)

Буду рад, если поставите звёздочку в репозитории проекта.

Ссылки:
- Репозиторий: https://github.com/proDreams/async_yookassa
- PyPi: https://pypi.org/project/async_yookassa/
🔥15👏3👍211🤩1🍓1🆒1
Знаете ли вы как использовать Docker Compose для оркестрации многоконтейнерных приложений?

Docker Compose упрощает управление многоконтейнерными приложениями, позволяя описывать сервисы, сети и тома в едином docker-compose.yml. Это облегчает развертывание и масштабирование сложных систем.

Пример файла для веб-приложения с PostgreSQL:
version: '3.8'

services:
web:
image: examplewebapp:latest
build: ./web
ports:
- "8000:8000"
depends_on:
- db
environment:
- DATABASE_URL=postgres://user:password@db:5432/mydb

db:
image: postgres:13
volumes:
- db_data:/var/lib/postgresql/data
environment:
- POSTGRES_USER=user
- POSTGRES_PASSWORD=password
- POSTGRES_DB=mydb

volumes:
db_data:

Web-сервис строится из Dockerfile в ./web, маппит порт 8000, использует db с данными в db_data, а volumes сохраняет данные между перезапусками.

docker-compose up -d

Это поднимет все сервисы в фоне, настроит сети и тома автоматически.

Код на салфетке x Кусочки кода
🔥6
Приветствую!

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

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

Фильм: Ловушка

Год: 2024

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

Приятного просмотра!
🔥7👏1🤩1
Обновление библиотеки - AIOgram 3.14
Автор: Иван Ашихмин

🚀 Вышла новая версия Aiogram 3.14.0!
Подробности релиза со списком изменений на русском языке.


Читать пост в Telegram

Пост на сайте
Поддержать проект на Boosty
Поддержать проект в Telegram

#Telegram #aiogram #Код_на_салфетке #changelog #боты #обновление_библиотеки
🔥11🤩2👍1
Привет, друзья!

Прошла еще одна неделя, и у нас накопилось много интересных материалов: статьи, новости и полезные советы. Вот наш недельный дайджест:

Понедельник (28.10.2024) Дайджест за предыдущую неделю

Вторник (29.10.2024) Знаете ли вы как использовать Docker Compose для оркестрации многоконтейнерных приложений?

Среда (30.10.2024)

Четверг (31.10.2024)

Пятница (01.11.2024) Пятничный кинорелакс

Суббота (02.11.2024)

Воскресенье (03.11.2024) Обновление библиотеки - AIOgram 3.14


Спасибо, что остаетесь с нами! Надеемся, что эти материалы будут вам полезны. Удачи в новой неделе!

С уважением,
Команда канала "Код на салфетке".

#дайджест #материалы #новости #код_на_салфетке
🔥71👍1
Знаете ли вы, как Python управляет памятью с помощью подсчета ссылок и сборщика мусора?

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

Однако подсчет ссылок не справляется с циклическими ссылками, где объекты ссылаются друг на друга. Такие ситуации возникают, например, в деревьях, где узлы хранят ссылки на родителей, или в связанных списках с двунаправленными связями. Например:
class Employee:
def __init__(self, manager=None):
self.manager = manager

alice = Employee()
bob = Employee(alice)
alice.manager = bob
del alice
del bob

Здесь объекты alice и bob ссылаются друг на друга. Счетчики ссылок не достигнут нуля, и память не будет освобождена. Для решения этой проблемы Python использует циклический сборщик мусора, который обнаруживает и удаляет такие циклы, предотвращая утечки памяти.

Код на салфетке x Кусочки кода
🔥9👍2👏1
Приветствую!

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

Фильм: Сапожник

Год: 2014

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

Устраивайтесь поудобнее и готовьтесь к увлекательному просмотру. Не забывайте делиться своими впечатлениями и мыслями в комментариях. Приятного просмотра!
🔥5🤩2👏1
Что выведет этот код? №44

Задача:
Вы работаете над алгоритмом, который должен выбрать из списка только те числа, которые соответствуют определённым условиям. Однако коллега написал код, и теперь вам нужно понять, что этот код вернёт. В коде используются хитрые конструкции и работа с функциями. Попробуйте предугадать результат, не запуская код.
🔥4
Что выведет код с изображения? №44
Anonymous Quiz
6%
[2, 3, 5, 22]
17%
[3, 5, 10, 22]
50%
[2, 3, 5, 10, 22]
11%
[2, 3, 10, 21, 22]
17%
[2, 3, 5, 10, 15, 21, 22]
🔥5