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

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

Реклама и взаимопиар: @Murzyev1995
Сотрудничество и др.: @proDreams
Download Telegram
Всем привет!

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

Фильм: Унесённые призраками

Год: 2001

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

https://www.sspoisk.ru/film/370/

Приятного ппросмотра!
🔥5
Что выведет этот код? №27
Вчерашняя задача была короткой, но интересной и как оказалось сложной. Правильно ответили всего 9 человек из 33-х, что равно 27%.

Код задачи:
numbers = [1, 2, 3]
numbers.append(*[4, 5])

print(numbers)



Разбор задачи
Сперва пройдёмся по строкам.

Сначала объявляем переменную numbers и присваиваем ей список чисел [1, 2, 3].

Затем у переменной numbers вызываем метод .append(), передав в него распакованный список [4, 5].

В конце вызываем функцию print(), передав в неё переменную numbers для вывода результата.


Что могло пойти не так?
Функции в Python принимают два вида аргументов: позиционные и ключевые.
В нашем случае, мы передаём в метод .append() один позиционный аргумент - список [4, 5], однако, затем мы применяем к нему распаковку. Мы уже писали про работу распаковки в разборе задачи "Найди ошибку №2".

Всё дело в том, что, когда применяется распаковка, все элементы передаются как отдельные аргументы, в связи с чем и получаем ошибку TypeError, поскольку метод .append() принимает только один позиционный аргумент, а мы ему передаём два.
🔥6
Подготовили видео ко вчерашней задаче!

https://youtube.com/shorts/gx1UZlqQ3sc

Будем благодарны за лайк и комментарий!
🔥8
Tips & Tricks. №2
2. Chocolatey - пакетный менеджер для Windows.

Многие знают про пакетные менеджеры в Linux, такие, как rpm, deb и другие. Если с ними ещё не сталкивались, то точно столкнётесь при работе с VPS.
В Windows с приложениями, обычно, всё сильно проще - зашёл на сайт, скачал exe или msi, запустил и установил. Нужно обновить приложение в котором нет автоматического обновления? Повторяешь цикл. Это не говоря о том, что пользователь по ошибке может скачать не то, что хочет...

Chocolatey - на текущий момент самый популярный менеджер пакетов для Windows. Обеспечивает удобное управление установленными приложениями, оперативно обновляет версии в репозитории, при этом тщательно проверяет находящиеся там пакеты.

Внимание! Для полноценной работы с Chocolatey необходимо использовать Powershell, запущенный от имени администратора!

Установка Chocolatey.
Для установки выполните команду ниже в PowerShell, открытом от имени администратора:
Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))


Установка пакета.
choco install имя_пакета

choco install python312
# установится последняя на дынный момент версия 3.12.4

choco install python312 --version=3.12.0
# установится версия 3.12.0


Устаревшие пакеты.
choco outdated


Обновление пакета.
choco upgrade имя_пакета

choco upgrade python312
# если был установлен, к примеру, 3.12.0, то будет обновлено до 3.12.4

choco upgrade all
# обновит версии всех устаревших пакетов


Удаление пакета.
choco uninstall имя_пакета


Список установленных пакетов.
choco list


#код_на_салфетке #chocolatey #пакетный_менеджер #полезное #winget #python
🔥3
Подготовили новое видео посвящённое Chocolatey!

https://youtube.com/shorts/JwVtQnkYsQs?feature=share

Будем рады вашим лайкам и комментариям!
🔥3
Приветствую!

В длинных постах можно запутаться поэтому, собираю воедино всё, что есть на данный момент.


Оглавления:
Для удобства навигации есть посты с оглавлениями по темам:

"Сайт на Django"
"Telegram-бот на AIOgram3"
"Применение Docker"
"Полезные инструменты"
"Путь в IT."
"Код в мешке"
"Boosty эксклюзив"
"Сравнение Python и C"

Задачи "Что выведет этот код?"
Задачи "Найди ошибку в коде"


Ресурсы канала:

Уютный и немного безумный чат канала.
Бот с материалами к постам
Сайт со всеми постами
Канал в Dzen
Сообщество в VK


Поддержка.

Если вам нравится канал и выходящий материал, поделитесь ссылкой с людьми, кому это тоже может быть интересно.

Также поддержать канал можно:
Подпиской или донатом на Boosty.

Донатом в нашем Telegram-боте.
Отправив донат в DonationAlerts.

Или внеся сайт в исключения вашего блокировщика рекламы.
🔥3
Обновление бота автоответчика и ответы на вопросы о Telegram Stars
Автор: Иван Ашихмин

Приветствую.

Невозможно сразу знать или учесть все нюансы во время программирования, как бы этого не хотелось. Также порой приходят мысли по улучшению или изменению чего-либо. В этом посте я проведу некую "работу над ошибками", опишу изменения в нескольких постах, а также постараюсь расписать всё, что на данный момент известно о Telegram Stars, вопросы о котором поступают с удивляющей частотой.

