Код на салфетке
2.24K subscribers
750 photos
15 videos
2 files
793 links
Канал для тех, кому интересно программирование на Python и не только.

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

Реклама и взаимопиар: @Murzyev1995
Сотрудничество и др.: @proDreams
Download Telegram
Что выведет этот код? №33
🔥1
Вчерашняя задача была не простой, на первый взгляд. Бинарные деревья сложно даются многим, а данную задачу решило 29% из всего 14ти ответивших.

Код задачи:
from dataclasses import dataclass


@dataclass
class Node:
value: int
left: "Node" = None
right: "Node" = None


def sod(root, depth=0):
if root is None:
return 0
return depth + sod(root.left, depth + 1) + sod(root.right, depth + 1)


root_node = Node(
value=1,
left=Node(value=2, left=Node(4), right=Node(5)),
right=Node(value=3, left=Node(6), right=Node(7))
)

print(sod(root_node))



Разбор задачи
Пойдём сверху вниз. Сперва создаём датакаласс Node, описывающий узел бинарного дерева. Применение датакласса описано в посте "[AIOgram3 5.1. Создание структуры](https://pressanybutton.ru/post/telegram-bot-na-aiogram3/aiogram3-51-sozdanie-struktury/)".
В классе прописываем три поля:
1. value - числовое значение хранящееся в узле.
2. left - указание на дочерний узел в левой части дерева.
3. right - указание на дочерний узел в правой части дерева.
Обратите внимание, поля left и right являются объектами этого же класса Node и для указания типа данных используются двойные кавычки, поскольку мы не можем явно указать внутри класса, что он используется "сам в себе".

Далее идёт функция sod, принимающая аргументы:
- root - корневой узел.
- depth - глубина относительно начала дерева, по умолчанию 0.
Поскольку функция рекурсивная, необходимо в самом начале прописать условие выхода из рекурсии. Прописываем блок if, проверяющий, что переданный корень существует, если же вместо него пришёл None, возвращаем 0.
Если выхода из функции не произошло, то возвращаем сумму текущей глубины с глубинами дочерних узлов в рекурсивном вызове.

После класса и функции, создаём переменную root_node, в которой определяем экземпляр класса Node с рядом дочерних узлов.

В самом конце выводим результат вызова функции sod в терминал.

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


Что это за дерево такое?
Теперь разберёмся, какое дерево у нас получилось. Мы построили классическое бинарное дерево. В нашем случае, корневой узел содержит значение 1, его левый потомок - узел с значением 2, правый - 3, и так далее. Каждый узел может иметь до двух потомков: left и right. Графически дерево можно изобразить следующим образом:

       1
/ \
2 3
/ \ / \
4 5 6 7


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


Процесс вычисления суммы глубин.
Теперь вернёмся к функции sod. В процессе её выполнения мы фактически проходим по всем узлам дерева, начиная с корня. На каждом уровне прибавляем текущее значение глубины к результату рекурсивного вызова для левого и правого потомков.


Пройдемся по дереву:
1. Стартуем с корня (1). Глубина 0.
2. Переходим на левую ветку: узел 2, глубина 1.
3. Снова идём влево: узел 4, глубина 2. Узел не имеет потомков, возвращаем 2.
4. Возвращаемся к узлу 2, идём вправо: узел 5, глубина 2. Узел не имеет потомков, возвращаем 2.
5. Возвращаемся к узлу 1, обрабатываем правую ветку: узел 3, глубина 1.
6. Идём влево: узел 6, глубина 2. Узел не имеет потомков, возвращаем 2.
7. Возвращаемся к узлу 3, идём вправо: узел 7, глубина 2. Узел не имеет потомков, возвращаем 2.

Суммируем результат:
- Глубина 0 (узел 1): 0
- Глубина 1 (узлы 2 и 3): 1 + 1 = 2
- Глубина 2 (узлы 4, 5, 6, 7): 2 + 2 + 2 + 2 = 8

Общая сумма глубин = 0 + 2 + 8 = 10.

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


Заключение
Таким образом, задача оказалась не такой сложной, как показалось на первый взгляд, особенно если разбить её на части. Основной вызов здесь – правильно понять, как работает рекурсия и как она взаимодействует с каждым узлом в дереве.
244🔥3
При работе с различными API-запросами, чаще всего на ум приходит библиотека requests. Она отлично выполняет свою функцию, однако, она не поддерживает асинхронное выполнение. На замену requests пришла новая библиотека httpx.

