Python3000
36 subscribers
3 photos
4 files
6 links
Задачи, решения,библиотеки,и т.д.

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

Мои соц:
Дзен- dzen.ru/py3000
Download Telegram
Ухты, кто то канал смотрит), ладно
👎2🔥1🍌1
За целых 15 минут я сделал рабочую анимацию, так то она работает очень просто, в каждом объекте есть функция update куда я передаю количество кадров, и в зависимости от них я прокручиваю кадры)))
🔥2
score - количество кадров с начала работы(понятно что по модулю 10^6)
Сегодня написал скрипт получения горизонтального направления, считывая нажатия стрелочек и добавил классу Sprite(это тот, который отвечает за каринку, соответствующую объекту) функцию, которая разворачивает изображение)
🔥2
Задача:
Аня идет по лестнице, каждый шаг она выбирает действие
1. Если ноги у неё на одной ступеньке, шагнуть левой ногой, сложность шага должна быть не больше l1.
2. Если ноги у неё на одной ступеньке, она может шагнуть правой ногой, сложность шага не должна превышать r1.
3.Если ноги у Ани на разных ступеньках, она может поставить одну ногу рядом с другой.
4. Если ноги у Ани на разных ступеньках, она может шагнуть той ногой, которая ниже, ставит её на ступеньку рядом с предыдущей и шагает не более чем на r2 или l2 для правой и левой ноги соответственно. Это происходит за одно действие

Вам даны высоты ступенек, их количество, l1, r1, l2, r2.
Найдите за какое минимальное число шагов обе ноги окажутся на верхней ступеньке.
Задачу придумал, конечно, не я
Всем здравствуйте, хочу пожелать удачи всем, кто идет сегодня на Олимпиаду по информатике.

Пожалуй один из наиболее обширных алгоритмов - динамика(ну вариаций ±∞) . Мы помним что она бывает двумерной или трёхмерной, а может и одномерной. А так еще важно помнить, что проход по двумерному массиву будет стоить вам произведение его длин, будьте осторожны с двумерной динамикой) Также не забываем про логарифм, это хорошая сложность. Получить её можно, например, используя meet in middle. Ну это как в сортировке слиянием у вас сортируются половинки, а потом их объединение, тут нужно не забыть, что логарифм умножится на сложность на кусочке.

Думаю не нужно объяснять, что писать сортировку на Олимпиаде не нужно, прекрасный c++ умеет сортировать с заданным алгоритмом. В sort есть третий аргумент - функция по которой он определяет что больше другого, она должна принимать два аргумента, возвращать true/false. Хорошо, это неплохо. Замечу, что на Олимпиаде 99% будут графы, DFS и BFS вам в помощь. Это алгоритмы обхода графов, их написание есть тут выше). Не думаю что на муниципе вам попадется Дейкстра какой-нибудь) . Мы не забываем, что существуют жадные алгоритмы, и они иногда работают. Не надо в первой задаче применять три бинпоиска по динамике и после этого получить граф решений по которому надо пройтись.


Даамс, получилось объемнее обычной лекции... Всем удачи)
Расскажите что вам показалось самым сложным, можете ещё что-то рассказать про тур
Всем "Hello". Сегодня я хочу рассказать про то, что все использовали хотя бы раз, но, возможно, не знают что это, и как это работает.

Рассмотрим задачу, мы делаем фреймворк и хотим, чтобы мы могли брать код пользователя и его использовать. Например, хотим взять функцию, которая была им написана, и изменить её так, чтобы к её выводу добавилось её название, список аргументов и что то ещё. С этим нам помогут ДЕКОРАТОРЫ.

Декораторы - просто функции, но они принимают как аргумент функцию и возвращают функцию). Рассмотрим пример(мб понятнее станет).
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 микросервисы больше не актуален), то напишите об этом в комментариях.

Хорошо, что-то я вам много наобещал, а мы так и ничего не сделали. Начнем, как и любую библиотеку, нам нужно её установить, пишем:
pip install django

Успех, теперь создадим сам проект, напишем ещё:
django-admin startproject name_of_your_project

Логично, туда нужно подставить название вашего проекта.

После этого у вас создастся папка с названием вашего проекта, а внутри ещё одна и файлик manage.py. Он нам понадобится ещё много раз, например, прямо сейчас.
python manage.py runserver

После выполнения запуститься локальный сервер(это ещё один плюс Джанго), перейдите на адрес, который он вам дал(обычно это localhost:8000). Вы должны увидеть сообщение приветствия. У нас хорошая статистика, пока 0 строчек кода.

