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

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

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

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

Фильм: Первый отряд

Год: 2009

1942 год. Отряд пионеров-героев вступает в схватку с фашистскими оккупантами и призраками рыцарей Ливонского ордена, вызванными из загробного мира нацистскими магами из печально известной организации Аненербе. Разумеется, главные герои - не простые пионеры. Они прошли обучение в Шестом отделе управления военной разведки, который занимается парапсихологией и оккультизмом. И теперь они готовы защищать Родину на невидимом для простых смертных фронте.

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

Приятного просмотра
🔥2
Выберите вариант ответа с изображения ниже. №20
Anonymous Quiz
0%
1
14%
2
59%
3
27%
4
Что выведет этот код? №20
В субботу мы опубликовали задачу с нестандартным выбором вариантов ответа. Судя по количеству голосов, формат вам не приглянулся. Обидненько. Тем не менее, среди тех, кто ответил, количество верных составляет 72%.

Код задачи:
class A:
def __init__(self, x, y):
self.x = x
self.y = y

def print(self):
print(self.x, self.y)


class B(A):
def print(self):
print(self.y, self.x)


class C(B):
def __init__(self, x, y, z):
super().__init__(x, y)
self.z = z

def __str__(self):
return str(self.x + self.z)


a = A(2, 4)
b = B(4, 2)
c = C(2, 4, 7)
c.x = c.z
a.print()
b.print()
c.print()
print(c)


Разбор задачи.
Задача может показаться большой и сложной, но на деле она просто большая.

Создаём первый класс A с двумя методами:
- Конструктор класса __init__, принимающий помимо себя, ещё x и y.
- Метод print (не путать с функцией print()!), выводящий на экран значения x и y.

Создаём второй класс B, унаследованный от класса A, с переопределённым методом print. В методе также выводим значения x и y, но поменяв их местами.

Создаём третий класс C, унаследованный от класса B.
В нём переопределяем __init__, в котором дополнительно принимаем аргумент z.
И определяем метод __str__, возвращающий сумму значений x и z.

Основа готова, перейдём к вызовам.

Создаём три экземпляра класса:
- a = A(2, 4) - x=2, y=4
- b = B(4, 2) - x=4, y=2
- c = C(2, 4, 7) - x=2, y=4, z=7

Далее заменяем содержимое переменной x в классе C на значение переменной z:
c.x = c.z - x=7, y=4, z=7

И, поочерёдно вызывая методы принт у созданных экземпляров классов, получаем следующий вывод:
- a.print() = 2 4
- b.print() = 2 4
- c.print() = 4 7

В конце вызываем функцию print(), выводящую метод __str__ у экземпляра класса C:
print(c) = 14.
👍3🔥1
Всем привет!

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

Фильм: Донни Дарко

Год: 2001

Донни Дарко — обычный старшеклассник, живет с родителями и двумя сестрами. Однажды он встречает человека в костюме кролика, который сообщает парню, что через 28 дней, 6 часов, 42 минуты и 12 секунд наступит конец света.

https://www.kinopoisk.ru/film/410/

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

Приятного просмотра
1🔥1
Что выведет код с изображения ниже? №21
Anonymous Quiz
20%
TypeError
20%
NameError
47%
-1
13%
0
🔥3👍1
Что выведет этот код? №21
🔥2
Вчера мы опубликовали непростую, на первый взгляд, задачу, но если посмотреть внимательнее, всё становится понятно. Отгадало задачу 11 человек, это 44% из 25-ти участвовавших.

Код задачи:
def x(z):
def q(x, y):
x = y + z + x
print(x)

return q


for i in range(1):
func = x(i)
func(i, i - 1)



Разбор задачи.
Функция в функции в цикле 🤯. Звучит и выглядит непонятно. Давайте разбираться.

Начнём с функций.

Определяем функцию x, принимающую аргумент z.
В теле функции x определяем вложенную функцию q, принимающую аргументы x и y. Не путать аргумент x и функцию x. Имена совпадают, но области видимости у них разные.

К содержимому функции q вернёмся чуть позже.

Далее в функции x делаем возврат функции q.

