This media is not supported in your browser
VIEW IN TELEGRAM
Мы ещё дипломы не получили, а ГБ уже предлагает сменить профессию...
Видео записал одногруппник/подписчик @mssw_wssm
Видео записал одногруппник/подписчик @mssw_wssm
😁7🤡2👀1
AIOgram3 17. Подготовка к разворачиванию на сервере
Автор: Иван Ашихмин
В одном из следующих постов в цикле "Применение Docker" мы с вами будем разворачивать бота на сервере, но перед этим необходимо кое-что подготовить.
Когда мы прописывали токен бота в посте "AIOgram3 3. Основная функция", я упомянул, что хранение в коде секретных данных небезопасно. В данном посте мы исправим это, и я покажу, как правильно передавать секреты в бота.
Переменные окружения.
Автор: Иван Ашихмин
В одном из следующих постов в цикле "Применение Docker" мы с вами будем разворачивать бота на сервере, но перед этим необходимо кое-что подготовить.
Когда мы прописывали токен бота в посте "AIOgram3 3. Основная функция", я упомянул, что хранение в коде секретных данных небезопасно. В данном посте мы исправим это, и я покажу, как правильно передавать секреты в бота.
Переменные окружения.
🔥3👍1
Переменные окружения (environment variables) – это механизм хранения данных, который позволяет хранить конфигурационные параметры вне кода. Они обычно используются для хранения секретной информации, такой, как ключи API, пароли и токены, а также для хранения прочих параметров (пути к файлам, настройки приложения и т.п.).
Для хранения переменных окружения с их значениями мы будем использовать специальный, "скрытый"
Обратите внимание. В системе может быть выключено отображение скрытых файлов.
Для получения данных из переменных окружения в коде будем использовать модуль
Файл .env.
В корневой директории проекта, там, где файл
Откройте рядом файл
Если вы повторяли все посты, то у вас должно быть шесть полей в этом классе:
Создадим в
Должно получиться вот так:
Если вы используете git, то обязательно внесите .env-файл в .gitignore!
Получение данных из окружения и .env-файла.
Когда мы будем разворачивать бота на сервере, все данные из
Это можно сделать вручную, открыв файл и записав значения в словарь, но мне этот подход не нравится. К тому же всё написано до нас. Для чтения локального файла будем использовать библиотеку
Для установки библиотеки необходимо выполнить команду:
После этого добавляем её в файл
Вернёмся к файлу
В самом начале файла, сразу после импортов, вызываем функцию
Переходим к классу
В нём нам необходимо заменить все значения полей на
Обратите внимание! Если тип поля, например, int, то и значение полученное из переменной окружения нужно приводить к этому типу.
Получается так:
Завершение.
На этом подготовка закончена. Теперь на локальной машине секретные данные будут браться из
Для хранения переменных окружения с их значениями мы будем использовать специальный, "скрытый"
.env файл. Название файла именно так и пишется <точка>env, без каких либо расширений. Самый известный пример подобных "скрытых" файлов, это .gitignore.Обратите внимание. В системе может быть выключено отображение скрытых файлов.
Для получения данных из переменных окружения в коде будем использовать модуль
environ из встроенной в Python библиотеки os.Файл .env.
В корневой директории проекта, там, где файл
main.py, создадим .env-файл и откроем его.Откройте рядом файл
settings.py и найдите класс Secrets.Если вы повторяли все посты, то у вас должно быть шесть полей в этом классе:
token, admin_id, group_id, weather_key, audio_key_id, audio_key_secret.Создадим в
.env-файле такие же строки, но в верхнем регистре, т.к. переменные окружения принято прописывать заглавными буквами. После каждой переменной ставим равно = и копируем значение из класса Secrets. Без кавычек.Должно получиться вот так:
TOKEN=ваш_токен
ADMIN_ID=id_администратора
GROUP_ID=id_группы
WEATHER_KEY=токен_погоды
AUDIO_KEY_ID=id_распознавания_голоса
AUDIO_KEY_SECRET=токен_распознавания_голоса
Если вы используете git, то обязательно внесите .env-файл в .gitignore!
Получение данных из окружения и .env-файла.
Когда мы будем разворачивать бота на сервере, все данные из
.env-файла будут переданы внутрь контейнера, а самого его там не будет в целях безопасности. Однако, для работы с .env-файлом на локальной машине, необходимо его прочесть и получить из него данные.Это можно сделать вручную, открыв файл и записав значения в словарь, но мне этот подход не нравится. К тому же всё написано до нас. Для чтения локального файла будем использовать библиотеку
dotenv.Для установки библиотеки необходимо выполнить команду:
pip install python-dotenv
После этого добавляем её в файл
requirements.txt. Он нам понадобится во время разворачивания проекта на сервере.python-dotenv1.0.1
Вернёмся к файлу
settings.py.В самом начале файла, сразу после импортов, вызываем функцию
load_dotenv() для чтения .env-файла.from dotenv import load_dotenv
load_dotenv()
Переходим к классу
Secrets. В нём нам необходимо заменить все значения полей на
os.environ.get(""), где в кавычках указывается переменная окружения.Обратите внимание! Если тип поля, например, int, то и значение полученное из переменной окружения нужно приводить к этому типу.
Получается так:
@dataclass
class Secrets:
token: str = os.environ.get("TOKEN")
admin_id: int = int(os.environ.get("ADMIN_ID"))
group_id: int = int(os.environ.get("GROUP_ID"))
weather_key: str = os.environ.get("WEATHER_KEY")
audio_key_id: str = os.environ.get("AUDIO_KEY_ID")
audio_key_secret: str = os.environ.get("AUDIO_KEY_SECRET")
Завершение.
На этом подготовка закончена. Теперь на локальной машине секретные данные будут браться из
.env-файла, а о том, как это будет работать на сервере, узнаете в следующих постах.👍3🔥3
Файлы к посту, можно получить в боте по коду: 735906
Пост на сайте
Поддержать проект
#Python #Гайды #Telegram #AIOgram #AIOgram3 #бот #Telegram_бот #env #развёртывание #dotenv #environment #deploy
Пост на сайте
Поддержать проект
#Python #Гайды #Telegram #AIOgram #AIOgram3 #бот #Telegram_бот #env #развёртывание #dotenv #environment #deploy
🔥4❤1
Приветствую!
В длинных постах можно запутаться поэтому, собираю воедино всё, что есть на данный момент.
Оглавления:
Для удобства навигации есть посты с оглавлениями по темам:
"Сайт на Django"
"Telegram-бот на AIOgram3"
"Применение Docker"
"Полезные инструменты"
"Путь в IT."
"Код в мешке"
"Boosty эксклюзив"
Ресурсы канала:
Уютный и немного безумный чат канала.
Бот с материалами к постам
Сайт со всеми постами
Канал в Dzen
Сообщество в VK
Поддержка.
Если вам нравится канал и выходящий материал, поделитесь ссылкой с людьми, кому это тоже может быть интересно.
Также поддержать канал можно на Boosty.
Или внеся сайт в исключения вашего блокировщика рекламы.
В длинных постах можно запутаться поэтому, собираю воедино всё, что есть на данный момент.
Оглавления:
Для удобства навигации есть посты с оглавлениями по темам:
"Сайт на Django"
"Telegram-бот на AIOgram3"
"Применение Docker"
"Полезные инструменты"
"Путь в IT."
"Код в мешке"
"Boosty эксклюзив"
Ресурсы канала:
Уютный и немного безумный чат канала.
Бот с материалами к постам
Сайт со всеми постами
Канал в Dzen
Сообщество в VK
Поддержка.
Если вам нравится канал и выходящий материал, поделитесь ссылкой с людьми, кому это тоже может быть интересно.
Также поддержать канал можно на Boosty.
Или внеся сайт в исключения вашего блокировщика рекламы.
🔥3
Разворачивание Django-проекта на PythonAnyWhere
Автор: Иван Ашихмин
Есть несколько сервисов, которые позволяют бесплатно развернуть проекты на Django (и не только).
Их немного и в каждом есть свои ограничения, но они порой бывают полезны, когда собственного сервера нет, но нужно, например, показать результат работы заказчику.
В этом посте мы развернём проект на сервисе PythonAnyWhere.
Адрес сервиса: https://www.pythonanywhere.com
Регистрация в сервисе достаточно простая, нет смысла её описывать. В процессе регистрации осознанно выбирайте
После регистрации обязательно подтвердите электронную почту.
Подготовка проекта.
Перед тем, как приступить к работе с сервисом, необходимо подготовить проект для работы.
Автор: Иван Ашихмин
Есть несколько сервисов, которые позволяют бесплатно развернуть проекты на Django (и не только).
Их немного и в каждом есть свои ограничения, но они порой бывают полезны, когда собственного сервера нет, но нужно, например, показать результат работы заказчику.
В этом посте мы развернём проект на сервисе PythonAnyWhere.
Адрес сервиса: https://www.pythonanywhere.com
Регистрация в сервисе достаточно простая, нет смысла её описывать. В процессе регистрации осознанно выбирайте
username, поскольку именно он будет адресом сайта в интернете.После регистрации обязательно подтвердите электронную почту.
Подготовка проекта.
Перед тем, как приступить к работе с сервисом, необходимо подготовить проект для работы.
👍2❤1🔥1
В корне проекта, рядом с файлом
Также можно воспользоваться командой
Также в корне проекта создайте
Подробнее об этом файле рассказано в посте "AIOgram3 17. Подготовка к разворачиванию на сервере".
Для получения данных из
Установим её командой
Конфигурация настроек.
Откроем файл
В самом начале файла, сразу после импортов, добавляем вызов функции
После переменной
Они нужны для повышения безопасности проекта.
В переменную
Далее перейдём к блоку
Для поддержки
Убедитесь, что STATIC и MEDIA пути у вас верно указаны:
Далее нам нужны следующие переменные:
Заменяем в них значения на
Переменную
Создадим соответствующие переменные в
База данных.
Откроем на сайте раздел
Придумываем пароль и сразу вписываем его в
manage.py, создайте файл requirements.txt, если его нет. Добавьте туда используемые в вашем проекте библиотеки в формате <название_библиотеки><версия>, например, Django5.0.1.Также можно воспользоваться командой
pip freeze > requirements.txt которая соберёт все установленные библиотеки и запишет их в файл.Также в корне проекта создайте
.env-файл. В нём будут храниться секретные данные, такие, как секретный ключ Django, данные для подключения к БД и т.д. Всё, что не следует хранить в коде.Подробнее об этом файле рассказано в посте "AIOgram3 17. Подготовка к разворачиванию на сервере".
Для получения данных из
.env-файла нам потребуется библиотека python-dotenv.Установим её командой
pip install python-dotenv и добавим в requirements.txt.Конфигурация настроек.
Откроем файл
settings.py.В самом начале файла, сразу после импортов, добавляем вызов функции
load_dotenv().from dotenv import load_dotenv
load_dotenv()
После переменной
DEBUG добавим две переменные:SESSION_COOKIE_SECURE = True
CSRF_COOKIE_SECURE = True
Они нужны для повышения безопасности проекта.
В переменную
ALLOWED_HOSTS добавляем два адреса: один локальный, второй адрес будущей страницы на сервисе – ["127.0.0.1", "username.pythonanywhere.com"], где вместо username необходимо указать ваш логин в сервисе. Далее перейдём к блоку
DATABASES и заменим его с настроек для sqlite на mysql:DATABASES = {
"default": {
"ENGINE": "django.db.backends.mysql",
"NAME": os.getenv("MYSQL_DBNAME"),
"USER": os.getenv("MYSQL_USER"),
"PASSWORD": os.getenv("MYSQL_PASSWORD"),
"HOST": os.getenv("MYSQL_HOST"),
"OPTIONS": {
"init_command": "SET NAMES 'utf8mb4';SET sql_mode = 'STRICT_TRANS_TABLES'",
"charset": "utf8mb4",
},
}
}Для поддержки
MySQL установим библиотеку mysqlclient, выполнив команду pip install mysqlclient. И сразу добавим её в requirements.txt.Убедитесь, что STATIC и MEDIA пути у вас верно указаны:
STATIC_URL = "static/"
STATIC_ROOT = BASE_DIR / "static/"
MEDIA_URL = "media/"
MEDIA_ROOT = BASE_DIR / "media/"
Далее нам нужны следующие переменные:
SECRET_KEY, DEBUG, NAME, USER, PASSWORD, HOST.Заменяем в них значения на
os.environ.get(""), где в кавычках "" указываем имя переменной окружения.Переменную
DEBUG оборачиваем в if-else конструкцию.SECRET_KEY = os.environ.get("SECRET_KEY")
if os.environ.get("DEBUG") == "False":
DEBUG = False
else:
DEBUG = TrueСоздадим соответствующие переменные в
.env-файле в виде <имя_переменной>=<значение>, без кавычек.SECRET_KEY=...
DEBUG=False
MYSQL_DBNAME=...
MYSQL_USER=...
MYSQL_PASSWORD=...
MYSQL_HOST=...
База данных.
Откроем на сайте раздел
Databases. Нам сразу предлагают ввести пароль базы данных. Он должен отличаться от пароля к личному кабинету сервиса.Придумываем пароль и сразу вписываем его в
.env-файл в переменную MYSQL_PASSWORD.👍2🔥1
После того, как будет сконфигурирована БД, откроется страница, на которой в блоке
Ниже в блоке
Далее необходимо изменить кодировку БД с латинской на кириллическую. Для этого в блоке
Должно вывести:
Выходим из консоли, набрав команду
Загрузка файлов на сервер.
Загрузить файлы на сервер можно разными способами, например, опубликовать проект в GitHub или загрузить архив и распаковать его.
Я выбрал вариант с репозиторием на GitHub.
После того, как проект опубликован, на странице раздела
Вводим команду:
Когда скачаются файлы, вводим команду для перехода в директорию проекта:
Создаём и затем активируем виртуальное окружение Python:
Устанавливаем зависимости:
Настройка веб-приложения.
Переходим в раздел
На экране выбора веб-фреймворка нажимаем
После создания веб-приложения мы попадаем на страницу настройки.
Находим раздел
Находим раздел
Раскомментируем все строки, начинающиеся с одного символа решётки
Сразу после импортов добавляем загрузку
Далее в переменной
В месте, где указываем файл настроек проекта
Мой код файла:
Connecting будет две строки: Database host address и Username. Вписываем их в .env-файл в переменные MYSQL_HOST и MYSQL_USER, соответственно.Ниже в блоке
Your databases будет указано имя базы данных в формате <username>$<default>. Копируем и вписываем в переменную MYSQL_DBNAME.Далее необходимо изменить кодировку БД с латинской на кириллическую. Для этого в блоке
Your databases кликаем по имени базы данных и в открывшейся MySQL-консоли вводим, заменив username$default на имя базы данных:ALTER DATABASE username$default CHARACTER SET utf8 COLLATE utf8_general_ci;
Должно вывести:
Query OK, 1 row affected, 2 warnings (0.03 sec)
Выходим из консоли, набрав команду
exit.Загрузка файлов на сервер.
Загрузить файлы на сервер можно разными способами, например, опубликовать проект в GitHub или загрузить архив и распаковать его.
Я выбрал вариант с репозиторием на GitHub.
После того, как проект опубликован, на странице раздела
Consoles выбираем Bash для создания нового терминала.Вводим команду:
git clone <ссылка_на_репозиторий>
Когда скачаются файлы, вводим команду для перехода в директорию проекта:
cd <имя_проекта>
Создаём и затем активируем виртуальное окружение Python:
python3 -m venv venv
source venv/bin/activate
Устанавливаем зависимости:
pip install -r requirements.txt
Настройка веб-приложения.
Переходим в раздел
Web и нажимаем кнопку Add a new web app.На экране выбора веб-фреймворка нажимаем
Manual configuration (including virtualenvs). Далее Python 3.10.После создания веб-приложения мы попадаем на страницу настройки.
Находим раздел
Virtualenv и указываем путь к директории с виртуальным окружением. Если вы в точности повторяли всё, что было указано выше, то он будет таким: /home/<имя_пользователя>/<имя_проекта>/venv.Находим раздел
Code и в нём строку WSGI configuration file. Кликаем по ссылке и попадаем в окно редактирования WSGI-файла. Находим блок # +++++++++++ DJANGO +++++++++++ и удаляем всё, что находится до и после него.Раскомментируем все строки, начинающиеся с одного символа решётки
#.Сразу после импортов добавляем загрузку
.env-файла. Обратите внимание, в этой директории должен находиться .env-файл:from dotenv import load_dotenv
project_folder = os.path.expanduser('~/<имя_проекта>')
load_dotenv(os.path.join(project_folder, '.env'))
Далее в переменной
path указываем полный путь до директории проекта. Обратите внимание, в этой директории должен находиться файл manage.py:path = '/home/<имя_пользователя>/<имя_проекта>'
if path not in sys.path:
sys.path.append(path)
os.environ['DJANGO_SETTINGS_MODULE'] = '<имя_проекта>.settings'
## then:
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()
В месте, где указываем файл настроек проекта
<имя_проекта>.settings, прописывайте его так, как он указан в вашем файле settings.py в переменной WSGI_APPLICATION - <имя_проекта>.wsgi.application.Мой код файла:
👍2🔥2
# +++++++++++ DJANGO +++++++++++
# To use your own django app use code like this:
import os
import sys
from dotenv import load_dotenv
project_folder = os.path.expanduser('~/temp_project')
load_dotenv(os.path.join(project_folder, '.env'))
path = '/home/proDream/temp_project'
if path not in sys.path:
sys.path.append(path)
os.environ['DJANGO_SETTINGS_MODULE'] = 'pressanybutton.settings'
## then:
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()
Миграции и статика.
Вернёмся в консоль с активированным виртуальным окружением. Его можно найти в разделе
Consoles. Если закрыли, то откройте снова и активируйте
venv, либо на странице веб-приложения, в разделе Virtualenv нажмите Start a console in this virtualenv.Убеждаемся, что мы находимся в той же директории, что и файл
manage.py, выполнив команду ls. Если нет, то перейдите в нужную директорию командой cd.Выполним команду миграции базы данных:
python manage.py migrate
Создаём суперпользователя командой:
python manage.py createsuperuser
И следом выполняем команду сбора статических файлов:
python manage.py collectstatic
В результате выполнения третьей команды все статические файлы проекта будут собраны в одно место. В консоли будет отображен полный путь до директории со статическими файлами.
Скопируйте его.
На странице веб-приложения находим раздел
Static files.В блок
URL вводим /static/, а в блок Directory - скопированный ранее путь.Если в вашем проекте помимо статики используется ещё и media, укажите директорию и путь.
Завершение.
Остался последний шаг.
В самом верху страницы есть блок
Reload с большой зелёной кнопкой. Нажимаем на неё и ждём несколько секунд.После чего переходим по адресу, указанному над кнопкой
Configuration for ....В результате должна отобразиться главная страница сайта.
Поздравляю, ваш сайт доступен всему интернету по этому адресу.
Файлы к посту, можно получить в боте по коду: 687020
Пост на сайте
Поддержать проект
#Python #Django #Гайды #Разворачивание #Deploy #бесплатный_хостинг #PythonAnyWhere
👍3🔥2
Всем добрейшего вечерочка пятницы!
На связи ваша любимая рубрика "Пятничный кинорелакс". Пришло время отвлечься от дел и немного отдохнуть за просмотром очередного пятничного фильма. В этот раз запасаться вкусняшками советовать не буду. Фильм хоть и комедия, однако в нём есть не очень приятные (на мой взгляд) сцены😁
Фильм: Тяжёлая поездка
Год: 2018
В небольшом финском городке четыре патлатых друга играют тяжелую музыку в подвале дома и по совместительству оленьей фермы одного из них, да так, что олени готовы покончить с собой. Когда проезжавший мимо иностранец оказывается промоутером крупного норвежского метал-фестиваля, и ребята дают ему свою демо-запись, то вся деревня решает, что они — настоящие рок-звёзды. Теперь и гопники, дразнившие наших героев, предлагают вместе выпить.
https://www.kinopoisk.ru/film/1094255/
https://www.sspoisk.ru/film/1094255/
Приятного просмотра
На связи ваша любимая рубрика "Пятничный кинорелакс". Пришло время отвлечься от дел и немного отдохнуть за просмотром очередного пятничного фильма. В этот раз запасаться вкусняшками советовать не буду. Фильм хоть и комедия, однако в нём есть не очень приятные (на мой взгляд) сцены😁
Фильм: Тяжёлая поездка
Год: 2018
В небольшом финском городке четыре патлатых друга играют тяжелую музыку в подвале дома и по совместительству оленьей фермы одного из них, да так, что олени готовы покончить с собой. Когда проезжавший мимо иностранец оказывается промоутером крупного норвежского метал-фестиваля, и ребята дают ему свою демо-запись, то вся деревня решает, что они — настоящие рок-звёзды. Теперь и гопники, дразнившие наших героев, предлагают вместе выпить.
https://www.kinopoisk.ru/film/1094255/
https://www.sspoisk.ru/film/1094255/
Приятного просмотра
🔥2👍1
🔥4🤯4
Задача прошлой недели и вчерашняя задача похожи. И там, и там вся суть в поведении изменяемых типов данных... И капелька внимательности.
В викторине приняли участие 43 человека. Верный ответ оказался самым популярным! Верно ответило 16 человек, поздравляю. Вторым по популярности был третий ответ , набравший 32% ответов. Следом за ним идёт первый ответ с 26% ответов.
Код задачи:
Разберём задачу.
В самом начале создаём функцию
- Обязательный аргумент
- Необязательный аргумент
В теле функции мы добавляем в список
Достаточно простая функция с несложной логикой.
После функции инициализируем четыре переменные:
1.
2.
3.
4.
В конце выводим значение переменной
Что могло пойти не так?
Всё банально и просто. Python – интерпретируемый язык. Это означает, что он сперва читает файл, а потом выполняет его построчно. Т.к. функции не сразу начинают что-то делать, он их читает, инициализирует и дальше идёт по тексту пока объект функции не понадобится.
Именно так происходит и тут. Интерпретатор доходит до
Далее мы создаём четыре переменные:
1.
2.
3.
4.
В результате у нас есть три списка:
-
-
-
Заключение.
Будьте аккуратны с использованием изменяемых типов данных в качестве значений по умолчанию. Это может сыграть с вами злую шутку в самый неподходящий момент.
В викторине приняли участие 43 человека. Верный ответ оказался самым популярным! Верно ответило 16 человек, поздравляю. Вторым по популярности был третий ответ , набравший 32% ответов. Следом за ним идёт первый ответ с 26% ответов.
Код задачи:
def add_to_list(item, lst=[]):
lst.append(item)
return lst
list_a = add_to_list(1)
list_b = add_to_list(2, [])
list_c = add_to_list(3)
list_d = add_to_list(4, [])
print(list_c)
Разберём задачу.
В самом начале создаём функцию
add_to_list, принимающую два аргумента:- Обязательный аргумент
item.- Необязательный аргумент
lst. В качестве значения по умолчанию установлен пустой список.В теле функции мы добавляем в список
lst значение переменной item. Затем возвращаем список.Достаточно простая функция с несложной логикой.
После функции инициализируем четыре переменные:
1.
list_a - в этой переменной вызываем функцию передав в неё только число 1.2.
list_b - в этой переменной вызываем функцию, передав в неё число 2 и пустой список.3.
list_c - в этой переменной также вызываем функцию с одним аргументом 3.4.
list_d - в этой переменной вызываем функцию и передаём число 4 и пустой список.В конце выводим значение переменной
list_c.Что могло пойти не так?
Всё банально и просто. Python – интерпретируемый язык. Это означает, что он сперва читает файл, а потом выполняет его построчно. Т.к. функции не сразу начинают что-то делать, он их читает, инициализирует и дальше идёт по тексту пока объект функции не понадобится.
Именно так происходит и тут. Интерпретатор доходит до
add_to_list и видит, что у него в качестве значения аргумента lst по умолчанию указан пустой список и создаёт его в памяти. Назовём его lst_0. Это важный момент. Конкретный список, записанный в переменную lst_0 , до конца исполнения кода останется тем самым списком по умолчанию в необязательном аргументе функции, сколько бы раз эта функция ни вызывалась дальше. Это значит, что в нём будут сохраняться результаты всех предыдущих изменений. Подробнее о том, как ведут себя изменяемые и неизменяемые типы данных, можно прочесть в [нашем посте на эту тему](https://t.iss.one/press_any_button/356).Далее мы создаём четыре переменные:
1.
list_a - передаём только число 1. В результате lst_0 имеет вид [1]. 2.
list_b - передаём число 2 и пустой список. Это новый список, назовём его lst_b и он имеет вид [2].3.
list_c - передаём только число 3. Поскольку не был передан список, то используется ранее созданный lst_0. В результате он имеет вид [1, 3].4.
list_d - передаём число 4 и пустой список. Это ещё один новый список, назовём его lst_d. Он имеет вид [4].В результате у нас есть три списка:
-
lst_0 = [1, 3]-
lst_b = [2]-
lst_d = [4]Заключение.
Будьте аккуратны с использованием изменяемых типов данных в качестве значений по умолчанию. Это может сыграть с вами злую шутку в самый неподходящий момент.
👍5🔥5
С днём рождения, Андрей!
Автор: Иван Ашихмин
Сегодня 13 февраля 2024 года.. Вы наверняка спросите: "И что такого особенного в этом дне?". А я вам сейчас расскажу!!!
- День Дарвина (международный)
- День прокладывания тропинок
- День безумного желудка
- День объятий (Индия)
- День очистки компьютера (США)
А ещё, сегодня День Рождения у нашего главреда (не путать с главным вредителем, хотя это звание ему очень подходит, даже беря в расчет его характер). Так давайте все дружно поздравим его с Днём Рождения!!!
Поздравление от меня:
Когда у нас начался Python в основном блоке обучения, тогда-то я и познакомился с Андреем. Я сразу приметил его острый ум и нестандартный подход к решению задач. Затем мне довелось с ним и Владимиром поработать в команде, честно, тогда я считал себя самым глупым в нашей троице. А потом пошла Java и куча скучных курсов, от которых у Андрея пропал интерес к учёбе...
Автор: Иван Ашихмин
Сегодня 13 февраля 2024 года.. Вы наверняка спросите: "И что такого особенного в этом дне?". А я вам сейчас расскажу!!!
- День Дарвина (международный)
- День прокладывания тропинок
- День безумного желудка
- День объятий (Индия)
- День очистки компьютера (США)
А ещё, сегодня День Рождения у нашего главреда (не путать с главным вредителем, хотя это звание ему очень подходит, даже беря в расчет его характер). Так давайте все дружно поздравим его с Днём Рождения!!!
Поздравление от меня:
Когда у нас начался Python в основном блоке обучения, тогда-то я и познакомился с Андреем. Я сразу приметил его острый ум и нестандартный подход к решению задач. Затем мне довелось с ним и Владимиром поработать в команде, честно, тогда я считал себя самым глупым в нашей троице. А потом пошла Java и куча скучных курсов, от которых у Андрея пропал интерес к учёбе...
🎉7
Не так давно Андрей снова увлёкся питоном и программированием. Присоединился к некому проекту, пишет посты для канала и радует вас нестандартными задачками (которые я с первого раза так и не отгадывал).
В связи со всем вышесказанным хочу пожелать Андрею следующее:
Самого главного - здоровья твоей маленькой дочурке. Ведь дети, это прекрасно.
Ну и тебе тоже здоровья, а то как без него о дочурке-то заботиться?
Хочу пожелать или даже высказать надежу, что ты не бросишь программирование, а продолжишь учиться, развиваться и станешь отличным специалистом. Оставайся всё таким же весёлым, забавным, а порой невыносимым. И просто радуйся каждому дню.
Тайный лабиринт...
Андрей любит всевозможные задачи. Последние несколько месяцев он исправно подкидывал задачи для вас, и мы решили отомстить ему и немного с ним поиграть.
Представим, что мы находимся в лабиринте с множеством дверей и лишь за некоторыми располагаются Хранители ключей. Каждый из них задаст свою задачу и лишь после получения им верного решения направит к следующему Хранителю
И так, первая задача:
Задача выдана, Андрей?
Чего же ты ждёшь?!
Ищи ответ и не робей,
все ждут, когда ты путь начнёшь!
Как только выяснишь Хранителя,
Пиши ему не медля!
И оказавшись в его обители,
Реши задачу разуму внемля!
Пост на сайте
#Код_на_салфетке #Код_в_мешке #День_рождения #Андрей #Главный_редактор
В связи со всем вышесказанным хочу пожелать Андрею следующее:
Самого главного - здоровья твоей маленькой дочурке. Ведь дети, это прекрасно.
Ну и тебе тоже здоровья, а то как без него о дочурке-то заботиться?
Хочу пожелать или даже высказать надежу, что ты не бросишь программирование, а продолжишь учиться, развиваться и станешь отличным специалистом. Оставайся всё таким же весёлым, забавным, а порой невыносимым. И просто радуйся каждому дню.
Тайный лабиринт...
Андрей любит всевозможные задачи. Последние несколько месяцев он исправно подкидывал задачи для вас, и мы решили отомстить ему и немного с ним поиграть.
Представим, что мы находимся в лабиринте с множеством дверей и лишь за некоторыми располагаются Хранители ключей. Каждый из них задаст свою задачу и лишь после получения им верного решения направит к следующему Хранителю
И так, первая задача:
Кто шефа - правая рука?
Тут знают все наверняка,
Кто машет тапком тут и там -
Ты угадай по "двум словам".
Она - угроза всем, но скажет...
Что всех поймёт и всем подскажет.
И кофе от неё не жди
Тут лишь задачи впереди...
Задача выдана, Андрей?
Чего же ты ждёшь?!
Ищи ответ и не робей,
все ждут, когда ты путь начнёшь!
Как только выяснишь Хранителя,
Пиши ему не медля!
И оказавшись в его обители,
Реши задачу разуму внемля!
Пост на сайте
#Код_на_салфетке #Код_в_мешке #День_рождения #Андрей #Главный_редактор
🎉6
Андрей долго плутал в лабиринте в поисках заветной двери, ведущей к первому Хранителю. Он знал, что первый Хранитель - это секретарь и вглядывался в символы на дверях, но всё было не то, пока не наткнулся на розовую дверцу украшенную кофейными зёрнами и тогда он понял - это была та самая дверь...
Кристина:
Поздравляю, ты открыл первую дверь! Проходи, располагайся, будешь кофе?..
Андрей:
На овсяном молоке, пожалуйста.
Кристина:
Пусть сегодняшний день станет отправной точкой в новой ветке твоего пути, которая будет связана с программированием. Теперь ты дипломированный специалист и тебе открываются новые возможности. Пусть этот путь тебе принесёт моральное и финансовое удовлетворение. Пусть твоя семья растёт и приносит тебе много любви и тепла. Пусть каждое утро приносит тебе радость и вдохновение, а каждый вечер - удовлетворение и успокоение. И пусть каждый день дарит улыбку.
Кристина:
А теперь у меня для тебя загадка, разгадав которую ты получишь ключ и направление к следующему Хранителю. Приступим..
На нашем канале есть много разных людей, из них 5 человек изъявили желание поучаствовать в твоём поздравлении: 4 программиста и 1 музыкант. Предположим, что они встали в ряд. У них у всех разные имена. Каждый занимается своим направлением. Каждый из них пьёт свой напиток, предпочитает свое блюдо и содеpжит своё домашнее животное. Определи, кто из них содеpжит рыбок, следующий ключ находится у него/неё?
1. Владимир занимается мобильной разработкой.
2. У fullstack есть черепашка.
3. Мобильщик пьёт чай.
4. Артур стоит левее Вани, но стоят они рядом, разглагольствуют.
5. Артур пьёт кофе.
6. У того, кто ест суши, есть попугай.
7. Настя ест лазанью.
8. Третьим стоит тот, кто пьёт молоко.
9. Настя стоит первая.
10. Программист, который ест шашлык, стоит pядом с хозяином кошки.
11. Тот, кто содеpжит собаку, стоит pядом с тем, кто ест лазанью.
12. Тот, кто ест мармелад, пьёт пиво.
13. Артур любит пиццу.
14. Настя стоит pядом с мобильщиком.
15. У программиста, который ест шашлык, есть сосед, который пьёт водy.
16. Рядом с Владимиром стоит Backend-разработчик
17. QA любит кофе
18. Толик музыкант
Андрей:
Надеюсь, Артур не мой кофе пьет.
(Это не ответ)
Так, я беру пенсне, листик и бумажку. К утру будет ответ)
Попытки решить задачу на листе бумаги на который претендует дочка...
Артур
Хорошо, что не Толик. А то он суши любит…
Кристина:
Поздравляю тебя с верным ответом, теперь ты знаешь куда тебе идти дальше. Удачи.
🔥3❤1😁1
Успешно ответив на такую нетривиальную задачку, Андрей вернулся в лабиринт. Как только он переступил порог, дверь резко захлопнулась за ним, забирая с собой ароматы кофе... И он мог поклястся, что слышал зловещий смех... Он стоял и обдумывал произошедшее - "После первого раза стало проще", подумал он и начал понимать правила игры. Блуждая по коридорам, вглядываясь в двери он заметил, что на одной из дверей шелушится на ветру видеоплёнка, а по центру приколочена большая хлопушка. Вот она" - подумал он и без капли сомнений шагнул за порог.
Андрей:
Салям алейкум, брат!
Я пришел к тебе в поисках рыбок)
Артур:
Поздравляю, ты открыл вторую дверь! Проходи, располагайся, не желаешь посмотреть со мной фильм, прежде чем мы приступим к задаче?..
Андрей:
Множество историй, коль желаешь, посмотрю.
Артур:
С днём рождения! Пусть этот день будет для тебя особенным, полным радости и счастья. Пусть исполнятся все твои мечты и желания, а каждый следующий год приносит только благополучие и успех.
Андрей:
Спасибо!
Артур:
А теперь у меня для тебя загадка, разгадав которую ты получишь ключ и направление к следующему Хранителю. Приступим..
Первая загадка:
В комнате 53 человека. Каждый из них здоровается с каждым другим. Сколько рукопожатий произойдет?
Андрей:
А вы вообще придумали, что делать, если я ошибусь?)
Надеюсь, придумали.
1378 у меня получилось.
Воть
Артур:
Верно!
Вторая загадка:
В комнате есть три лампочки и три выключателя, каждый из которых соответствует одной лампочке. Вначале все лампочки выключены. Ты находишься за дверью и можешь войти в комнату только один раз. Как определить, к какому выключателю относится каждая лампочка, если ты не видишь, какие лампочки горят, а какие нет?
Андрей:
Сначала включить одну и подождать несколько минут. Выключить и включить вторую. Войти в комнату. Которая горит - включается вторым выключателем. Которая теплая из оставшихся - первым. А холодная и негорящая - третьим.
Артур:
Верно!
Третья загадка:
Кто в чате музыкой нас развлекает?
Клиентов хает только в путь!
На синтезаторе для всех играет,
Голосовые шлёт и там и тут!
Андрей:
Это разные люди.
Голосовые - Настя шлет. А музыку - Ваня. Клиентов вообще все хают. А синтезатор - в душе не знаю. Эту загадку сложнее гуглить.
Артур:
Ахахах). Подумай ещё. Эти качества умещаются в одном человеке и ты его знаешь
Андрей:
Сначала я подумал, что Игорь Николаев. Но он не в чате.
Анатолий, палучаецца.
Артур:
Верно!🥳
Артур:
Поздравляю тебя с верным ответом, теперь ты знаешь куда тебе идти дальше. Удачи.
Андрей:
Ну всё, я к нему тогда. Рахмат!
Артур:
Удачи)
🔥3
"Музыка!" - воскликнул Андрей. "Я видел дверь со скрипичным ключом!" - продолжал он. Уверенно повернулся назад и быстрым темпом направился обратно. "Где-то здесь..." - бормотал Андрей, разглядывая двери и внезапно для себя, уловил он тонкие звуки фортепьяно... Идя на звук, он становился всё чётче и вот она, дверь со скрипичным ключом. Распахнув её, его обдало сильной звуковой волной. На секунду, он даже подумал, что оглох, ковыряя пальцем в ухе, но деваться было некуда, нужно было входить.
Андрей:
Привет, Анатолий! Я к тебе за вопросом.
Анатолий:
Доброе утро путник! Дай мне секунду я где то потерял свиток
Гром и шорох из под шкафа с нотными тетрадями
Андрей:
Пригласи меня на ужин дружелюбным жестом.
Анатолий:
Поздравляю, ты открыл третью дверь! Проходи, располагайся, послушаем музыку и приступим, хорошо?..
https://music.yandex.ru/album/5788622/track/137670?utm_medium=copy_link
Андрей:
Погнали
Анатолий:
И так Андрэа, поздравляю тебя с твоим днём рождения, желаю всех благ, здоровья особенно, а дальше всё будет, что бы твои цели все были достигнуты, тост 🥂 за что? Зае**сь! Вот что бы и в жизни так было!
Андрей:
Благодарю!
Анатолий:
А теперь у меня для тебя загадка, разгадав которую ты получишь ключ и направление к следующему Хранителю. Приступим..
Андрей:
Агась
Первая загадка:
Довольно старая песня про художника, который полюбил одну девчонку, так полюбил, что купил очень очень много цветов, подумай хорошо, время есть
Андрей:
Так миллион алых роз
Анатолий:
Верно!
Вторая загадка:
А теперь присаживайся, я сыграю тебе мелодию, ну а ты попробуй угадать
звуки музыки
Андрей:
Ну это точно не Агутин…
Анатолий:
Точно нет 😄
У тебя есть 3 подсказки которыми ты можешь воспользоваться
Андрей:
Да я слышу, там на фоне кто-то пытается подсказывать.
Анатолий:
Я тебе расскажу историю очень и очень тесно связанную с этой замечательной мелодией:
Все жили в мирное время и тут разбушевался один известный грибок под названием кордицепс, люди стали себя странно вести, кидаться и даже убивать, и весь мир пошел под откос, совершенно случайно нашли одну девочку способную победить грибок, но что бы создать вакцину нужно было отвезти на восток к группе ученых и взялся за дело мужчина который прошел половину Америки и выполнил своё задание.
Андрей:
Зе ласт оф ас, получается?
Анатолий:
Умничка! Идём дальше
Третья загадка:
Назови имя человека у которого есть своя рок группа, но по мимо этого он еще и снялся в паре фильмов, представь себе! Музыкант и Актёр, две крайности одной сущности 😱
Андрей:
Таких не один) Джаред Лето, например, Киану Ривз, Виктор Цой. Да даже Сергей Паук Троицкий!
Анатолий:
Таак, так так, но только один правильный ответ
Андрей:
И как я должен выбрать среди такой замечательной компании одного человека?
Анатолий:
Нууу, ой слушай я проголодался, хочу котлетку, о да!
Андрей:
Джаред Котлето?
Анатолий:
Ееессс! Только никому не говори 🤫
Четвёртая загадка:
Смотри какое красивое у меня пианино, только вот сколько оно имеет клавиш? У меня 77 а по стандарту?
Андрей:
Только не говори, что 300))
88
Анатолий:
Там шутка про тракториста? 😁
Андрей:
Её в печать не пропустят)
Анатолий:
Именно, да, ты прав, 88 клавиш!
Андрей:
И 14 аккордов, видимо.
Анатолий:
А теперь последняя загадка 🤔
Пятая загадка:
Ты же знаешь самого быстроговорящего армянина в роцк-культуре?
Андрей:
Серж
Анатолий:
А полностью?
Андрей:
Танкян!
Анатолий:
Дааа!! Я и половины не понимаю что он поёт 😁
Андрей:
Половины)
Анатолий:
И так дорогой путник я тебя поздравляю с верным ответом, следующий хранитель - Настя. Удачи 🍀
🔥4
Андрей вышел из музыкальной комнаты, "что-то я устал" - подумал он, но впереди ещё была половина пути. Анатолий дал ему подсказку, что следующий хранитель находится в тёмной части лабиринта и что бы он был осторожен там. Андрей направился в путь. Тут и так темно, но заходя дальше становилось не просто темнее, а мрачнее. Повсюду были записки с кодом, на которых чётко виднелась одна надпись - "USER"... И он увидел дверь, всю исписанную кодом, вокруг которой висели предупреждающие таблички, одна из низ гласила "HTMLщикам вход ВОСПРЕЩЁН!!!". Деваться было некуда, он сделал глубокий вдох и переступил порог.
Андрей:
Настя, доброе утро)
Анастасия:
Привет) Поздравляю ты открыл 4-ю дверь! Проходи располагайся, нас заждался юзер, покодим и перейдем к задачке?
Андрей:
Юзера нельзя заставлять ждать!
Анастасия:
Хорошо ) Вот тебе шифр, а ключ к его расшифровке скрыт в фразе:
"Если бы этот день был пятницей, то он бы стал мистическим днём твоего рождения."
Шифр:
Юшсракёхц Вэмъхясши йяы ОшмрхщхэАнастасия:
А пока ты отгадываешь загадку... Поздравляю тебя с Днем рождения) И желаю оставаться таким же крутым и с таким же убойным чувством юмора! Конечно же найти работу мечты и получить классный оффер 🥳
Андрей:
Следующий хранитель - это Владимир?
Анастасия:
Точно ты угадал)) Причем очень быстро
Андрей:
А юзер где? Или это Владимир?!
Анастасия:
Мы с юзером сегодня попробуем еше разок залить котикокфф на сервак
Андрей:
Мне сунуться к Владимиру?)
Или это вообще город имеется в виду? Мне пригодится Гугл.Мэпс?
Анастасия:
Ага к Владимиру)) Город это даже для нас слишком жестоко))
Андрей:
Мерси!
Анастасия:
Приходи еще юзер один скучает )
🔥2😱2