На этом пока что хватит, в этом курсе я не буду давать ДЗ, вы можете просто написать, что мол у меня получилось или у меня ошибка.
🔥3
Продолжим, мы создали проект, давайте посмотрим что у нас есть. В файле settings.py, логично, настройки, есть настройки языка, дебаг, настройки каталогов, файл urls.py отвечает за различные страницы сайта. Хорошо, любой сайт состоит из apps(приложений), например, мы можем создать приложение каталога товаров, оформления заказов и панели администратора. Создадим первое приложение.
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/. То есть мы как бы задали то, откуда начинается наше приложение.

Теперь, если вы откроете в адресной строке этот путь то вы увидите текст.

Оставлю вас пока с этим, удачи!
А чисто теоретически, это кто-то читает?
👍7
Я вернулся, продолжим.
Теперь, давайте разберемся с базой данных.

Джанго поддерживает практически все существующие базы данных, по умолчанию там стоит файловая 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)

И всё, теперь можно ручками добавлять продукты.

Последнее - это создание отзывов. Модель отзыва должна содержать текст, автора, оценку, а главное, к какому товару он относится. Когда модели может быть сопоставлено несколько других это называется отношение один ко многим. То есть к одному продукту мы можем написать сколько угодно отзывов, но важно, что отзым относится только к одному продукту. Также существует отношение многие ко многим и один к одному.
Вот моя модель отзывов.
class Review(models.Model):
item = models.ForeignKey(
'Item',
on_delete=models.CASCADE,
related_name='reviews',
verbose_name='Товар'
)
author = models.CharField(
max_length=100,
verbose_name='Имя автора'
)
text = models.TextField(
verbose_name='Текст отзыва'
)
rating = models.IntegerField()

ForeignKey как раз отвечает за то, что каждому отзыву сопоставляется продукт, к которому он относится.

Пока так, в следующий раз сделаем уже что-то красивое.
Штош, как я и обещал, что-то красивое.
Давайте добавим сам сайт. Для гибкой настройки того, что отправляется пользователю, есть система шаблонов, которые мы будем использовать. И да, мы будем использовать язык разметки HTML, таблицы стилей и JavaScript пока не трогаю, но если вы хотите в рамках курса гайд по ним, я могу сделать, заодно мы получим красивую страничку. Пишите в комментарии!

Так вот, давайте создадим папочку templates в папку нашего проекта, там мы будем размещать все наши шаблоны. Но, чтобы это сработало, нам нужно сходить в файл настроек и добавить одну строчку.
TEMPLATES = [
{
#...
'DIRS': [
os.path.join(PROJECT_ROOT,'templates')
],
#...
},

]

Супер, теперь, давайте создадим стандартный шаблон, то есть такой, какой ляжет в основу всех страниц. Например там может быть стандартный вид сайта, хеддер(это менюшка сверху для навигации по сайту), подвал(там где пишут телефон техподдержки и ссылки на доки). Назовем файл base.html и положим в папку шаблонов.
<!DOCTYPE html>
<html>
<head>
<title>{% block title %}Shop{% endblock %}</title>
</head>
<body>
Здесь вы можете разместить,например,хеддер
{% block content %}{% endblock %}
</body>
</html>

Так вот, это конструкции шаблонизатора, мы можем в отдельном шаблоне задать то, что Джанго поставит вместо каждого блока, поэтому, если мы хотим сделать страницу товара и каталога, нам бы не пришлось копировать код во все файлы, а если вы захотели подправить хеддер, то его не придется менять везде, он изменится автоматически. Давайте напишем страницу-каталог. Создадим в папке шаблонов папку с названием нашего приложения. Там мы и будем хранить шаблоны нашего приложения. Создадим файл shop.html
{% extends 'base.html' %}
{% block title %}Каталог товаров{% endblock %}

{% block content %}
Lorem Ipsum...
{% endblock %}

Пока тут просто заглушки, но давайте сделаем, чтобы мы их видели при загрузке.
Для этого нам потребуется уже известный views.py. Откроем, и изменим код
from django.shortcuts import render

def index(request):
return render(request,'shop/shop.html')

Вот, теперь если мы запустим сервер, то увидим то, что у нас отображается наша заглушка в виде текста. А что, собственно произошло? Джанго render нашёл по пути шаблон, он ссылается на базовый шаблон, в базовом шаблоне два блока. Шаблонизатор заменяет блоки на то, что написано в шаблоне, который мы написали последним. Успех, осталось всего лишь то отобразить список. Кстати, если что, в исходном коде страницы нет и следа того, что мы использовали шаблоны.

Ну, хорошо, нам нужно же из базы данных получить все это добро и на страницу вывести. Давайте это и сделаем, для этого идем во views.py
from django.shortcuts import render
from .models import Item

