Серия «Python_get»

6

Котики и ForeignKey: как связать своих питомцев в Django

Когда коты начинают общаться между собой, они создают целые сообщества. А мы с тобой научимся строить такие же связи в базах данных!

⭐️ Что такое ForeignKey? Или как кот Мурзик нашёл свою миску

ForeignKey - это специальный тип поля в Django, который позволяет связать две модели между собой. Представь, что у нас есть два кота: Мурзик и Барсик. У каждого из них своя миска с едой. Чтобы каждый кот мог найти свою миску, мы создаём связь между ними.

✨ Как это работает?

Давайте разберёмся на пальцах (или лапках):

  • Когда ты создаёшь ForeignKey, ты говоришь базе данных: "Смотри, этот кот связан с этой миской"

  • Внутри Django происходит магия: создаётся специальное поле, которое хранит ID связанной записи

💡 От древних библиотек до современных баз данных

В стародавние времена, когда не было компьютеров, библиотекари использовали карточки для связи книг с их авторами. Теперь мы делаем то же самое, только цифровым способом!

📋 Примеры использования

Котики и ForeignKey: как связать своих питомцев в Django Python, Программирование, Обучение, Джанго, Длиннопост

🎯 Разные ситуации, или как Мурзик меняет миски

🌟 Создание записи

Котики и ForeignKey: как связать своих питомцев в Django Python, Программирование, Обучение, Джанго, Длиннопост

🌟 Получение данных

Котики и ForeignKey: как связать своих питомцев в Django Python, Программирование, Обучение, Джанго, Длиннопост

🌟 Обновление связи

Котики и ForeignKey: как связать своих питомцев в Django Python, Программирование, Обучение, Джанго, Длиннопост

💭 Типы поведения при удалении

CASCADE 🐾 - Если миску удаляют, кот тоже пропадает

PROTECT 🐾 - Защищает миску от удаления, если там есть кот

SET_NULL 🐾 - Если миску удалят, кот останется без неё

SET_DEFAULT 🐾 - При удалении миски кот получает стандартную

🤔 Знаешь, почему коты любят ForeignKey? Потому что он помогает им всегда находить свои миски! Остались ли у тебя вопросы о том, как связывать модели в Django, или всё так же ясно, как утренний луч солнца на миске с кормом?

А на канале https://t.me/pytonism мы рассмотрим связь many-to-many, заходите ;)

Показать полностью 4
11

Котики, файлы и pathlib: как не заблудиться в "котячьих" тропах файловой системы

Представьте , что ваша файловая система — это огромный лабиринт, где каждый файл и папка — это комната, а пути к ним — тропинки. Если вы не хотите, чтобы ваш код, как котёнок, заблудился в этом лабиринте, вам нужен надёжный проводник. И этим проводником станет pathlib!

О чём речь?

Когда вы только начинаете программировать, работа с файлами и директориями может казаться чем-то вроде попытки поймать хвост у бегающего кота. Вы знаете, что файлы где-то есть, но как до них добраться? Как создать новую папку? Как переименовать файл, не запутавшись в путях? Вот здесь на сцену выходит pathlib — библиотека Python, которая делает работу с файловой системой простой и интуитивно понятной.

Как раньше жили без pathlib?

Раньше программисты использовали модуль os.path для работы с путями. Это было как пытаться накормить кота с помощью вилки — возможно, но неудобно. В Python 3 появился pathlib, который превратил работу с путями в удовольствие. Теперь вы можете думать о путях как об объектах, а не как о строках, и это делает ваш код чище и понятнее.

Как работает pathlib? Проще, чем научить кота мяукать!

pathlib предоставляет классы для работы с путями файловой системы. Основной класс — Path. Он позволяет вам создавать, удалять, перемещать и проверять файлы и директории, не задумываясь о том, как правильно написать путь. Всё, что вам нужно, — это создать объект Path, и дальше он сам позаботится о деталях.

Котики, файлы и pathlib: как не заблудиться в "котячьих" тропах файловой системы Python, Программирование, Обучение, Длиннопост

Примеры использования: от простого к сложному

Создание директории

Допустим, вы хотите создать папку для хранения фотографий вашего кота. С pathlib это делается в одну строку:

Котики, файлы и pathlib: как не заблудиться в "котячьих" тропах файловой системы Python, Программирование, Обучение, Длиннопост

Переименование файла

Ваш кот случайно наступил на клавиатуру и создал файл с непонятным именем? Не беда:

Котики, файлы и pathlib: как не заблудиться в "котячьих" тропах файловой системы Python, Программирование, Обучение, Длиннопост

Поиск всех файлов с определённым расширением

Хотите найти все фотографии кота в формате .jpg? Легко:

Котики, файлы и pathlib: как не заблудиться в "котячьих" тропах файловой системы Python, Программирование, Обучение, Длиннопост

Чтение и запись файлов

Хотите записать, что ваш кот сегодня сделал? Используйте Path для работы с файлами:

Котики, файлы и pathlib: как не заблудиться в "котячьих" тропах файловой системы Python, Программирование, Обучение, Длиннопост

Перемещение по папкам вверх/вниз

Иногда нужно подняться на уровень выше или спуститься в подпапку. С pathlib это делается легко:

Котики, файлы и pathlib: как не заблудиться в "котячьих" тропах файловой системы Python, Программирование, Обучение, Длиннопост

Обход всего каталога и выдача списка всех файлов/папок

Хотите узнать, что лежит в папке? Используйте iterdir() для обхода всех элементов:

Котики, файлы и pathlib: как не заблудиться в "котячьих" тропах файловой системы Python, Программирование, Обучение, Длиннопост

Выделение в каталоге только каталогов (без файлов)

Если вам нужны только папки, используйте is_dir() для фильтрации:

Котики, файлы и pathlib: как не заблудиться в "котячьих" тропах файловой системы Python, Программирование, Обучение, Длиннопост

Удаление файла

Хотите удалить файл, который больше не нужен? С pathlib это делается одной командой:

Котики, файлы и pathlib: как не заблудиться в "котячьих" тропах файловой системы Python, Программирование, Обучение, Длиннопост

Удаление пустого каталога

Если папка пуста, её можно удалить с помощью rmdir():

Котики, файлы и pathlib: как не заблудиться в "котячьих" тропах файловой системы Python, Программирование, Обучение, Длиннопост

Удаление каталога с файлами

Если папка содержит файлы, сначала нужно удалить их, а затем саму папку. Для этого можно использовать shutil:

Котики, файлы и pathlib: как не заблудиться в "котячьих" тропах файловой системы Python, Программирование, Обучение, Длиннопост

Если вы дочитали до этого момента, то, скорее всего, уже представляете, как pathlib может упростить вашу жизнь. Но если у вас остались вопросы, например, как работать с путями на разных операционных системах или как рекурсивно обходить директории, не стесняйтесь спросить! 🐱‍👤

А на канале https://t.me/pytonism — новый пост, который рассматривает этот вопрос чуть шире. Переходите!)

Показать полностью 11
9

Котики и функции: как передать им вкусняшки правильно?

Функции в Python — это как кормление котиков: если не разобраться, кто и что ест, можно получить хаос. Сегодня мы разберёмся, как передавать параметры в функции, чтобы все котики остались довольны.

Функции — это основа программирования. Они позволяют нам не повторяться, структурировать код и делать его понятным. Но вот передача параметров в функции — это как раздать вкусняшки котикам: важно знать, кто что любит, чтобы не было обид. Давайте разберёмся, какие есть способы передать параметры, и как это работает.

Мы поговорим о:

  • 🐾 Позиционных параметрах (когда котик просто сидит на своём месте и ждёт вкусняшку).

  • 🐾 Именованных параметрах (когда котик сам говорит, что он хочет).

  • 🐾 *args и **kwargs (когда у вас целая стая котиков, и каждому нужно что-то своё).

  • 🐾 Распаковке параметров (когда вы приносите целый мешок вкусняшек и раздаёте их всем).

  • 🐾 Аннотациях (чтобы не перепутать, кому давать рыбку, а кому молоко).

Как это работает?

🐾 Позиционные параметры

Это самый простой способ. Вы передаёте параметры в том порядке, в котором они указаны в функции. Например:

Котики и функции: как передать им вкусняшки правильно? Python, Программирование, Обучение, Длиннопост

💡 Здесь "Барсик" — это cat_name, а "рыбку" — это food. Всё просто, но если перепутать порядок, получится что-то странное.

🐾 Именованные параметры

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

Котики и функции: как передать им вкусняшки правильно? Python, Программирование, Обучение, Длиннопост

💡 Порядок больше не важен, главное — указать, кто и что ест. Это удобно, если у функции много параметров.

🐾 *args — для стаи котиков

Иногда у вас есть много котиков, и вы не знаете заранее, сколько их будет. Тогда на помощь приходит *args:

Котики и функции: как передать им вкусняшки правильно? Python, Программирование, Обучение, Длиннопост

💡 *args собирает все переданные параметры в кортеж. Это как мешок с вкусняшками, который вы раздаёте всем подряд.

🐾 **kwargs — для капризных котиков

А что если каждый котик хочет что-то своё? Тогда используем **kwargs:

Котики и функции: как передать им вкусняшки правильно? Python, Программирование, Обучение, Длиннопост

💡 **kwargs собирает все именованные параметры в словарь. Теперь каждый котик получает то, что он хочет.

🐾 Распаковка параметров

Иногда у вас уже есть список или словарь с данными, и вы хотите передать их в функцию. Для этого используется распаковка:

Котики и функции: как передать им вкусняшки правильно? Python, Программирование, Обучение, Длиннопост

💡 Звёздочки (* и **) помогают развернуть список или словарь в отдельные параметры.

🐾 Аннотации — чтобы не перепутать вкусняшки

Аннотации позволяют указать, какого типа должны быть параметры и возвращаемое значение. Это как наклейки на банках с едой: "рыбка", "молоко", "курочка".

Котики и функции: как передать им вкусняшки правильно? Python, Программирование, Обучение, Длиннопост

💡 Аннотации не влияют на выполнение кода, но помогают вам и другим программистам понять, что ожидать.

Заходите на https://t.me/pytonism — там есть, что ещё почитать и порешать ;)

Показать полностью 6
8

Django: Магия Python для создания веб-приложений

Если Python — это ваш верный меч, то Django — это зачарованный щит, который защищает ваш код и делает его мощнее. Django — это высокоуровневый фреймворк для создания веб-приложений на Python. Он позволяет быстро и эффективно разрабатывать сложные проекты, не изобретая велосипед. Django следует принципу DRY (Don’t Repeat Yourself) и предлагает множество встроенных инструментов для работы с базами данных, аутентификацией, маршрутизацией и многим другим.

Но настоящая магия Django скрывается в его командной строке. Файл manage.py — это ваш волшебный жезл, который помогает управлять проектом. Давайте разберёмся, какие команды он предлагает и как они могут сделать вашу жизнь проще.

🧙‍♂️ Список команд manage.py с комментариями

Django: Магия Python для создания веб-приложений Python, Программирование, Обучение, Джанго, Длиннопост

🐱‍💻 Вопрос на засыпку

Допустим, вы создали новый проект Django, добавили несколько приложений и настроили базу данных. Но вдруг вы понимаете, что забыли, какую команду использовать для создания суперпользователя. Как вы думаете, какую команду нужно ввести, чтобы вспомнить все доступные команды 'manage.py'? 🤔

А ещё больше интересного можно почитать на канале https://t.me/pytonism. Приходите! )

Показать полностью 1
7

Котики и типы данных: как выбрать правильную миску для молока?

Когда вы начинаете программировать, выбор правильного типа данных может быть таким же сложным, как выбор миски для вашего кота. Если миска слишком маленькая, молоко разольётся. Если слишком большая, котик может утонуть в своих размышлениях. Сегодня мы поговорим о менее очевидных типах данных в Python и о том, как их использовать, чтобы ваш код был элегантным, как кошачья походка.

О чём речь?

Python — это язык, который предлагает множество встроенных типов данных. Мы все знаем про int, float, str и list. Но что насчёт таких типов, как frozenset, complex, или даже bytearray? Эти ребята часто остаются в тени, как коты, которые прячутся под диваном. Давайте вытащим их на свет и разберёмся, как они могут быть полезны.