Понятнее не становится? Сейчас станет.

После определения функций создаём цикл, итерируемый по одному элементу - 0. Таким в образом, цикл сработает всего раз, а i будет равно 0.

Внутри цикла создаём переменную func, в которой вызываем функцию x, передавая в неё значение i.
Поскольку мы в функции x возвращаем функцию q, то переменная func теперь хранит в себе ссылку на функцию q, которая может быть вызвана с передаваемыми в неё аргументами.

Вызываем func (она же q), передавая в неё i и i - 1, т.е. 0 и -1.

Внутри функции q, переопределяя переменную x, мы складываем ранее переданные аргументы x и y, а также, благодаря замыканию, нам доступен аргумент z. Получается так: x = -1 + 0 + 0.

Далее просто выводим полученный результат на экран при помощи функции print.

Вот и всё)


Что тут произошло?
Мы создали функцию, вложенную в другую функцию, и использовали переменную для доступа к вложенной функции. Примерно таким образом работают декораторы, о чём вы можете прочесть в посте "Декораторы в питоне".
🔥6
Всем привет!

У нас вышло небольшое затишье с постами, но мы исправимся.

Вот вам спойлер поста, который выйдет в среду...
🔥61😱1
Рад снова приветствовать вас, друзья!

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

Фильм: Всё везде и сразу

Год: 2022

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

https://www.kinopoisk.ru/film/1322324/

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

Приятного просмотра!
🔥6❤‍🔥1
Что выведет код с изображения ниже? №22
Anonymous Quiz
0%
b c d
17%
['b', 'c', 'd']
7%
TypeError
76%
c d e
🔥3
Что выведет этот код? №22
🔥3
Вчера мы опубликовали достаточно простую задачку, с которой справилось большинство - 71%!

Код задачи:
print(*list(map(lambda x: chr(ord(x) + 2), ['a', 'b', 'c'])))



Разбор задачи.
Задача намеренно написана в одну строку для усложнения восприятия. Давайте упростим для разбора:
char_map = map(lambda x: chr(ord(x) + 2), ['a', 'b', 'c'])
char_list = list(char_map)
print(*char_list)


В переменной char_map выполняем функцию map. Функция map итерируется по переданному вторым аргументом итератору и применяет к каждому элементу, указанную первым элементом функцию.

В нашем случае мы проходим по списку ['a', 'b', 'c'] и применяем к нему lambda-функцию.
В lambda-функции мы получаем в переменную x букву из списка. Затем получаем порядковый номер буквы в таблице кодировки и увеличиваем его на два. Затем получаем букву по получившемуся номеру. Выходит своеобразный Шифр Цезаря.

Поскольку результат работы функции map – это генератор, то в переменной char_list приводим его к списку.

В конце, используя распаковку списка, выводим результат в консоль.
🔥3
Всем привет!

Каналу уже 11 месяцев и пора что-то менять.

Начнём с аватарки канала.
На выбор есть 9 сгенерированных нейронкой изображений.
В голосовании можно выбрать несколько вариантов ответа.

Если картинка наберёт больше 50% - выбираем её, если нет, то будет второй тур с самыми топовыми.
🔥1
Выбираем аватарку!
Final Results
6%
1
23%
2
17%
3
4%
4
10%
5
13%
6
8%
7
38%
8
27%
9
Второй тур голосования!

Из претендентов остались только №2, №8 и №9.

Тот, который наберёт больше всего - ПОБЕДИТ!
💩3🔥2
Выбираем аватарку (снова)
Final Results
13%
2
52%
8
44%
9
🔥2
Встречаем победителя! №8!
🔥11💩5😭2
Channel photo updated
Бот-автоответчик с ChatGPT для Бизнес-аккаунта в Telegram на Aiogram 3
Автор: Иван Ашихмин

Не так давно в Telegram вышло большое обновление - "Telegram для бизнеса". В данный момент оно доступно для Premium-пользователей, а в будущем, вероятно, станет отдельным режимом.

"Telegram для бизнеса" предоставляет собой новый способ взаимодействия с клиентами через Telegram, вводя для этого новые функции:

- Адрес - Позволяет указать адрес и геопозицию в профиле.
- Часы работы - Позволяет указать график работы бизнеса.
- Быстрые ответы - Позволяет создать набор "шаблонных" ответов.
- Приветствия - Позволяет установить автоматическое приветствие для новых клиентов.
- "Нет на месте" - Позволяет отправлять автоматические ответы, в нерабочее время.
- Ссылки на чат - Позволяет кастомизировать ссылки на чат с вами.
- Вид нового чата - Позволяет кастомизировать вид чата для клиента, который открыл чат с вами, но ещё не написал сообщение.
🔥4👍1
- Чат-боты - Позволяет подключить к учётной записи бота для взаимодействия с клиентами в личных чатах.


Из всего этого набора нас интересует только два пункта: Чат-боты и Часы работы.


Что мы с вами сделаем?
В этом посте мы создадим Telegram-бота, который будет принимать личные сообщения только в нерабочее время и для ответа использовать ChatGPT от OpenAI.

Поскольку OpenAI недоступен на территории РФ, вместо него будем использовать сервис NeuroAPI. Он предоставляет доступ к OpenAI из России и СНГ по более низким ценам.


Как это можно использовать?
Описанный в посте бот можно будет использовать как частному лицу, сделав личного ассистента на время отсутствия в сети, так и бизнесу для взаимодействия с клиентами в нерабочее время.

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


Подключение бота в профиле.
Для проекта вам нужен бот, как его создать рассказано в посте "AIOgram3 1.5. Регистрация бота"

После создания бота и получения токена, в интерфейсе BotFather, выполните команду /mybots для вывода списка всех ботов.
Выберите нужного бота.

Затем в открывшемся меню выберите пункт "Bot Settings".

В следующем меню выберите пункт "Business Mode".

Включите бизнес режим.

После того, как включили бизнес режим для бота, откройте настройки Telegram и выберите пункт "Telegram для бизнеса", а в нём пункт "Чат-боты".

В открывшемся окне в первое поле пропишите ссылку на бота t.iss.one/mybot или его имя @mybot.

Готово.


Подготовка проекта.
Создайте новый проект в удобной для вас IDE и активируйте виртуальное окружение.

Если вы пользуетесь PyCharm, то виртуальное окружение создаст IDE для нового проекта.
Если вы пользуетесь VSCode, то его придётся создать вручную, выполнив следующие команды:


python -m venv .venv

# для Windows
venv\Scripts\activate.ps1 или venv\Scripts\activate.bat

# для *NIX-систем
source venv/bin/activate

В проекте используются следующие библиотеки:

- aiogram - Фреймворк для бота.
- pydantic-settings - Библиотека для создания классов конфигураций.
- openai - Официальная библиотека OpenAI для Python.
- pytz - Библиотека для работы с часовыми поясами.
- httpx - Современная библиотека для создания синхронных/асинхронных запросов.
- redis - Библиотека для подключения к Redis.


Установите их, выполнив команду:


pip install -U aiogram pydantic-settings openai pytz httpx redis

Создайте файл requirements.txt и внесите в него установленные библиотеки:


aiogram3.6.0
pydantic-settings2.2.1
openai1.29.0
pytz2024.1
httpx0.27.0
redis5.0.4

Далее создайте файл .env для хранения переменных окружения.
Необходимы следующие переменные:

- token - Токен бота, полученный от BotFather.
- admin_id - Telegram-id администратора.
- openai_key - API-ключ полученный на сайте NeuroAPI или OpenAI.
- openai_base_url - Адрес прокси-сервера для OpenAI.
- redis_host - Хост для подключения к Redis. В нашем случае используется Docker compose, поэтому прописываем имя сервиса - redis.
- delay - Задержка между ответами в минутах. Об этом ниже.


Пример:


token=12345:abcd
admin_id=123456789
openai_key=sk-abcd
openai_base_url=https://lk.neuroapi.host/v1
redis_host=redis
delay=10

Также создайте файл main.py и пакет (Python package) app.


Файл конфигурации.
🔥4👍1