Вчерашняя задача была не простой, на первый взгляд. Бинарные деревья сложно даются многим, а данную задачу решило 29% из всего 14ти ответивших.
Код задачи:
Разбор задачи
Пойдём сверху вниз. Сперва создаём датакаласс
В классе прописываем три поля:
1.
2.
3.
Обратите внимание, поля
Далее идёт функция
-
-
Поскольку функция рекурсивная, необходимо в самом начале прописать условие выхода из рекурсии. Прописываем блок
Если выхода из функции не произошло, то возвращаем сумму текущей глубины с глубинами дочерних узлов в рекурсивном вызове.
После класса и функции, создаём переменную
В самом конце выводим результат вызова функции
Правильный ответ:
Что это за дерево такое?
Теперь разберёмся, какое дерево у нас получилось. Мы построили классическое бинарное дерево. В нашем случае, корневой узел содержит значение
Это идеальный пример полного бинарного дерева, где каждый узел, кроме листовых, имеет ровно два потомка. Такие структуры часто используются в алгоритмах поиска, сортировки, а также для хранения данных, которые требуют быстрого доступа.
Процесс вычисления суммы глубин.
Теперь вернёмся к функции
Пройдемся по дереву:
1. Стартуем с корня (
2. Переходим на левую ветку: узел
3. Снова идём влево: узел
4. Возвращаемся к узлу
5. Возвращаемся к узлу
6. Идём влево: узел
7. Возвращаемся к узлу
Суммируем результат:
- Глубина
- Глубина
- Глубина
Общая сумма глубин =
Вот и весь процесс. В итоге мы получили ответ
Заключение
Таким образом, задача оказалась не такой сложной, как показалось на первый взгляд, особенно если разбить её на части. Основной вызов здесь – правильно понять, как работает рекурсия и как она взаимодействует с каждым узлом в дереве.
Код задачи:
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-запросами, чаще всего на ум приходит библиотека
Пример выполнения GET-запроса:
В этом примере выполнен базовый GET-запрос. Метод
Пример выполнения асинхронного POST-запроса:
В этом примере мы открыли асинхронный клиент в контекстном менеджере для выполнения запроса. В метод
Пример выполнения stream-запроса:
Этот пример показывает, как
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
Продолжая опрос с прошлого вторника. Какой формат постов вам более интересен? Выберите один или несколько вариантов.
Anonymous Poll
54%
Только текстовые посты
23%
Текстовый и краткий пересказ в Shorts формате
26%
Текстовый и полноценная видео версия
8%
Меньше текстовых постов, больше видео
33%
Больше интерактивных задач с текстовым или видео разбором
750🔥3👎1👏1
Telegram Stars лимиты и вывод
Автор: Иван Ашихмин
Актуальная информация по выводу Telegram Stars и лимитам.
Читать пост в Telegram
Пост на сайте
Поддержать проект на Boosty
Поддержать проект в Telegram
#Telegram_бот #Код_на_салфетке #Telegram_Stars #звёзды #Telegram_канал #лимиты #вывод
Автор: Иван Ашихмин
Актуальная информация по выводу Telegram Stars и лимитам.
Читать пост в Telegram
Пост на сайте
Поддержать проект на Boosty
Поддержать проект в Telegram
#Telegram_бот #Код_на_салфетке #Telegram_Stars #звёзды #Telegram_канал #лимиты #вывод
10 8❤🔥3🔥3
Сравнение 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
Автор: 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
- Ссылка на "Платформу"
В видео поменяли оформление, расскажите, как вам?
Смотреть на YouTube.
Будем благодарны, если досмотрите видео до конца и поставите лайк. Это покажет YouTube, что видео интересное и, что его следует рекомендовать. Спасибо!
А если у вас проблемы с доступом к YouTube, то видео можно посмотреть и на других платформах:
- Ссылка на VK Video
- Ссылка на Dzen
- Ссылка на RuTube
- Ссылка на "Платформу"
🔥10 2👍1
Приветствую всех, друзья!
Пятница наступила, а это значит, что настало время для нашего еженедельного кинопоста. Сегодня я рад представить вам захватывающий триллер по рекомендации одного из наших подписчиков.
Этот фильм погружает нас в мир хакеров и цифровых технологий, где границы между реальностью и виртуальностью становятся всё более размытыми. Главный герой, молодой и талантливый хакер Бенджамин, стремится выйти из тени и стать известным. Но его путь к славе оказывается не таким простым, как он предполагал.
Фильм: Кто я
Год: 2014
"Кто я" — это не просто триллер, это глубокий взгляд на современное общество и его зависимость от технологий. Фильм поднимает важные вопросы о безопасности, анонимности и личной ответственности в цифровую эпоху. Приготовьтесь к напряжённому и увлекательному просмотру, который заставит вас задуматься о том, кто мы на самом деле в этом мире информации и иллюзий.
Устраивайтесь поудобнее, включайте фильм и наслаждайтесь просмотром!
Пятница наступила, а это значит, что настало время для нашего еженедельного кинопоста. Сегодня я рад представить вам захватывающий триллер по рекомендации одного из наших подписчиков.
Этот фильм погружает нас в мир хакеров и цифровых технологий, где границы между реальностью и виртуальностью становятся всё более размытыми. Главный герой, молодой и талантливый хакер Бенджамин, стремится выйти из тени и стать известным. Но его путь к славе оказывается не таким простым, как он предполагал.
Фильм: Кто я
Год: 2014
"Кто я" — это не просто триллер, это глубокий взгляд на современное общество и его зависимость от технологий. Фильм поднимает важные вопросы о безопасности, анонимности и личной ответственности в цифровую эпоху. Приготовьтесь к напряжённому и увлекательному просмотру, который заставит вас задуматься о том, кто мы на самом деле в этом мире информации и иллюзий.
Устраивайтесь поудобнее, включайте фильм и наслаждайтесь просмотром!
👍4🔥3 1
Что выведет код? №34
Anonymous Quiz
14%
10 Something 30 40
24%
TypeError
10%
10 20 30 40
40%
IndexError
12%
Something Something Something Something
🔥4👍1👏1
Записали видео с разбором задачи. Текстовая версия будет через пару часов.
Смотреть на YouTube.
Будем благодарны, если досмотрите видео до конца и поставите лайк. Это покажет YouTube, что видео интересное и, что его следует рекомендовать. Спасибо!
А если у вас проблемы с доступом к YouTube, то видео можно посмотреть и на других платформах:
- Ссылка на VK Video
- Ссылка на Dzen
- Ссылка на RuTube
- Ссылка на "Платформу"
Смотреть на YouTube.
Будем благодарны, если досмотрите видео до конца и поставите лайк. Это покажет YouTube, что видео интересное и, что его следует рекомендовать. Спасибо!
А если у вас проблемы с доступом к YouTube, то видео можно посмотреть и на других платформах:
- Ссылка на VK Video
- Ссылка на Dzen
- Ссылка на RuTube
- Ссылка на "Платформу"
🔥6👍1👏1
Задача с классом
Код задачи:
Разбор задачи
1. Создаём класс
2. Dunder-метод
- Извлекает элемент по индексу.
- Если элемент является списком, он оборачивает его в новый объект
- Если элемент не список, он возвращается как есть.
3. Dunder-метод
Далее создадим переменную
Рассмотрим строку
1.
2.
3.
4.
Правильный ответ:
Почему возникает TypeError?
Проблема кроется в выражении
Таким образом, код приведёт к ошибке типа
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
Пагинация в aiogram 3
Автор: Иван Ашихмин
В этом посте покажу пример создания кнопок пагинации в aiogram 3.
Читать пост в Telegram
Пост на сайте
Поддержать проект на Boosty
Поддержать проект в Telegram
#aiogram #python #пагинация #inline_клавиатура #message #обработчики_сообщений #callback_класс #кнопки #handler #callback
Автор: Иван Ашихмин
В этом посте покажу пример создания кнопок пагинации в aiogram 3.
Читать пост в Telegram
Пост на сайте
Поддержать проект на Boosty
Поддержать проект в Telegram
#aiogram #python #пагинация #inline_клавиатура #message #обработчики_сообщений #callback_класс #кнопки #handler #callback
11🔥5👍1👏1🤩1🥱1 1
Поделитесь с нами, пожалуйста, какими платформами для просмотра наших видео вы пользуетесь чаще всего? Выберите один или несколько вариантов ответа
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
Автор: Иван Ашихмин
В этой статье начнём изучение фреймворка FastAPI, познакомимся с Poetry и инициализируем проект.
Читать пост в Telegram
Пост на сайте
Поддержать проект на Boosty
Поддержать проект в Telegram
#Python #IDE #Django #PyCharm #Гайды #DRF #JSON #OpenAPI #FastAPI #Сервис_на_FastAPI #Swagger #Бэкэнд #Poetry #Документация #VSCode
🔥9👍2👏1
Привет, друзья!
Пятница снова с нами, а это значит, что пора для нашего традиционного кинопоста. Сегодня мы представляем вам свежий релиз. Эта динамичная картина продолжает историю о бесстрашных учёных и спасателях, которые сталкиваются с разрушительными силами природы. На этот раз их ждёт ещё более мощный и непредсказуемый ураган, который грозит уничтожить всё на своём пути.
Фильм: Смерч 2
Год: 2024
Кейт Купер, бывшая охотница за штормами, пережившая разрушительный торнадо в колледже, теперь изучает характер штормов в Нью-Йорке. Её друг Хави убеждает её вернуться на открытую местность для тестирования новой системы слежения, где она встречает Тайлера Оуэнса, суперзвезду социальных сетей, публикующего опасные приключения в погоне за штормами. Сезон штормов усиливается, и появляются невиданные ранее явления. Кейт, Тайлер и их команды оказываются в эпицентре множества штормовых систем над центральной Оклахомой, борясь за свою жизнь.
Приятного просмотра!
Пятница снова с нами, а это значит, что пора для нашего традиционного кинопоста. Сегодня мы представляем вам свежий релиз. Эта динамичная картина продолжает историю о бесстрашных учёных и спасателях, которые сталкиваются с разрушительными силами природы. На этот раз их ждёт ещё более мощный и непредсказуемый ураган, который грозит уничтожить всё на своём пути.
Фильм: Смерч 2
Год: 2024
Кейт Купер, бывшая охотница за штормами, пережившая разрушительный торнадо в колледже, теперь изучает характер штормов в Нью-Йорке. Её друг Хави убеждает её вернуться на открытую местность для тестирования новой системы слежения, где она встречает Тайлера Оуэнса, суперзвезду социальных сетей, публикующего опасные приключения в погоне за штормами. Сезон штормов усиливается, и появляются невиданные ранее явления. Кейт, Тайлер и их команды оказываются в эпицентре множества штормовых систем над центральной Оклахомой, борясь за свою жизнь.
Приятного просмотра!
🔥4
Приветствую, на связи Иван.
Хочу рассказать вам о Лёше Кластере.
Ещё до того, как я начал программировать, я смотрел ролики Лёши на YouTube и поражался его горящим глазам. Он с интересом и знанием дела пишет программы, проекты для ретро-консолей и развивает OpenSourse. Именно с его видео начался мой путь в IT и создание многих проектов, в числе которых и наш замечательный и уютный канал.
Он недавно завёл свой Telegram-канал "Лёша Кластер Live". На нём он делится своими мыслями, рассказывает о проектах, процессе записи видео.
Хочется поддержать хорошего человека рекомендацией подписаться на его канал!
Хочу рассказать вам о Лёше Кластере.
Ещё до того, как я начал программировать, я смотрел ролики Лёши на YouTube и поражался его горящим глазам. Он с интересом и знанием дела пишет программы, проекты для ретро-консолей и развивает OpenSourse. Именно с его видео начался мой путь в IT и создание многих проектов, в числе которых и наш замечательный и уютный канал.
Он недавно завёл свой Telegram-канал "Лёша Кластер Live". На нём он делится своими мыслями, рассказывает о проектах, процессе записи видео.
Хочется поддержать хорошего человека рекомендацией подписаться на его канал!
🔥7🤡2
Записали разбор вчерашней задачи!
Мы продолжаем работать над визуальной составляющей видео, напишите, как вам?
Смотреть на YouTube.
Будем благодарны, если досмотрите видео до конца и поставите лайк. Это покажет YouTube, что видео интересное и, что его следует рекомендовать. Спасибо!
P.S. Текстовый разбор через несколько часов 😉
Мы продолжаем работать над визуальной составляющей видео, напишите, как вам?
Смотреть на YouTube.
Будем благодарны, если досмотрите видео до конца и поставите лайк. Это покажет YouTube, что видео интересное и, что его следует рекомендовать. Спасибо!
P.S. Текстовый разбор через несколько часов 😉
🔥4 3