Как работает?

🐾 1. Frozenset: замороженный котик

frozenset — это неизменяемая версия set. Представьте, что у вас есть кот, который обожает гоняться за лазерной указкой. Но иногда вам нужно, чтобы он замер на месте, чтобы не разрушить вашу комнату. Вот так же работает frozenset: он фиксирует элементы, чтобы их нельзя было изменить.

Котики и типы данных: как выбрать правильную миску для молока? Python, Программирование, Обучение, Длиннопост

Используйте frozenset, когда вам нужно хранить уникальные элементы, которые не должны изменяться, например, ключи в словаре.

🐾 2. Complex: коты в четырёх измерениях

Комплексные числа (complex) — это числа с реальной и мнимой частью. Если ваш котик вдруг решил изучать квантовую физику, этот тип данных ему точно пригодится.

Котики и типы данных: как выбрать правильную миску для молока? Python, Программирование, Обучение, Длиннопост

Комплексные числа полезны в научных вычислениях, например, для работы с электрическими цепями или моделирования волн.

🐾 3. Bytearray: котик в шубке из байтов

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

Котики и типы данных: как выбрать правильную миску для молока? Python, Программирование, Обучение, Длиннопост

bytearray полезен для работы с бинарными данными, например, при обработке изображений или файлов.

Примеры использования в различных ситуациях

🐾 Frozenset в реальной жизни:

Представьте, что вы пишете приложение для управления библиотекой. У вас есть набор жанров книг, которые не должны изменяться. Используйте frozenset для их хранения.

🐾 Complex для моделирования:

Если вы разрабатываете игру, где нужно моделировать движение объектов в пространстве, комплексные числа могут помочь вам описать траектории.

🐾 Bytearray для оптимизации:

При работе с сетевыми протоколами или сжатиями данных bytearray позволяет эффективно управлять памятью.

Как видите, выбор правильного типа данных — это как выбор правильной миски для вашего кота. Если вы понимаете, что нужно вашему пушистому другу (или вашему коду), вы сможете сделать его жизнь (и свою) намного проще.

А теперь вопрос к вам, друзья: какой из этих типов данных вы уже использовали, а какой хотите попробовать? Напишите в комментариях! 🐾

А на канале https://t.me/pytonism мы рассмотрим, как работает bytearray. Переходите и читайте ;)

Показать полностью 3
6

Котики-деклараторы и котики-императоры: как программировать с размахом и изяществом

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

О чём речь?

Когда ты пишешь код, ты можешь либо говорить компьютеру, что ты хочешь получить, либо объяснять ему, как именно это сделать. Это и есть разница между декларативным и императивным подходами.

Декларативный подход: ты описываешь, что должно быть сделано, не вдаваясь в детали, как это сделать. Например, "Хочу, чтобы миска была полной".

Императивный подход: ты описываешь пошагово, как достичь результата. Например, "Открой шкаф, достань корм, насыпь его в миску".

Как это работает?

🐾 Императивный подход

Императивный код — это как инструкция для робота. Ты говоришь ему, что делать на каждом шаге. Например, если ты хочешь отсортировать список чисел, ты пишешь алгоритм сортировки.

Котики-деклараторы и котики-императоры: как программировать с размахом и изяществом Python, Программирование, Обучение, Длиннопост

Комментарий: Здесь мы пошагово объясняем компьютеру, как именно сортировать список. Это как если бы ты учил кота ловить мышь: "Сначала подкрадись, потом прыгни, потом схвати".

🐾 Декларативный подход

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

Котики-деклараторы и котики-императоры: как программировать с размахом и изяществом Python, Программирование, Обучение, Длиннопост

Комментарий: Здесь ты просто говоришь: "Отсортируй мне список", и Python делает всю грязную работу за тебя. Это как если бы кот сам нашел мышь и принес её тебе.

Преимущества и недостатки

🐾 Императивный подход

✅ Плюсы:

  • Полный контроль над процессом.

  • Подходит для сложных алгоритмов, где важна каждая деталь.

❌ Минусы:

  • Код может быть длинным и сложным.

  • Требует больше времени на написание и отладку.