Обновления затронут следующие посты:

- Бот-автоответчик с ChatGPT для Бизнес-аккаунта в Telegram на Aiogram 3
- AIOgram3 18. Подключаем оплату Telegram Stars



Бот-автоответчик с ChatGPT для Бизнес-аккаунта в Telegram на Aiogram 3
🔥6
В этом посте в процессе написания миддлвари для отслеживания времени работы в профиле Telegram, я не нашёл способ получить время при помощи бота, поэтому обращался за этой информацией к серверам Telegram. На Github репозитория AIOgram я задавал по этому поводу вопрос и получил ответ - я неправильно пытался получить информацию. Что ж, бывает, давайте это исправим.

У нас был следующий код в файле business_middleware.py:


async with httpx.AsyncClient() as client:  
resp = await client.get(
f"https://api.telegram.org/bot{secrets.token}/getChat?chat_id={secrets.admin_id}"
)
chat = resp.json()
full_chat = ChatFullInfo(**chat["result"])

if check_opening_hours(full_chat.business_opening_hours):

Уберём всё, что было до блока if и заменим на две строчки:


from app.settings import secrets, bot


chat = await bot.get_chat(secrets.admin_id)
hours = chat.business_opening_hours

if check_opening_hours(hours):

Можно было получить информацию о чате администратора просто обратившись к боту. Спасибо за эту информацию пользователю Olegt0rr с Github.


Для Boosty.
Также, для подписчиков на Boosty обновил репозиторий с проектом. Добавил поддержку контекста для бесед (ведение истории диалогов) в Redis.


AIOgram3 18. Подключаем оплату Telegram Stars

Ответы на вопросы.
Прочитать подробнее можно в "Условиях обслуживания": https://telegram.org/tos/bot-developers#6-payments

- Для кого это всё? - Звёзды ввели для продажи цифровых товаров и услуг. Они не распространяются на продажу физических товаров. Если вы продаёте что-то электронное или не существующее физически, например, доступ к закрытому чату, курс и т.д., подключать звёзды
обязательно. Telegram будет следить и проверять транзакции в ботах, они уже сообщали, что заблокировали некоторое количество ботов которые всё ещё не перешли на звёзды.
Пункт 6.2. Digital Goods and Services.
- Куда уходят звёзды после оплаты? - это сейчас главная загадка. Возможность получать за звёзды вознаграждения (именно так назвали вывод) или тратить их на рекламу появится в Июле 2024г. Вероятно, будет внедрено в платформу Fragment. Более подробной информации на данный момент нет. Также учтите, что звёзды на балансе будут появляться с задержкой до 21-го дня.
Пункты 6.2.4. Rewards for Stars и 6.2.4.1. Receiving Rewards.
- Сколько я получу за звёзды? - За каждую полученную звезду вы получите эквивалент 0.013 USD, вероятно в криптовалюте TON. Также была предоставлена таблица с разъяснением ценообразования: https://core.telegram.org/file/400780400418/1/NMQCu-wgDpo.397006/5304141797eccc38c4
Грубо говоря, за 100 звёзд купленных пользователем по цене в 189 рублей, на выходе получим примерно ~110 рублей, это ещё не считая комиссии за вывод/обмен TON.
Пункт 6.2.4. Rewards for Stars.


Рефактор кода.
Провёл небольшие изменения в коде бота. Обновил файл поста с материалами.


Заключение.
Думал, изменений будет больше. Хотелось бы получать больше обратной связи по постам и коду в них.



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

#Python #код_на_салфетке #рефакторинг #aiogram #гайды #telegram #telegram_stars #криптовалюта #TON #звёзды_Telegram #middleware #изменения
🔥7
ООП на Python, ч. 3. Методы __str__ и __repr__.
Автор: Андрей Лебедев

Продолжаем цикл постов об ООП на Python. В прошлый раз мы говорили о статических и классовых методах. Сегодня разберем методы __str__ и __repr__.
👍3🔥2
В рамках первого поста об ООП на Python мы уже рассматривали метод __init__. Все три эти метода (__str__, __repr__ и __init__), как нетрудно заметить, объединяют по два нижних подчеркивания до и после собственно названия метода. Такой синтаксис обозначает так называемые магические (или dunder - от английского “double under(scores)” - “двойное нижнее подчёркивание”) методы. Они используются для определения специального поведения объектов и вызываются во время использования стандартных операций (сложение, вычитание, доступ к атрибутам и др.).


Метод __str__().
Наверняка вам доводилось создать объект какого-нибудь класса и сразу же этот объект распечатать методом print(). Чаще всего результат выглядел немного загадочно. Давайте создадим свой собственный класс и попробуем распечатать его объект.