Пример выполнения GET-запроса:
response = httpx.get("https://reqres.in/api/users/2")
print(response.status_code)
print(response.json())


В этом примере выполнен базовый GET-запрос. Метод .get() возвращает объект Response, который содержит статус ответа, заголовки и данные ответа.


Пример выполнения асинхронного POST-запроса:
async def fetch_data():
async with httpx.AsyncClient() as client:
response = await client.post(
"https://reqres.in/api/users", data={"name": "Napkin", "job": "Author"}
)
print(response.status_code)
print(response.json())


asyncio.run(fetch_data())


В этом примере мы открыли асинхронный клиент в контекстном менеджере для выполнения запроса. В метод .post(), также передали аргумент data, содержащий словарь данных.


Пример выполнения stream-запроса:
async def fetch_data():
async with httpx.AsyncClient() as client:
async with client.stream(
"POST",
"https://api.openai.com/v1/chat/completions",
json={
"model": "gpt-4o-mini",
"messages": [
{"role": "system", "content": "You are a assistant."},
{"role": "user", "content": "Hello!"},
],
"stream": True,
},
headers={
"Authorization": "Bearer <token>"
},
) as response:
async for chunk in response.aiter_text():
yield chunk


async def main():
async for data in fetch_data():
print(data)


asyncio.run(main())


Этот пример показывает, как httpx может использоваться для выполнения запросов в режиме "стриминга".
5🔥5
108❤‍🔥3🔥3
Channel photo updated
Сравнение hash map С/C++ с dict Python (часть 1)
Автор: Eugene Kaddo

Данная статья расскажет чем отличаются hash map C/C++ от dict Python и как их реализовать.


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

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

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

#Python #Сравнение_Python_и_C #C #C++ #hash_map #hash_table #dict
🔥7👍1
Записали новое видео, посвящённое выводу и лимитам Telegram Stars.
В видео поменяли оформление, расскажите, как вам?

Смотреть на YouTube.

Будем благодарны, если досмотрите видео до конца и поставите лайк. Это покажет YouTube, что видео интересное и, что его следует рекомендовать. Спасибо!

А если у вас проблемы с доступом к YouTube, то видео можно посмотреть и на других платформах:

- Ссылка на VK Video
- Ссылка на Dzen
- Ссылка на RuTube
- Ссылка на "Платформу"
🔥102👍1
Приветствую всех, друзья!

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

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

Фильм: Кто я

Год: 2014

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

Устраивайтесь поудобнее, включайте фильм и наслаждайтесь просмотром!
👍4🔥31
Что выведет код? №34
🔥51🥰1
Записали видео с разбором задачи. Текстовая версия будет через пару часов.

Смотреть на YouTube.

Будем благодарны, если досмотрите видео до конца и поставите лайк. Это покажет YouTube, что видео интересное и, что его следует рекомендовать. Спасибо!

А если у вас проблемы с доступом к YouTube, то видео можно посмотреть и на других платформах:

- Ссылка на VK Video
- Ссылка на Dzen
- Ссылка на RuTube
- Ссылка на "Платформу"
🔥6👍1👏1
Задача с классом MyList, на первый взгляд, кажется простой, но в ней скрыт небольшой подвох, связанный с работой метода __getitem__ и поведением индексов. Верно ответили 17% из 29-ми человек. Самым популярным ответом с 49% голосов, оказался подвох с индексами. Давайте разберёмся.


Код задачи:
class MyList:
def __init__(self, data):
self.data = data

def __getitem__(self, index):
value = self.data[index]
if isinstance(value, list):
return MyList(value)
return value

def __repr__(self):
return "Something"

lst = MyList([10, [20, 30], 40])

print(lst[0], lst[1], lst[1][1], lst[2][1])


Разбор задачи
1. Создаём класс MyList, принимающий в конструкторе список data и, сохраняющий его во внутренний атрибут self.data.
2. Dunder-метод __getitem__ позволяет обращаться к элементам списка через экземпляры класса MyList. Он делает следующее:
- Извлекает элемент по индексу.
- Если элемент является списком, он оборачивает его в новый объект MyList.
- Если элемент не список, он возвращается как есть.
3. Dunder-метод __repr__ отвечает за строковое представление объекта и всегда возвращает строку "Something".