🐾 Декларативный подход

✅ Плюсы:

  • Код проще и короче.

  • Легче читать и понимать.

❌ Минусы:

  • Меньше контроля над процессом.

  • Зависимость от библиотек и встроенных функций.

Когда какой подход применять?

🐾 Императивный подход:

  • Когда тебе нужно полный контроль над процессом.

  • Когда ты пишешь сложные алгоритмы или работаешь с низкоуровневыми задачами.

🐾 Декларативный подход:

  • Когда важен результат, а не процесс.

  • Когда ты работаешь с высокоуровневыми задачами, например, с базами данных или веб-разработкой.

Примеры из жизни

🐾 Императивный котик: Ты хочешь, чтобы кот прыгнул на диван. Ты показываешь ему, как это сделать: "Сначала подойди к дивану, потом подпрыгни, потом сядь".

🐾 Декларативный котик: Ты просто кладешь на диван его любимую игрушку, и он сам туда прыгает.

А ты больше любишь контролировать процесс или доверяешь магии встроенных функций? Напиши в комментариях! 🐾

А на канале https://t.me/pytonism вышел материал о том, как создавать и удалять файлы, обходить каталоги и много чего ещё делать с помощью библиотеки pathlib. Переходите и читайте!)

Показать полностью 2
6

Котики-документаторы: как научить код говорить на человеческом языке

Котики-документаторы: как научить код говорить на человеческом языке Python, Программирование, Обучение, Длиннопост

#коик документирует чертежи :)

Представьте, что ваш код — это кот. Он милый, пушистый, но иногда ведёт себя так, будто вы для него — просто обслуживающий персонал. Вы хотите, чтобы он объяснял свои действия, а не просто мяукал в пустоту? Тогда вам нужны doc-strings!

Doc-strings — это как записки, которые ваш кот оставляет вам, чтобы вы знали, почему он сбросил вазу с полки или зачем он сидит на клавиатуре. Это текстовые комментарии внутри кода, которые помогают вам (и другим разработчикам) понять, что происходит.

О чём речь?

Когда вы пишете код, важно не только заставить его работать, но и сделать его понятным. Doc-strings — это способ документировать функции, классы и модули, чтобы объяснить, что они делают, как их использовать и зачем они вообще существуют. Это как инструкция к вашему коту: "Если он мяукает три раза, значит, хочет есть. Если один раз — просто привлекает внимание".

Как это работает?