Используем класс футбольного клуба из предыдущего поста:



class FootballClub:

def __init__(self, name, description=""):
self.name = name
self.description = description

def describe_club(self):
msg = f"{self.name}: {self.description}"
print(msg)

club = FootballClub(“Манчестер Юнайтед”, “Манчестер, Англия”)
print(club)


Вместо того, чтобы вызвать метод describe_club(), мы просто распечатаем вновь созданный объект нашего класса. Результат получается примерно таким:


<__main__.FootballClub object at 0x1050effd0>


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

• Имя запускаемого файла
• Имя класса, который использовался для создания объекта
• Ячейка памяти, в которой хранится объект.

Эта информация бывает полезна в процессе отладки кода, когда нужна заниматься поиском и устранением багов, но простому пользователю она мало о чем говорит. И выглядит, откровенно говоря, не очень читабельно для неподготовленного человека. Метод __str__() позволяет переопределить, что должно выводиться на печать, когда по отношению к объекту класса используется метод print().

Переопределим метод __str__() для нашего класса:



class FootballClub:

def __init__(self, name, description=""):
self.name = name
self.description = description

def describe_club(self):
msg = f"{self.name}: {self.description}"
print(msg)

def __str__(self):
return self.name


club = FootballClub("Манчестер Юнайтед", "Манчестер, Англия")
print(club)


И результат выполнение кода теперь выглядит куда дружелюбнее:


Манчестер Юнайтед


Метод __str__() используется не только для вывода строк на печать в терминале. Многие панели управления “ищут” именно __str__() для отображения данных, связанных с экземплярами того или иного класса. Так, к примеру, происходит в админ панели Django, поэтому в большинстве случаев метод __str__() определен в классах моделей.

Рассмотрим пример из официального туториала по созданию приложений на Django. В нём разбирается пример класса модели Question - вопроса в рамках приложения для проведения анкетирования. Код модели выглядит следующим образом:



class Question(models.Model):
question_text = models.CharField(max_length=200)
pub_date = models.DateTimeField('date_published')

def __str__(self):
return self.question_text
🔥4
Так как метод __str__() переопределен, в админ панели будет выводиться непосредственно сам вопрос. Если бы метод не переопределялся, то там бы виднелось что-то вроде Question object (1). Дело в том, что в Django все модели наследуются от базового класса модели в модуле django.db.models, где метод __str__() определяется следующим образом:



def __str__(self):
return "%s object (%s)" % (self.__class__.__name__, self.pk)


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


Метод __repr__().
Прежде чем пускаться в объяснения работы метода __repr__(), разберёмся с тем, что же он делает. Для этого откроем терминал и зайдём в папку, где лежит наш файл с классом футбольного клуба, который мы создали ранее. Таким образом мы сможем получить доступ к классам и функциям нашего файла прямо из терминала:



$ ls
football.py
$ python
>>> from football import FootballClub
>>> club = FootballClub("Манчестер Юнайтед")
>>> print(club)
Манчестер Юнайтед
>>>


