Приветствую вас, друзья, в этот волшебный вечер пятницы!
А волшебен он именно тем, что впереди два дня свободы от трудовых будней, начальства и всяческой рутины. И выходные лучше всего начать с просмотра хорошего фильма.
Фильм: Семь
Год: 1995
Детектив Уильям Сомерсет - ветеран уголовного розыска, мечтающий уйти на пенсию и уехать подальше от города и грешных обитателей. За 7 дней до пенсии на Сомерсета сваливаются две неприятности: молодой напарник Миллс и особо изощренное убийство. Острый ум опытного сыщика сразу определяет, что за этим преступлением, скорее всего, последуют другие. Новости подтверждают его догадку. Поняв, что убийца наказывает свои жертвы за совершенные ими смертные грехи, детектив встает перед выбором: вернуться к работе либо уйти и передать дело своему менее опытному напарнику?
https://www.sspoisk.ru/film/377/?utm_referrer=www.google.com
Хорошего просмотра)
А волшебен он именно тем, что впереди два дня свободы от трудовых будней, начальства и всяческой рутины. И выходные лучше всего начать с просмотра хорошего фильма.
Фильм: Семь
Год: 1995
Детектив Уильям Сомерсет - ветеран уголовного розыска, мечтающий уйти на пенсию и уехать подальше от города и грешных обитателей. За 7 дней до пенсии на Сомерсета сваливаются две неприятности: молодой напарник Миллс и особо изощренное убийство. Острый ум опытного сыщика сразу определяет, что за этим преступлением, скорее всего, последуют другие. Новости подтверждают его догадку. Поняв, что убийца наказывает свои жертвы за совершенные ими смертные грехи, детектив встает перед выбором: вернуться к работе либо уйти и передать дело своему менее опытному напарнику?
https://www.sspoisk.ru/film/377/?utm_referrer=www.google.com
Хорошего просмотра)
🔥6
Что выведет код с изображения ниже?
Anonymous Quiz
36%
[[1, 2, 3, 4], [1, 2], [1, 2, 3, 5]]
14%
[[1, 2, 3, 5], [1, 2, 3, 5], [1, 2, 3, 5]]
12%
[[1, 2, 3], [1, 2, 3, 4], [1, 2, 3, 4, 5]]
39%
Ничего из перечисленного выше
👍1🔥1
Вчера мы задали простую, но весьма хитрую задачку. Суть задачи заключается в понимании типов данных Python, а именно того, как работают изменяемые типы данных. Перед чтением разбора рекомендуем прочитать наш пост "Питон на измене".
В викторине приняли участие 44 человека! Верных ответов, правда, набралось всего 8, что равно 18-ти процентам... Самым популярным вариантом, оказался "Ничего из перечисленного выше", набрав 39%, следом за ним идёт первый вариант с 32% ответов.
Код задачи:
Разберём задачу.
Создаём переменную
Далее производим ряд действий над элементами списка:
1. В нулевой элемент списка добавляем цифру 4.
2. Из первого элемента списка вынимаем последнюю цифру.
3. Во второй элемент списка добавляем цифру 5.
4. Выводим весь список на экран.
В итоге мы ожидаем получить
Почему тогда верный ответ `[[1, 2, 3, 5], [1, 2, 3, 5], [1, 2, 3, 5]]`?
Вспоминаем, каким типом данных является список? Верно, изменяемым. Ещё такие типы данных именуют "ссылочными".
Всё дело в том, что когда мы в самом начале умножали список
Это легко проверить, запустив следующий код:
Как видим, все три элемента списка ссылаются на одну и ту же ячейку памяти, т.е. на один и тот же список.
В связи с этим, изменяя один элемент списка, мы изменяем и остальные.
Заключение.
Вот так вот простейший с виду код может обмануть программиста.
В викторине приняли участие 44 человека! Верных ответов, правда, набралось всего 8, что равно 18-ти процентам... Самым популярным вариантом, оказался "Ничего из перечисленного выше", набрав 39%, следом за ним идёт первый вариант с 32% ответов.
Код задачи:
my_list = [[1, 2, 3]] * 3
my_list[0].append(4)
my_list[1].pop()
my_list[2].append(5)
print(my_list)
Разберём задачу.
Создаём переменную
my_list в которой умножаем список [[1, 2, 3]] на три. Получаем следующий список: [[1, 2, 3], [1, 2, 3], [1, 2, 3]].Далее производим ряд действий над элементами списка:
1. В нулевой элемент списка добавляем цифру 4.
2. Из первого элемента списка вынимаем последнюю цифру.
3. Во второй элемент списка добавляем цифру 5.
4. Выводим весь список на экран.
В итоге мы ожидаем получить
[[1, 2, 3, 4], [1, 2], [1, 2, 3, 5]].Почему тогда верный ответ `[[1, 2, 3, 5], [1, 2, 3, 5], [1, 2, 3, 5]]`?
Вспоминаем, каким типом данных является список? Верно, изменяемым. Ещё такие типы данных именуют "ссылочными".
Всё дело в том, что когда мы в самом начале умножали список
[[1, 2, 3]] на три, мы по сути создали список из трех ссылок на один и тот же список.Это легко проверить, запустив следующий код:
my_list = [[1, 2, 3]] * 3
print(id(my_list))
print(id(my_list[0]), id(my_list[1]), id(my_list[2]))
>>> 2239539514496
>>> 2239534636480 2239534636480 2239534636480
Как видим, все три элемента списка ссылаются на одну и ту же ячейку памяти, т.е. на один и тот же список.
В связи с этим, изменяя один элемент списка, мы изменяем и остальные.
Заключение.
Вот так вот простейший с виду код может обмануть программиста.
🔥5
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