Хмм, все же нужно лекции выпускать пожалуй, давайте, когда кто то зделает дз последнее, я постараюсь как можно быстрее выпустить её. А так я сегодня мб по делаю...
🥰1🤯1🌭1🤪1💊1
Продолжим...
После долгого перерыва, я все же сделаю что-нибудь...
Продолжим последнюю тему, manim позволяет создавать красивые анимации текста, фигур и других объектов, я уже показал, как сделать звезду. Существуют различные анимации появления объектов. Анимация, показанная в последнем примере - это обрисовка объекта по контуру и заполнение его. Но давайте посмотрим на другие анимации появления:
1. FadeIn - просто появление...
Тут все просто
2. add - добавление объекта на сцену без анимации
Существуют remove и fadeOut, они удаляют объекты соответственно...
Также есть всякие growFromCenter, но они очевидно что делают, так что я рассказывать не буду..
Дз:
Сделайте анимацию со всеми этими способами появления, поиграйтесь)))
После долгого перерыва, я все же сделаю что-нибудь...
Продолжим последнюю тему, manim позволяет создавать красивые анимации текста, фигур и других объектов, я уже показал, как сделать звезду. Существуют различные анимации появления объектов. Анимация, показанная в последнем примере - это обрисовка объекта по контуру и заполнение его. Но давайте посмотрим на другие анимации появления:
1. FadeIn - просто появление...
from manim import *
class first(Scene) :
def construct(self) :
star=Star()
self.play(fadeIn(star))
Тут все просто
2. add - добавление объекта на сцену без анимации
from manim import *
class first(Scene) :
def construct(self) :
star=Star()
self.add(star)
Существуют remove и fadeOut, они удаляют объекты соответственно...
Также есть всякие growFromCenter, но они очевидно что делают, так что я рассказывать не буду..
Дз:
Сделайте анимацию со всеми этими способами появления, поиграйтесь)))
❤🔥1🔥1
Всем дратути....
Я сейчас разрабатываю собственный физический движок для создания игр. Хотите ли вы, чтобы я рассказывал как я его делаю тут?
Я сейчас разрабатываю собственный физический движок для создания игр. Хотите ли вы, чтобы я рассказывал как я его делаю тут?
👎2👍1🥰1🍌1
Сегодня написал скрипт получения горизонтального направления, считывая нажатия стрелочек и добавил классу Sprite(это тот, который отвечает за каринку, соответствующую объекту) функцию, которая разворачивает изображение)
🔥2
Задача:
Аня идет по лестнице, каждый шаг она выбирает действие
1. Если ноги у неё на одной ступеньке, шагнуть левой ногой, сложность шага должна быть не больше l1.
2. Если ноги у неё на одной ступеньке, она может шагнуть правой ногой, сложность шага не должна превышать r1.
3.Если ноги у Ани на разных ступеньках, она может поставить одну ногу рядом с другой.
4. Если ноги у Ани на разных ступеньках, она может шагнуть той ногой, которая ниже, ставит её на ступеньку рядом с предыдущей и шагает не более чем на r2 или l2 для правой и левой ноги соответственно. Это происходит за одно действие
Вам даны высоты ступенек, их количество, l1, r1, l2, r2.
Найдите за какое минимальное число шагов обе ноги окажутся на верхней ступеньке.
Аня идет по лестнице, каждый шаг она выбирает действие
1. Если ноги у неё на одной ступеньке, шагнуть левой ногой, сложность шага должна быть не больше l1.
2. Если ноги у неё на одной ступеньке, она может шагнуть правой ногой, сложность шага не должна превышать r1.
3.Если ноги у Ани на разных ступеньках, она может поставить одну ногу рядом с другой.
4. Если ноги у Ани на разных ступеньках, она может шагнуть той ногой, которая ниже, ставит её на ступеньку рядом с предыдущей и шагает не более чем на r2 или l2 для правой и левой ноги соответственно. Это происходит за одно действие
Вам даны высоты ступенек, их количество, l1, r1, l2, r2.
Найдите за какое минимальное число шагов обе ноги окажутся на верхней ступеньке.
Всем здравствуйте, хочу пожелать удачи всем, кто идет сегодня на Олимпиаду по информатике.
Пожалуй один из наиболее обширных алгоритмов - динамика(ну вариаций ±∞) . Мы помним что она бывает двумерной или трёхмерной, а может и одномерной. А так еще важно помнить, что проход по двумерному массиву будет стоить вам произведение его длин, будьте осторожны с двумерной динамикой) Также не забываем про логарифм, это хорошая сложность. Получить её можно, например, используя meet in middle. Ну это как в сортировке слиянием у вас сортируются половинки, а потом их объединение, тут нужно не забыть, что логарифм умножится на сложность на кусочке.
Думаю не нужно объяснять, что писать сортировку на Олимпиаде не нужно, прекрасный c++ умеет сортировать с заданным алгоритмом. В sort есть третий аргумент - функция по которой он определяет что больше другого, она должна принимать два аргумента, возвращать true/false. Хорошо, это неплохо. Замечу, что на Олимпиаде 99% будут графы, DFS и BFS вам в помощь. Это алгоритмы обхода графов, их написание есть тут выше). Не думаю что на муниципе вам попадется Дейкстра какой-нибудь) . Мы не забываем, что существуют жадные алгоритмы, и они иногда работают. Не надо в первой задаче применять три бинпоиска по динамике и после этого получить граф решений по которому надо пройтись.
Даамс, получилось объемнее обычной лекции... Всем удачи)
Пожалуй один из наиболее обширных алгоритмов - динамика(ну вариаций ±∞) . Мы помним что она бывает двумерной или трёхмерной, а может и одномерной. А так еще важно помнить, что проход по двумерному массиву будет стоить вам произведение его длин, будьте осторожны с двумерной динамикой) Также не забываем про логарифм, это хорошая сложность. Получить её можно, например, используя meet in middle. Ну это как в сортировке слиянием у вас сортируются половинки, а потом их объединение, тут нужно не забыть, что логарифм умножится на сложность на кусочке.
Думаю не нужно объяснять, что писать сортировку на Олимпиаде не нужно, прекрасный c++ умеет сортировать с заданным алгоритмом. В sort есть третий аргумент - функция по которой он определяет что больше другого, она должна принимать два аргумента, возвращать true/false. Хорошо, это неплохо. Замечу, что на Олимпиаде 99% будут графы, DFS и BFS вам в помощь. Это алгоритмы обхода графов, их написание есть тут выше). Не думаю что на муниципе вам попадется Дейкстра какой-нибудь) . Мы не забываем, что существуют жадные алгоритмы, и они иногда работают. Не надо в первой задаче применять три бинпоиска по динамике и после этого получить граф решений по которому надо пройтись.
Даамс, получилось объемнее обычной лекции... Всем удачи)
Расскажите что вам показалось самым сложным, можете ещё что-то рассказать про тур
Всем "Hello". Сегодня я хочу рассказать про то, что все использовали хотя бы раз, но, возможно, не знают что это, и как это работает.
Рассмотрим задачу, мы делаем фреймворк и хотим, чтобы мы могли брать код пользователя и его использовать. Например, хотим взять функцию, которая была им написана, и изменить её так, чтобы к её выводу добавилось её название, список аргументов и что то ещё. С этим нам помогут ДЕКОРАТОРЫ.
Декораторы - просто функции, но они принимают как аргумент функцию и возвращают функцию). Рассмотрим пример(мб понятнее станет).
Вывод:
Hello from decorator Hello from function.
Так вот, думаю принцип понятен, давайте, для закрепления пару упражнений, и как только кто-то сделает их, я выпускаю следующий блок)
1. Напишите декоратор, который превращает функцию, возвращающую 5, в функцию, возвращающую 6.
2. Пусть есть глобальная строка s. Функция её выводит. Сделайте декоратор, который заставляет печатать s большими буквами.
Рассмотрим задачу, мы делаем фреймворк и хотим, чтобы мы могли брать код пользователя и его использовать. Например, хотим взять функцию, которая была им написана, и изменить её так, чтобы к её выводу добавилось её название, список аргументов и что то ещё. С этим нам помогут ДЕКОРАТОРЫ.
Декораторы - просто функции, но они принимают как аргумент функцию и возвращают функцию). Рассмотрим пример(мб понятнее станет).
def dec(f) :
def newfunk():
return "Hello from decorator" + f()
# обращу внимание, что тут используется значение функции.
return newfunk
def funk():
return "Hello from function"
funk = f(funk)
funk()
Вывод:
Hello from decorator Hello from function.
Так вот, думаю принцип понятен, давайте, для закрепления пару упражнений, и как только кто-то сделает их, я выпускаю следующий блок)
1. Напишите декоратор, который превращает функцию, возвращающую 5, в функцию, возвращающую 6.
2. Пусть есть глобальная строка s. Функция её выводит. Сделайте декоратор, который заставляет печатать s большими буквами.
🔥2🤓1
Всех С Новым годом! Желаю всем удачи, удачной компиляции кода и высоких баллов на олимпиадах)))
Постораюсь в этом году больше лекций писать)
Постораюсь в этом году больше лекций писать)
🙏1
Я хочу сделать курс с просто 0 порогом входа, хотите?
Anonymous Poll
81%
Да, я буду читать, даже делать иногда
19%
Нуууу, нет наверно
Чтош... Начнем наш быстрый экскурс по одному из самых известных фреймворков для создания сайтов на python. Django, прошу любить и жаловать. Если вы выберете его, то вы сразу получаете кучу плюсов, а один из самых важных - есть документация. Вы не дружите с английским? Есть на русском.
Хорошо, что мы сделаем(я надеюсь) за это время? Мы напишем небольшой сайт, что-то типа Интернет магазина, список товаров, у каждого есть отзывы и оценка. Конечно, это будет простой монолит с базой данных на основе SQLite. Если вам интересно, какие архитектуры сейчас используются и как они устроены(и почему спор монолит vs микросервисы больше не актуален), то напишите об этом в комментариях.
Хорошо, что-то я вам много наобещал, а мы так и ничего не сделали. Начнем, как и любую библиотеку, нам нужно её установить, пишем:
Успех, теперь создадим сам проект, напишем ещё:
Логично, туда нужно подставить название вашего проекта.
После этого у вас создастся папка с названием вашего проекта, а внутри ещё одна и файлик manage.py. Он нам понадобится ещё много раз, например, прямо сейчас.
После выполнения запуститься локальный сервер(это ещё один плюс Джанго), перейдите на адрес, который он вам дал(обычно это localhost:8000). Вы должны увидеть сообщение приветствия. У нас хорошая статистика, пока 0 строчек кода.
На этом пока что хватит, в этом курсе я не буду давать ДЗ, вы можете просто написать, что мол у меня получилось или у меня ошибка.
Хорошо, что мы сделаем(я надеюсь) за это время? Мы напишем небольшой сайт, что-то типа Интернет магазина, список товаров, у каждого есть отзывы и оценка. Конечно, это будет простой монолит с базой данных на основе SQLite. Если вам интересно, какие архитектуры сейчас используются и как они устроены(и почему спор монолит vs микросервисы больше не актуален), то напишите об этом в комментариях.
Хорошо, что-то я вам много наобещал, а мы так и ничего не сделали. Начнем, как и любую библиотеку, нам нужно её установить, пишем:
pip install django
Успех, теперь создадим сам проект, напишем ещё:
django-admin startproject name_of_your_project
Логично, туда нужно подставить название вашего проекта.
После этого у вас создастся папка с названием вашего проекта, а внутри ещё одна и файлик manage.py. Он нам понадобится ещё много раз, например, прямо сейчас.
python manage.py runserver
После выполнения запуститься локальный сервер(это ещё один плюс Джанго), перейдите на адрес, который он вам дал(обычно это localhost:8000). Вы должны увидеть сообщение приветствия. У нас хорошая статистика, пока 0 строчек кода.
На этом пока что хватит, в этом курсе я не буду давать ДЗ, вы можете просто написать, что мол у меня получилось или у меня ошибка.
Django Project
Django documentation | Django documentation
The web framework for perfectionists with deadlines.
🔥3
Продолжим, мы создали проект, давайте посмотрим что у нас есть. В файле settings.py, логично, настройки, есть настройки языка, дебаг, настройки каталогов, файл urls.py отвечает за различные страницы сайта. Хорошо, любой сайт состоит из apps(приложений), например, мы можем создать приложение каталога товаров, оформления заказов и панели администратора. Создадим первое приложение.
Теперь у вас появилась папка приложения, но мне не очень нравится её расположение, я бы хотел, чтобы она лежала в парке apps, внутри проекта. Перенесем её туда, зайдем в settings.py и создадим переменную
Вторая строчка просто нужна для расширения среды, не забудьте импортировать sys. Можете запустить сервер и проверить, что никаких ошибок не возникает(кстати, если вы меняете какие-то файлы, то сервер можно не перезапускать, он сам применит изменения).
Отлично, заходим в папку приложения и видим:
1. Папку migrations - папка необходимая для работы с БД.
2. Файл models.py - один из самых важных файлов, про него чуть позже.
3. Файл views.py - тоже очень важно, будет нужен для выдачи ответов.
4. Ещё несколько файлов, которые я пока оставлю без комментариев.
Хорошо, для того, чтобы продолжить маленькая справка по тому, как взаимодействуют хостинг(сайт) и компьютер пользователя. Идете вы, например, смотреть Ютуб, ваш компьютер делает http запрос на сервер, он хочет получить страничку. Такой тип запросов называется GET-запрос. Сервер ищет, что он будет выдавать на этот запрос, а потом отправляет страницу. После нескольких итераций получения всех файлов(например само видео будет передаваться отдельно, как и таблицы стилей). За обработку запроса отвечает как раз файл urls.py. А вот за генерацию ответа - views.py. Давайте научимся отдавать простейшие ответы при заходе в каталог.
Сначала напишем как мы хотим отвечать на запрос. Для этого заходим во views.py, стираем всё и записываем:
Здесь мы инициализировали просто функции, которые отдают ответ в виде строки.
Но нам также нужно сопоставить путям, которые запрашивает сайт(например https://mysite/page/comments), ответы. Для этого и существует urls.py. Поскольку одна из страниц относится к нашему приложению, то давайте и привязку будем делать в нём.
Создаем в парке приложения файл urls.py и пишем:
Этим мы сказали, что начальная страница нашего приложения (именно его, мы создадим путь до него, адрес у этой страницы будет типа http://site.ru/shop/) будет возвращать ответ в соответствии с функцией index во views.py.
Осталось только настроить привязки в самом проекте, поэтому находим такой же файл в папке проекта и добавляем:
Не забудьте в импорте кроме path импортировать ещё и include.
В этом фрагменте мы все привязки из приложения shop поставили после пути http://site.ru/shop/. То есть мы как бы задали то, откуда начинается наше приложение.
Теперь, если вы откроете в адресной строке этот путь то вы увидите текст.
Оставлю вас пока с этим, удачи!
python manage.py startapp shop
Теперь у вас появилась папка приложения, но мне не очень нравится её расположение, я бы хотел, чтобы она лежала в парке apps, внутри проекта. Перенесем её туда, зайдем в settings.py и создадим переменную
PROJECT_ROOT = os.path.dirname(__file__)
sys.path.insert(0, os.path.join(PROJECT_ROOT, "apps"))
Вторая строчка просто нужна для расширения среды, не забудьте импортировать sys. Можете запустить сервер и проверить, что никаких ошибок не возникает(кстати, если вы меняете какие-то файлы, то сервер можно не перезапускать, он сам применит изменения).
Отлично, заходим в папку приложения и видим:
1. Папку migrations - папка необходимая для работы с БД.
2. Файл models.py - один из самых важных файлов, про него чуть позже.
3. Файл views.py - тоже очень важно, будет нужен для выдачи ответов.
4. Ещё несколько файлов, которые я пока оставлю без комментариев.
Хорошо, для того, чтобы продолжить маленькая справка по тому, как взаимодействуют хостинг(сайт) и компьютер пользователя. Идете вы, например, смотреть Ютуб, ваш компьютер делает http запрос на сервер, он хочет получить страничку. Такой тип запросов называется GET-запрос. Сервер ищет, что он будет выдавать на этот запрос, а потом отправляет страницу. После нескольких итераций получения всех файлов(например само видео будет передаваться отдельно, как и таблицы стилей). За обработку запроса отвечает как раз файл urls.py. А вот за генерацию ответа - views.py. Давайте научимся отдавать простейшие ответы при заходе в каталог.
Сначала напишем как мы хотим отвечать на запрос. Для этого заходим во views.py, стираем всё и записываем:
from django.http import HttpResponse
def index(request):
return HttpResponse("Тук-тук-тук")
Здесь мы инициализировали просто функции, которые отдают ответ в виде строки.
Но нам также нужно сопоставить путям, которые запрашивает сайт(например https://mysite/page/comments), ответы. Для этого и существует urls.py. Поскольку одна из страниц относится к нашему приложению, то давайте и привязку будем делать в нём.
Создаем в парке приложения файл urls.py и пишем:
from django.urls import path
from . import views
urlpatterns = [
path('', views.index, name = "index")
]
Этим мы сказали, что начальная страница нашего приложения (именно его, мы создадим путь до него, адрес у этой страницы будет типа http://site.ru/shop/) будет возвращать ответ в соответствии с функцией index во views.py.
Осталось только настроить привязки в самом проекте, поэтому находим такой же файл в папке проекта и добавляем:
...
urlpatterns=[
path("shop/", include("shop.urls")),
#тут строка с админкой
]
...
Не забудьте в импорте кроме path импортировать ещё и include.
В этом фрагменте мы все привязки из приложения shop поставили после пути http://site.ru/shop/. То есть мы как бы задали то, откуда начинается наше приложение.
Теперь, если вы откроете в адресной строке этот путь то вы увидите текст.
Оставлю вас пока с этим, удачи!
Я вернулся, продолжим.
Теперь, давайте разберемся с базой данных.
Джанго поддерживает практически все существующие базы данных, по умолчанию там стоит файловая SQLite, которую сейчас особо не используют в серозных проектах. Но для нашей цели её пока хватает, но если что, в настройках всегда можно подключить что-то другое.
Вся структура базы данных строится на моделях. Модель - некоторый объект с определенными свойствами. Например может быть модель с именем "товар", что нам от неё нужно? Название товара, стоимость, наличие на складе, фото и Мб что-то еще, но я ограничусь этим. В Джанго для моделей существует файл, который так и называется models.py. Давайте создадим нашу модель.
Открываем файл и пишем:
Здесь мы объявили класс Item(все модели принято называть с большой буквы в единственном числе), который описывает наш товар, у этой модели есть четыре поля: имя, цена, распродан ли и фото(да, есть специальное поле ImageField, но оно требует установку pillow) . У каждого поля есть тип, который определяет что туда можно написать, подробнее о них можно прочесть в документации.
Ну хорошо, вот мы вроде создали модель, а дальше что? Теперь надо создать табличку в самой бд. Открываем консоль:
Эта команда
1. Создаст карту миграции,которую мы потом применим.
2. Создаст файл в папочке migrations, можете его открыть, там примерно описано, что за таблицу мы создаем и что с ней делать.
Окей, но пока таблица не создалась, нам нужно ещë чучуть написать
Мы применили миграцию, теперь бд в сборе и мы можем туда что-то добавить. А как? Есть два способа: через код и через админ панель. Разберемся с обоими.
Для начала как это делать через код. Есть большое количество методов, которые позволяют делать что угодно, я покажу несколько.
1. create()
Теперь в переменной с соответствующим названием лежит наш новый продукт, все просто.
Если вдруг что, вы можете разить это на две строчки. Создайте экземпляр класса и примените посже к нему метод save(). На этом методов записи нам хватит, так-то их много.
2. get()
Он позволяет получить объект по условию, но, важно понимать, что если количество таких объектов, что соответствуют условию, отлично от единицы, то вас пошлют с ошибкой, поэтому лучшее применение - поиск по айди.
3.get_or_create()
Не думаю, что тут нужны пояснения, просто получит из таблички, если нету, то создаст.
Но тут важно, что эта команда вернет кортеж из двух элементов, первый - объект, второй - был ли он создан.
4. filter()
Даст все элементы, которые соответствуют условиям.
Все продукты в наличии.
Хорошо, предпоследнее здесь будет то, что позволит редактировать бд прямо в браузере. В Джанго есть встроенная админ-панель.
Команда:
После этого вам предложат придумать пароль, зайдите на сайте по пути /admin. Вам нужно зайти в пользователя, вы открыли админ панель, но пока там почти ничего нет, нужно её настроить. Для этого есть admin.py
И всё, теперь можно ручками добавлять продукты.
Последнее - это создание отзывов. Модель отзыва должна содержать текст, автора, оценку, а главное, к какому товару он относится. Когда модели может быть сопоставлено несколько других это называется отношение один ко многим. То есть к одному продукту мы можем написать сколько угодно отзывов, но важно, что отзым относится только к одному продукту. Также существует отношение многие ко многим и один к одному.
Вот моя модель отзывов.
Теперь, давайте разберемся с базой данных.
Джанго поддерживает практически все существующие базы данных, по умолчанию там стоит файловая SQLite, которую сейчас особо не используют в серозных проектах. Но для нашей цели её пока хватает, но если что, в настройках всегда можно подключить что-то другое.
Вся структура базы данных строится на моделях. Модель - некоторый объект с определенными свойствами. Например может быть модель с именем "товар", что нам от неё нужно? Название товара, стоимость, наличие на складе, фото и Мб что-то еще, но я ограничусь этим. В Джанго для моделей существует файл, который так и называется models.py. Давайте создадим нашу модель.
Открываем файл и пишем:
from django.db import models
class Item(models.Model):
name = models.CharField(max_length=20)
cost = models.IntegerField()
isSold = models.BooleanField()
image = models.FileField()
Здесь мы объявили класс Item(все модели принято называть с большой буквы в единственном числе), который описывает наш товар, у этой модели есть четыре поля: имя, цена, распродан ли и фото(да, есть специальное поле ImageField, но оно требует установку pillow) . У каждого поля есть тип, который определяет что туда можно написать, подробнее о них можно прочесть в документации.
Ну хорошо, вот мы вроде создали модель, а дальше что? Теперь надо создать табличку в самой бд. Открываем консоль:
python manage.py makemigrationsЭта команда
1. Создаст карту миграции,которую мы потом применим.
2. Создаст файл в папочке migrations, можете его открыть, там примерно описано, что за таблицу мы создаем и что с ней делать.
Окей, но пока таблица не создалась, нам нужно ещë чучуть написать
python manage.py migrate
Мы применили миграцию, теперь бд в сборе и мы можем туда что-то добавить. А как? Есть два способа: через код и через админ панель. Разберемся с обоими.
Для начала как это делать через код. Есть большое количество методов, которые позволяют делать что угодно, я покажу несколько.
1. create()
doshik = Item.objects.create(name = "doshik", cost = 999, isSold = True, image = ...)
Теперь в переменной с соответствующим названием лежит наш новый продукт, все просто.
Если вдруг что, вы можете разить это на две строчки. Создайте экземпляр класса и примените посже к нему метод save(). На этом методов записи нам хватит, так-то их много.
2. get()
doshik = Item.objects.get(cost = 999)
Он позволяет получить объект по условию, но, важно понимать, что если количество таких объектов, что соответствуют условию, отлично от единицы, то вас пошлют с ошибкой, поэтому лучшее применение - поиск по айди.
3.get_or_create()
Не думаю, что тут нужны пояснения, просто получит из таблички, если нету, то создаст.
Но тут важно, что эта команда вернет кортеж из двух элементов, первый - объект, второй - был ли он создан.
4. filter()
Даст все элементы, которые соответствуют условиям.
notSold = Item.objects.filter(isSold = False)
Все продукты в наличии.
Хорошо, предпоследнее здесь будет то, что позволит редактировать бд прямо в браузере. В Джанго есть встроенная админ-панель.
Команда:
python manage.py createsuperuser
После этого вам предложат придумать пароль, зайдите на сайте по пути /admin. Вам нужно зайти в пользователя, вы открыли админ панель, но пока там почти ничего нет, нужно её настроить. Для этого есть admin.py
from django.contrib import admin
from .models import Item
admin.site.register(Item)
И всё, теперь можно ручками добавлять продукты.
Последнее - это создание отзывов. Модель отзыва должна содержать текст, автора, оценку, а главное, к какому товару он относится. Когда модели может быть сопоставлено несколько других это называется отношение один ко многим. То есть к одному продукту мы можем написать сколько угодно отзывов, но важно, что отзым относится только к одному продукту. Также существует отношение многие ко многим и один к одному.
Вот моя модель отзывов.