Сначала мы импортируем класс FootballClub. Затем создаем объект этого класса, передав в него название клуба ("Манчестер Юнайтед”), и записываем его в переменную club. Далее выводим на печать содержимое этой самой переменной. Срабатывает метод __str__(), который мы создали, и мы видим название клуба. А что случится, если мы в терминале просто введем имя переменной, не передавая его предварительно в метод print()?



>>> club
<football.FootballClub object at 0x10bdc8040>


На печать выводится название модуля, название класса, слово object и адрес ячейки, в которую он записан.
Если вы хотите, чтобы в этот момент в терминале (или ином служебном окружении) выводилась другая информация, необходимо переопределить метод __repr__(). Но прежде чем бросаться это делать, прочитаем официальную документацию к этому методу:

“Если это возможно, вывод должен быть в виде выражения Python, которое можно использовать для воссоздания объекта с тем же значением (при условии наличия подходящего окружения). Если это невозможно, вывод должен быть в виде строки с текстом в таком формате <…полезная информация…>. Возвращаемое значение должно быть строкой Python.

Вывод метода обычно используется для дебаггинга, поэтому важно, чтобы он был информативным и недвусмысленным”.

Альтернативный вывод метода __repr__() должен помочь заново создать эквивалентный объект данного класса. Давайте добавим метод __repr__() в класс FootballClub:



class FootballClub:

def __init__(self, name, description=""):
self.name = name
self.description = description

def describe_club(self):
msg = f"{self.name}: {self.description}"
print(msg)

def __str__(self):
return self.name

def __repr__(self):
if self.description:
return (f"FootballClub(name={self.name}, "
f"description={self.description})")
else:
return f"FootballClub(name={self.name})"


Чтобы этот код сработал, надо заново открыть окно терминала и повторить весь порядок ввода:



$ python
>>> from football import FootballClub
>>> club = FootballClub("Манчестер Юнайтед")
>>> club
FootballClub("Манчестер Юнайтед")


На этот раз выводится не стандартная запись, а вывод нашего перезаписанного метода __repr__(): строка, позволяющая создать объект, полностью эквивалентный тому, в котором и был вызван метод __repr__().
🔥4
В нашем примере срабатывал кусок кода, записанный в else. Если мы добавим в наш объект описание (description), вывод будет уже другим:



$ python
>>> from football import FootballClub
>>> club = club = FootballClub("Манчестер Юнайтед", "Английский футбольный клуб")
>>> club
FootballClub(name=Манчестер Юнайтед, description=Английский футбольный клуб)


Python вызывает метод __repr__(), когда генерирует вывод для дебаггинга. В момент дебаггинга кусок кода, который позволит сгенерировать объект, задействованный в проблемном коде.

В следующий раз поговорим о методе __new__().



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

#Python #ООП #код_на_салфетке #код_в_мешке #класс #init #метод #магический_метод #repr #dunder #str #dunder_метод
🔥6
Подготовили новый Shorts посвящённый Telegram Stars и ответам на вопросы.

https://youtube.com/shorts/pXC8LZKWNlU

Будем благодарны за лайк и комментарий!
🔥8
Приветствуем.

В прошлую пятницу мы опубликовали пост, в котором попросили вас задавать нам вопросы.

Был всего один вопрос в комментариях к посту.

Давайте на него ответим.

Помощь с Django.
Ссылка на комментарий

Вариантов итогового проекта по Django из GeekBrains у нас нет, т.к. когда мы учились, его ещё не было. Но, Александр из комментариев сам предложил вариант репозитория для "обзора".

Проект выглядит очень комплексным. Видно, что человек сам хорошо разбирается в Django, т.к. таких знаний в GB не дают. В целом, проект может служить отличным подспорьем в качестве "референса" (копировать плохо, подглядывать полезно 😉).

Однако, есть вопросы к реализации некоторых моментов:
- В моделях используется кастомный транслитератор, а потом на основе его происходит слагификация для URL, записанного в поле CharField, а не SlugField, т.е. без валидации. Странное решение, поскольку есть библиотека pytils с функцией slugify, работающая с кириллицей. При её использовании можно сразу сохранять Slug-поле без необходимости в лишних полях и действиях.
- В проекте используется доступ к API Kandinsy от СБЕР. Файл с ключами выполнен в виде .py-файла и доступен в открытом виде. Как по мне, это плохое решение. Такие данные должны находиться в .env и браться из основного settings.py.
- Представления. В некоторых представлениях происходит много логики, которую по хорошему вынести в отдельные функции. В таком виде они становятся перегруженными. Также, в некоторых представлениях используется множественный вызов методов разделённый переносом строки через символ \, это не хорошая практика. Лучшим решением, обернуть всё выражение в скобки () и тогда внутри не будет проблем с переносом строк. Код станет визуально понятнее.

На самом деле, разбирать чужой код, без запуска и конкретной цели не самое "удобное" занятие. Код выглядит хорошо и на высоком уровне. К API-приложению вообще не прикопаться. По большому счёту, описанное выше тянет на "вкусовщину" и добавить больше нечего.
🔥8
Всех с вечером пятницы!

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

Фильм: Цветы войны

Год: 2011

1937 год, Японо-китайская война. Американский гробовщик Джон направляется в Католическую церковь в Нанкине, чтобы подготовить священника к похоронам. По прибытии он оказывается в эпицентре военных действий и единственным мужчиной среди учениц монастыря и проституток из соседнего борделя. Джон решает выдать себя за священника и попытаться спасти обе группы от японской армии.

https://www.sspoisk.ru/film/464561/

Приятного просмотра!
🔥3👍1
Что выведет код? №28 Ответь в голосовании!
🔥5
Что выведет код с изображения? №28
Anonymous Quiz
12%
TypeError
44%
14
8%
ValueError
29%
2 2 2 2 2 2 2
8%
Нет верного ответа
🔥6
Анонс конкурса для начинающих программистов от Telegram-канала "Код на салфетке"

Приветствуем!

Мы объявляем о конкурсе по программированию на Python для начинающих программистов!

Посмотреть анонс конкурса можно на нашем YouTube-канале!

Вся информация о задаче, условиях проведения и призе будет завтра.

Рассказывайте друзьям! Вместе будет интереснее! Также вступайте в наш чат для обсуждения!

P.S. Как оказалось, YouTube в Shorts любит не только лайки, но и время просмотра видео. Будем благодарны, если вы посмотрите видео до конца и поставите лайк. Так мы сможем получить больший охват. Спасибо!



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

#проект #код_на_салфетке #python #shorts #соревнование #programming #github #обучение #программирование #портфолио #конкурс
🔥4👍1🤩1