def index(request):
products_list = Item.objects.order_by('-cost')
return render(request,'shop/shop.html', {'items': products_list})

Во-первых появился order_by, он, логично, сортирует наши элементы, знак "-" перед параметром означает, что я буду сортировать в обратном порядке. И третий аргумент render. Он указывает контекст, то есть то, что мы даем шаблонизатору, сейчас мы это используем.
Возвращаемся к нашему шаблону
{% extends 'base.html' %}
{% block title %}Каталог товаров{% endblock %}

{% block content %}
{% for a in items %}
<a href = "#">{{a.name}}</a>
{% endfor %}
{% endblock %}

Вот, теперь у нас есть список продуктов сверху вниз. И, пока я на этом закончу, жду ваших комментариев, хотите ли вы отдельный урок по языку разметки и таблицам стилей, а то пока наш сайт всё ещё выглядит грустным.
Да, а вам нужен отдельный урок по HTML, CSS, для создания красивых страниц?
Anonymous Poll
93%
Да
7%
Нет
Супер, я вернулся. Вы хотели увидеть как кодить красивые страницы. Этот урок будет посвящён HTML и CSS. Это самая база, так как, конечно, сейчас появилось куча языков, которые типо лучше чем эти и они компилируются прямо в них, например SCSS. А кроме того есть еще третий язык - JavaScript, но про него стоит делать отдельный пост. Поэтому в этом уроке будет самая база.

Начнем с языка разметки HTML. Он нужен для того, чтобы создавать кнопки, надписи, таблицы и тп. Его синтаксис строится на тегах, теги бывают двух видов:парные и одиночные. Парные теги выглядят в общем случае вот так:
<...></...>

Вместо многоточия стоит название тега. Часть тега без слэша называется открывающая, а вторая, соответственно, закрывающая. Одиночный тег пишется только открывающейся частью. У тегов могут быть параметры, они указываются в открывающейся части. Например:
<a href="google.com">Текст ссылки</a>

Это тег ссылки, он имеет один параметр - адрес ссылки. Между первой и второй частями идет текст ссылки. Вот несколько тегов, которые стоит знать:
<h1>Текст заголовка</h1> - заголовок,чембольше цифра в имеги тега,тем меньше текст.
<p>Текст параграфа</p> - тег параграфа.
<div>Другие теги</div> - один из важнейших тегов, может содержать в себе другие,используетсякак контейнер.
<b>Текст</b> - делает текст жирным.
<em>Текст</em> - курсив.
<html>Теги</html> - обязательный тег,который содержит в себе все теги страницы.
<head></head> - обязательный тег,которыйсодержит в основном мета информацию о странице.
<body></body> - обязательный тег,который содержит в себе элементы,которыеотображаются на страгице.
<img src = ""> - вставляет картинку.

Окей, допустим, пока хватит, давайте напишем первую страничку. В файле index.html можем написать:
<!DOCTYPE html> <!-- обязательный тег,обьявляеттип документа -->
<html>
<head>
<title>Имя страницы</title>
</head>
<body>
<h1>Первая страница!</h1>
</body>
</html>

Вот, если вы откроете этот файл в браузере, то вы увидите надпись, Ура!)
Теперь вы можете просто добавлять любые теги в тело(тег body) и они будут появляться у вас на сайте. Окей, но пока всё выглядит, мягко говоря, уныло, просто элементы в столбик, на сайт apple это не похоже. Для этого нам понадобится таблица стилей.
Допишем в тег head указание на таблицу стилей.
<link rel="stylesheet" href="">

В href напишите путь к файлу с расширением css. Например, можем создать файл style.css.
Синтаксис этого языка выглядит так: указатель на объект, в фигурных скобках через точки с запятой названия стилей, и через двоеточие значение. Пример:
h1{
color: red;
font-family: arial;
}

Тут я для всех тегов h1 сказал, что их писать красным цветом с таким шрифтом. Но, допустим, что я не хочу задавать всем заголовкам один и тот же стиль. Тогда есть две идеи, во-первых, если мне нужно одному конкретному элементу задать стиль, например кнопке. Тогда есть атрибут id у каждого тега. Задав его можно стиль задать для объекта с помощью решётки, после неё должнен стоять id и дальше по стандарту
#firth{
color: red;
font-family: arial;
}

Также есть класс, один и тот же класс можно задать к большому числу объектов, и также как с айди, только вместо решётки нужно поставить точку, можно задавать стили.

Стилей очень много, так что вот основные, но их все можно на гуглить, потом найдете сами.
width - ширина элемента,можноуказывать в px
height - высота
color - цвет,длятекста это обычно цвет самого текста
background-color - цвет заднего фона
font-size - размер текста
margin - отступ снаружи
padding - отступ изнутри

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