Doc-strings — это строки текста, которые вы пишете сразу после определения функции, класса или модуля. Они заключаются в тройные кавычки (""") и могут быть многострочными. Python умеет их читать и даже выводить через функцию help().

Пример:

Котики-документаторы: как научить код говорить на человеческом языке Python, Программирование, Обучение, Длиннопост

🐾 Что здесь происходит?

  • """ — открываем doc-string.

  • Внутри описываем, что делает функция feed_cat.

  • Указываем аргументы (Args) и их типы.

  • Описываем, что возвращает функция (Returns).

Теперь, если кто-то (или вы сами через полгода) захочет понять, что делает эта функция, достаточно вызвать help(feed_cat).

Зачем это нужно?

  1. 🐾 Для себя: Через месяц вы забудете, зачем написали этот код. Doc-strings помогут вспомнить.

  2. 🐾 Для команды: Ваши коллеги не будут тратить часы, пытаясь понять, что делает ваш код.

  3. 🐾 Для пользователей: Если вы пишете библиотеку, doc-strings — это ваша документация.

Примеры использования в разных ситуациях

🐾 Пример 1: Документируем класс

Котики-документаторы: как научить код говорить на человеческом языке Python, Программирование, Обучение, Длиннопост

🐾 Пример 2: Документируем модуль

Котики-документаторы: как научить код говорить на человеческом языке Python, Программирование, Обучение, Длиннопост

Doc-strings появились в Python с самого начала, потому что Гвидо ван Россум (создатель Python) хотел, чтобы код был читаемым и понятным. Это как если бы он сказал: "Код без документации — это как кот без хвоста. Вроде работает, но что-то не так".

Алгоритм написания doc-strings

  1. 🐾 Определите, что делает ваш код. Представьте, что объясняете это другу.

  2. 🐾 Опишите входные данные. Какие аргументы принимает функция? Какие типы данных?

  3. 🐾 Опишите результат. Что возвращает функция? Какой тип данных?

  4. 🐾 Будьте краткими, но информативными. Не пишите роман, но и не ограничивайтесь "эта функция делает что-то".

🐾 Всё ли понятно? Или ваш внутренний котик всё ещё недоволен и хочет больше примеров? Напишите, если остались вопросы, и я с радостью помогу!

И, конечно же, заходите на канал https://t.me/pytonism за задачами и не только)

Показать полностью 4
5

Код, как кот: модули и пакеты для уютного программирования

Код, как кот: модули и пакеты для уютного программирования Python, Программирование, Обучение, Модуль, Пакет, Длиннопост

Картинка с милым котиком

Представьте, что ваш код — это кот. Если вы не организуете его пространство, он начнёт разбрасывать свои игрушки (функции и переменные) по всему дому (вашему проекту). Чтобы коту было комфортно, а вам — удобно, нужно создать уютные уголки: модули и пакеты.

Сегодня мы разберёмся, как организовать код в Python, чтобы он был понятным, структурированным и не превращался в хаос.

О чём речь?

Когда ваш проект становится больше, чем один файл, возникает вопрос: как всё это организовать? Модули и пакеты — это инструменты, которые помогают структурировать код, чтобы он был читаемым, переиспользуемым и лёгким в поддержке.

Как это работает?

Модуль — это просто файл с кодом Python, который можно импортировать. Например, файл cat.py с функцией meow() — это уже модуль.

Пакет — это папка с модулями, в которой есть файл __init__.py. Этот файл говорит Python: "Эй, это не просто папка, это пакет!"

Представьте, что у вас есть кот по имени Барсик. У Барсика есть игрушки: мячик, мышка и лазерная указка. Если вы просто бросите их в одну кучу, Барсик запутается. Но если вы разложите игрушки по коробкам (модулям), а коробки поставите в шкаф (пакет), то Барсик будет счастлив. И вы тоже.

Алгоритм организации кода

  1. 🐾 Разделите функциональность: каждый модуль должен отвечать за свою задачу. Например, один модуль для работы с базой данных, другой — для обработки данных.

  2. 📦 Создайте пакеты: объедините модули в пакеты, если они связаны общей темой.

  3. 🗂 Используйте `__init__.py`: настройте импорт внутри пакета.

  4. 🛠 Импортируйте правильно: используйте относительный или абсолютный импорт, чтобы избежать путаницы.

Cоздаём проект для котиков

Допустим, вы пишете приложение для управления котами. У вас есть три основные задачи:

  • Управление информацией о котах.

  • Игры с котами.

  • Кормление котов.

Создадим структуру проекта:

Код, как кот: модули и пакеты для уютного программирования Python, Программирование, Обучение, Модуль, Пакет, Длиннопост

info.py — модуль для работы с информацией о котах.

play.py — модуль для игр.

feed.py — модуль для кормления.

Код в модулях

1. Модуль info.py:

Код, как кот: модули и пакеты для уютного программирования Python, Программирование, Обучение, Модуль, Пакет, Длиннопост

2. Модуль play.py:

Код, как кот: модули и пакеты для уютного программирования Python, Программирование, Обучение, Модуль, Пакет, Длиннопост

3. Модуль feed.py:

Код, как кот: модули и пакеты для уютного программирования Python, Программирование, Обучение, Модуль, Пакет, Длиннопост

Как использовать?

В файле main.py мы можем импортировать модули и использовать их функции:

Код, как кот: модули и пакеты для уютного программирования Python, Программирование, Обучение, Модуль, Пакет, Длиннопост

Почему это важно?

🐾 Организация кода с помощью модулей и пакетов:

  • Делает проект понятным.

  • Упрощает поиск ошибок.

  • Позволяет переиспользовать код.

  • Уменьшает вероятность конфликтов имён.

Было ли полезно? Как вы организуете свои проекты? Напишите в комментариях! 🐾

Показать полностью 6
Отличная работа, все прочитано!