Далее создадим переменную lst с экземпляром класса MyList, передав ему список [10, [20, 30], 40].

Рассмотрим строку print(lst[0], lst[1], lst[1][1], lst[2][1]):
1. lst[0] — это доступ к первому элементу списка data, который равен 10. Так как это не список, метод возвращает 10.
2. lst[1] — это доступ ко второму элементу, [20, 30]. Этот элемент является списком, поэтому метод __getitem__ возвращает новый экземпляр MyList, оборачивающий этот список. При выводе в print, для этого объекта вызывается метод __repr__, который возвращает "Something".
3. lst[1][1] — это доступ ко второму элементу списка [20, 30]. Но важно заметить, что lst[1] — это объект MyList. Поэтому вызов lst[1][1] сначала вызовет метод __getitem__ у этого нового объекта, и вернёт 30, так как внутри у него хранится обычный список [20, 30].
4. lst[2] — это доступ к третьему элементу списка data, который равен 40. Этот элемент — не список, а число. Однако в коде происходит попытка доступа ко второму элементу числа 40 с помощью индекса [1], что приведёт к ошибке, потому что у целого числа нет индексов.

Правильный ответ: 2. TypeError.

Почему возникает TypeError?
Проблема кроется в выражении lst[2][1]. В списке [10, [20, 30], 40] третий элемент — это число 40, и попытка выполнить операцию индексирования с ним (доступ к элементу [1]) вызывает TypeError, так как индексы применимы только к коллекциям, но не к числам.

Таким образом, код приведёт к ошибке типа TypeError, что и является правильным ответом на задачу.
🔥6🥰1👏1
11🔥5👍1👏1🤩1🥱11
Поделитесь с нами, пожалуйста, какими платформами для просмотра наших видео вы пользуетесь чаще всего? Выберите один или несколько вариантов ответа
Anonymous Poll
45%
1. YouTube
63%
2. YouTube (несмотря на блокировку)
20%
3. VK Video
4%
4. Dzen
13%
5. RuTube
7%
6. Платформа (слышали о ней вообще?)
4%
7. Instagram
8%
8. TikTok
🔥3
FastAPI 1. Инициализация проекта
Автор: Иван Ашихмин

В этой статье начнём изучение фреймворка FastAPI, познакомимся с Poetry и инициализируем проект.


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

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

#Python #IDE #Django #PyCharm #Гайды #DRF #JSON #OpenAPI #FastAPI #Сервис_на_FastAPI #Swagger #Бэкэнд #Poetry #Документация #VSCode
🔥9👍2👏1
Привет, друзья!

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

Фильм: Смерч 2

Год: 2024

Кейт Купер, бывшая охотница за штормами, пережившая разрушительный торнадо в колледже, теперь изучает характер штормов в Нью-Йорке. Её друг Хави убеждает её вернуться на открытую местность для тестирования новой системы слежения, где она встречает Тайлера Оуэнса, суперзвезду социальных сетей, публикующего опасные приключения в погоне за штормами. Сезон штормов усиливается, и появляются невиданные ранее явления. Кейт, Тайлер и их команды оказываются в эпицентре множества штормовых систем над центральной Оклахомой, борясь за свою жизнь.

Приятного просмотра!
🔥4
Что выведет этот код? №35
🔥3🥴1
Приветствую, на связи Иван.

Хочу рассказать вам о Лёше Кластере.
Ещё до того, как я начал программировать, я смотрел ролики Лёши на YouTube и поражался его горящим глазам. Он с интересом и знанием дела пишет программы, проекты для ретро-консолей и развивает OpenSourse. Именно с его видео начался мой путь в IT и создание многих проектов, в числе которых и наш замечательный и уютный канал.

Он недавно завёл свой Telegram-канал "Лёша Кластер Live". На нём он делится своими мыслями, рассказывает о проектах, процессе записи видео.

Хочется поддержать хорошего человека рекомендацией подписаться на его канал!
🔥7🤡2
Записали разбор вчерашней задачи!
Мы продолжаем работать над визуальной составляющей видео, напишите, как вам?

Смотреть на YouTube.

Будем благодарны, если досмотрите видео до конца и поставите лайк. Это покажет YouTube, что видео интересное и, что его следует рекомендовать. Спасибо!

P.S. Текстовый разбор через несколько часов 😉
🔥43