From 9d5e5015027a94d693c7788c901ae75f2ee9f46a Mon Sep 17 00:00:00 2001 From: Aleksandr Minkin Date: Wed, 2 Sep 2026 23:08:52 +0300 Subject: [PATCH 1/3] refactor(content): add educational metadata and page standard --- CONTRIBUTING.md | 15 ++++ components/ui/Callout.tsx | 20 +++-- components/ui/CodeBlock.tsx | 21 ++++- components/ui/CodeBlockClient.tsx | 2 +- components/ui/CollapsibleCode.tsx | 17 ++++ components/ui/Figure.tsx | 13 +++ components/ui/SelfCheck.tsx | 13 +++ docs/ai/index.mdx | 2 - docs/ai/notebook-03-metrics-and-knn.mdx | 46 ++++++++++ docs/algorithms/content-standard.mdx | 89 +++++++++++++++++++ docs/algorithms/index.mdx | 1 + docs/bigdata/index.mdx | 2 - docs/bigdata/practice-01-introduction.mdx | 46 +++++++++- docs/java/task-15-mvc-pattern.mdx | 61 ++++++++++++- lib/content-manifest.ts | 6 ++ lib/markdown.ts | 15 +++- lib/mdx.ts | 8 +- public/search-index.json | 2 +- scripts/content-manifest.mjs | 32 ++++++- .../__tests__/content-schema.test.mjs | 59 ++++++++++++ scripts/content-schema.mjs | 15 +++- styles/docs.css | 24 ++++- 22 files changed, 484 insertions(+), 25 deletions(-) create mode 100644 components/ui/CollapsibleCode.tsx create mode 100644 components/ui/Figure.tsx create mode 100644 components/ui/SelfCheck.tsx create mode 100644 docs/algorithms/content-standard.mdx create mode 100644 scripts/content-quality/__tests__/content-schema.test.mjs diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 03edd93..d43ed17 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -34,6 +34,21 @@ order: 1 --- ``` +При необходимости добавьте тип (`theory`, `practice`, `notebook`, `guide`, `reference`), теги, сложность, дату обновления, ожидаемое время и статус: + +```yaml +type: practice +tags: + - Java + - MVC +difficulty: intermediate +updatedAt: 2026-09-02 +estimatedMinutes: 20 +status: published +``` + +Статусы `draft`, `published` и `archived` позволяют управлять жизненным циклом страницы. Черновики не попадают в production manifest. Подробная структура страницы описана в [стандарте учебного материала](./docs/algorithms/content-standard.mdx). + Вместо `order` можно использовать `sidebar_position`. Для нового учебного трека добавьте запись в `lib/tracks.json` и индексную страницу `docs//index.mdx`. Хороший материал: diff --git a/components/ui/Callout.tsx b/components/ui/Callout.tsx index 731908b..6c90085 100644 --- a/components/ui/Callout.tsx +++ b/components/ui/Callout.tsx @@ -1,22 +1,32 @@ import type { ComponentType, ReactNode } from "react"; -import { AlertTriangle, Info, Lightbulb, NotebookPen } from "lucide-react"; +import { AlertTriangle, BadgeAlert, Info, Lightbulb, NotebookPen } from "lucide-react"; import { cn } from "@/lib/utils"; -type CalloutType = "info" | "warning" | "tip" | "note"; +type CalloutType = "info" | "warning" | "tip" | "note" | "important"; const icons = { info: Info, warning: AlertTriangle, tip: Lightbulb, - note: NotebookPen + note: NotebookPen, + important: BadgeAlert } satisfies Record>; const classes: Record = { info: "border-primary/20 bg-primary/5", warning: "border-foreground/20 bg-foreground/5", tip: "border-primary/10 bg-primary/5", - note: "border-border bg-muted/70" + note: "border-border bg-muted/70", + important: "border-primary/30 bg-primary/10" +}; + +const labels: Record = { + info: "Информация", + warning: "Предупреждение", + tip: "Совет", + note: "Заметка", + important: "Важно" }; interface CalloutProps { @@ -31,7 +41,7 @@ export function Callout({ type = "info", children }: CalloutProps) {
- {type} + {labels[type]}
{children}
diff --git a/components/ui/CodeBlock.tsx b/components/ui/CodeBlock.tsx index 25ebd67..02dcfca 100644 --- a/components/ui/CodeBlock.tsx +++ b/components/ui/CodeBlock.tsx @@ -7,6 +7,7 @@ interface CodeBlockProps { code: string; lang?: string; filename?: string; + highlight?: string; } const highlight = cache(async (code: string, lang: string) => { @@ -21,8 +22,24 @@ const highlight = cache(async (code: string, lang: string) => { }); }); -export async function CodeBlock({ code, lang = "text", filename }: CodeBlockProps) { - const html = await highlight(code, lang); +function parseHighlightedLines(value?: string) { + const lines = new Set(); + for (const part of value?.split(",") ?? []) { + const [start, end = start] = part.trim().split("-").map(Number); + if (!Number.isInteger(start) || !Number.isInteger(end)) continue; + for (let line = start; line <= end; line += 1) lines.add(line); + } + return lines; +} + +export async function CodeBlock({ code, lang = "text", filename, highlight: highlightValue }: CodeBlockProps) { + let html = await highlight(code, lang); + const highlightedLines = parseHighlightedLines(highlightValue); + let lineNumber = 0; + html = html.replace(//g, (value) => { + lineNumber += 1; + return highlightedLines.has(lineNumber) ? '' : value; + }); return ; } diff --git a/components/ui/CodeBlockClient.tsx b/components/ui/CodeBlockClient.tsx index 69bea1a..25bae27 100644 --- a/components/ui/CodeBlockClient.tsx +++ b/components/ui/CodeBlockClient.tsx @@ -31,7 +31,7 @@ export function CodeBlockClient({ code, html, filename, language }: CodeBlockCli {filename ?? language ?? "фрагмент"}
diff --git a/components/ui/CollapsibleCode.tsx b/components/ui/CollapsibleCode.tsx new file mode 100644 index 0000000..2e921d5 --- /dev/null +++ b/components/ui/CollapsibleCode.tsx @@ -0,0 +1,17 @@ +import { CodeBlock } from "@/components/ui/CodeBlock"; + +interface CollapsibleCodeProps { + code: string; + lang?: string; + filename?: string; + summary?: string; +} + +export async function CollapsibleCode({ code, lang = "text", filename, summary = "Показать полный код" }: CollapsibleCodeProps) { + return ( +
+ {summary} +
+
+ ); +} diff --git a/components/ui/Figure.tsx b/components/ui/Figure.tsx new file mode 100644 index 0000000..a6bb23b --- /dev/null +++ b/components/ui/Figure.tsx @@ -0,0 +1,13 @@ +import Image from "next/image"; + +interface FigureProps { + src: string; + alt: string; + caption?: string; + width: number; + height: number; +} + +export function Figure({ src, alt, caption, width, height }: FigureProps) { + return
{alt}{caption ?
{caption}
: null}
; +} diff --git a/components/ui/SelfCheck.tsx b/components/ui/SelfCheck.tsx new file mode 100644 index 0000000..a8d96d2 --- /dev/null +++ b/components/ui/SelfCheck.tsx @@ -0,0 +1,13 @@ +interface SelfCheckItem { + question: string; + answer: string; +} + +export function SelfCheck({ questions }: { questions: SelfCheckItem[] }) { + return ( +
+

Проверь себя

+
{questions.map((item, index) =>
{index + 1}. {item.question}

{item.answer}

)}
+
+ ); +} diff --git a/docs/ai/index.mdx b/docs/ai/index.mdx index 7f299a9..1bb9ec1 100644 --- a/docs/ai/index.mdx +++ b/docs/ai/index.mdx @@ -5,8 +5,6 @@ order: 1 author: minkinad --- -# AI - обзор - Раздел объединяет 8 рабочих тетрадей по дисциплине «Искусственный интеллект», перенесенных в MDX-формат. Материалы идут от базового Python и научных библиотек к классическим ML-методам, нейросетям, эволюционным алгоритмам и кластеризации. ## Что внутри diff --git a/docs/ai/notebook-03-metrics-and-knn.mdx b/docs/ai/notebook-03-metrics-and-knn.mdx index e39fe8f..d477775 100644 --- a/docs/ai/notebook-03-metrics-and-knn.mdx +++ b/docs/ai/notebook-03-metrics-and-knn.mdx @@ -4,8 +4,36 @@ sidebar_position: 4 description: "Метрики качества, расстояния и классификация K ближайших соседей." slug: "/ai/notebook-03-metrics-and-knn" author: minkinad +type: notebook +tags: + - Python + - KNN + - Machine Learning +difficulty: intermediate +updatedAt: 2026-09-02 --- +## Что изучим + +Свяжем функции Python, меры расстояния и алгоритм K ближайших соседей: от вычисления метрики до оценки классификации. + +## После материала вы сможете + +- вычислять Евклидово, Манхэттенское и Чебышёвское расстояния; +- объяснить, как мера расстояния влияет на соседей объекта; +- применить KNN к задаче классификации; +- интерпретировать базовые метрики качества модели. + +## Предварительные знания + +Нужны основы Python, функции, коллекции и начальное знакомство с NumPy. + +:::important +Масштаб признаков влияет на расстояния. Перед KNN числовые признаки обычно приводят к сопоставимому масштабу. +::: + +## Теория и упражнения + **1.1. Теоретический материал – Функции Python** Перед тем как рассматривать задачи классификации вспомним @@ -762,3 +790,21 @@ array([[2., 0., 0., 2.], [1., 0., 2., 0.], [0., 0., 1., 3.]]) ```` + +## Частые ошибки + +- Использовать признаки разных масштабов без нормализации. +- Подбирать `k` по тестовой выборке и получать слишком оптимистичную оценку. +- Считать, что одна мера расстояния одинаково подходит любым данным. + +## Результат + +После выполнения упражнений у вас должны быть функции для нескольких метрик, подготовленная матрица признаков и понимание полного шага KNN: вычислить расстояния, выбрать соседей и определить класс. + + diff --git a/docs/algorithms/content-standard.mdx b/docs/algorithms/content-standard.mdx new file mode 100644 index 0000000..4b35701 --- /dev/null +++ b/docs/algorithms/content-standard.mdx @@ -0,0 +1,89 @@ +--- +title: Стандарт учебного материала +description: Рекомендуемая структура понятной и воспроизводимой образовательной страницы StackMIREA. +order: 3 +author: minkinad +type: guide +tags: + - MDX + - Contribution +difficulty: beginner +updatedAt: 2026-09-02 +--- + +## Зачем нужен стандарт + +Единая структура помогает быстро понять цель материала, подготовиться к работе, повторить ключевые шаги и проверить результат. Не каждая страница обязана содержать все разделы — выбирайте только полезные для темы. + +## Рекомендуемая структура + +1. Короткое описание и контекст. +2. «Что изучим» и конкретные результаты обучения. +3. Предварительные знания и инструменты. +4. Теория, необходимая для задания. +5. Задание и критерии результата. +6. Архитектура решения. +7. Реализация небольшими объяснёнными фрагментами. +8. Частые ошибки. +9. Результат и способ его проверить. +10. Вопросы для самопроверки и самостоятельное задание. +11. Полный исходный код — в сворачиваемом блоке, если он длинный. + +## Frontmatter + +Обязательные поля: + +```yaml title="material.mdx" +--- +title: Понятное название +description: Одно предложение о содержании и пользе страницы. +author: github-login +order: 2 +--- +``` + +Дополнительные метаданные улучшают каталог и статью: + +```yaml title="material.mdx" +type: practice +tags: + - Java + - MVC +difficulty: intermediate +updatedAt: 2026-09-02 +estimatedMinutes: 20 +status: published +``` + +Поддерживаемые типы: `theory`, `practice`, `notebook`, `guide`, `reference`. Статусы: `draft`, `published`, `archived`. Черновики не попадают в production manifest. + +## Код и объяснение + +Показывайте ключевой фрагмент рядом с объяснением. Указывайте язык и, когда это помогает, имя файла: + +```java title="UserController.java" {2-4} +public final class UserController { + private final User model; + private final UserView view; +} +``` + +Для полного листинга используйте `CollapsibleCode`, но не скрывайте внутри него части, необходимые для понимания материала. + +## Callouts + +Для коротких уточнений доступны `note`, `tip`, `warning`, `info` и `important`: + +:::warning +Не помещайте секреты, персональные данные и непроверенный исполняемый код в учебные материалы. +::: + +## Самопроверка + + diff --git a/docs/algorithms/index.mdx b/docs/algorithms/index.mdx index ce30fb0..1d56e3f 100644 --- a/docs/algorithms/index.mdx +++ b/docs/algorithms/index.mdx @@ -10,3 +10,4 @@ author: minkinad - Введение и навигация по проекту - MDX-структура и правила оформления - Связь с Python и Java треками +- [Стандарт учебного материала](./content-standard) для новых и обновляемых страниц diff --git a/docs/bigdata/index.mdx b/docs/bigdata/index.mdx index b1324c4..03c2bba 100644 --- a/docs/bigdata/index.mdx +++ b/docs/bigdata/index.mdx @@ -5,8 +5,6 @@ order: 1 author: minkinad --- -# BigData - обзор - В этом разделе собраны практические работы по дисциплине BigData в формате MDX. Материалы охватывают вводную часть, анализ данных, регрессию, прикладные кейсы со страховыми данными, классификацию, кластеризацию, ансамблевые методы и итоговую работу. ## Что внутри diff --git a/docs/bigdata/practice-01-introduction.mdx b/docs/bigdata/practice-01-introduction.mdx index 1b30305..2bb099d 100644 --- a/docs/bigdata/practice-01-introduction.mdx +++ b/docs/bigdata/practice-01-introduction.mdx @@ -3,9 +3,35 @@ title: Практика 1. Введение в BigData description: Базовые операции и знакомство с форматом работы. order: 2 author: minkinad +type: practice +tags: + - Python + - pandas + - Data Analysis +difficulty: beginner +updatedAt: 2026-09-02 --- -## Wiki-версия +## Что изучим + +Подготовим Python-окружение, повторим базовые конструкции языка и начнём исследовать табличный датасет с помощью pandas и scikit-learn. + +## После материала вы сможете + +- декомпозировать небольшую задачу на функции; +- работать со списками и словарями; +- загрузить датасет в pandas DataFrame; +- проверить пропуски и отфильтровать строки по условию. + +## Предварительные знания + +Достаточно понимать переменные, условия, циклы и запуск Python-скрипта. + +:::tip +Выполняйте задания небольшими шагами и сохраняйте вывод каждой проверки: он понадобится для итогового отчёта. +::: + +## Задание # Практическая работа №1 @@ -612,3 +638,21 @@ OK write book.txt OK ``` + +## Частые ошибки + +- Смешивать загрузку данных, преобразования и вывод в одном большом блоке. +- Игнорировать результат `info()` и проверку пропущенных значений. +- Фильтровать DataFrame без явных условий и не проверять число полученных строк. + +## Результат + +Сохраните рабочий код и отчёт с выводом ключевых проверок: структура DataFrame, пропуски, отфильтрованные записи, минимум, максимум и средние значения признаков. + + diff --git a/docs/java/task-15-mvc-pattern.mdx b/docs/java/task-15-mvc-pattern.mdx index 2329e1f..22a881e 100644 --- a/docs/java/task-15-mvc-pattern.mdx +++ b/docs/java/task-15-mvc-pattern.mdx @@ -4,15 +4,54 @@ sidebar_position: 16 description: Разделение модели, представления и контроллера. slug: /java/task-15-mvc-pattern author: minkinad +type: practice +tags: + - Java + - MVC + - OOP +difficulty: intermediate +updatedAt: 2026-09-02 --- +## Что изучим + +Разберём, как разделить данные, отображение и обработку пользовательских действий между Model, View и Controller. + +## После материала вы сможете + +- объяснить ответственность Model, View и Controller; +- связать состояние модели с отображением через контроллер; +- заметить смешивание бизнес-логики и интерфейса; +- собрать небольшое Java-приложение по MVC. + +## Предварительные знания + +Понадобятся классы, методы, конструкторы, инкапсуляция и базовый синтаксис Java. + ## Задание Разделение модели, представления и контроллера. Документация собрана по исходному коду этой практики. -## Решение +## Архитектура решения + +```text +Пользователь + ↓ +View → Controller → Model + ↑ │ │ + └─────────┴─────────┘ + обновление UI +``` -Полный код решения по этой практике: +Model хранит состояние, View отвечает за вывод, а Controller принимает действие и координирует изменение модели и обновление интерфейса. + +:::warning +Не помещайте бизнес-правила во View. Иначе интерфейс становится трудно переиспользовать и тестировать. +::: + +## Реализация + +Ниже решение разбито по ролям MVC и исходным файлам. Сначала проследите зависимости между компонентами, затем запускайте демонстрационные классы. ### Исходные файлы решения @@ -424,3 +463,21 @@ public class StudentView { ## Вывод Task 15 — MVC паттерн документирует реальное решение из исходного кода. + +## Частые ошибки + +- View напрямую изменяет поля Model и обходит Controller. +- Controller одновременно хранит данные, рисует интерфейс и выполняет бизнес-правила. +- Компоненты создаются внутри методов и поэтому их трудно заменить в тесте. + +## Самостоятельное задание + +Добавьте к примеру редактирование одного поля Model. Изменение должно проходить через Controller, а View — только отображать новое состояние. + + diff --git a/lib/content-manifest.ts b/lib/content-manifest.ts index d5a64a4..583c132 100644 --- a/lib/content-manifest.ts +++ b/lib/content-manifest.ts @@ -32,6 +32,12 @@ const contentManifestDocSchema = z.object({ toc: z.array(tocItemSchema), preview: z.string(), topics: z.array(z.string()), + materialType: z.enum(["theory", "practice", "notebook", "guide", "reference"]), + tags: z.array(z.string()), + difficulty: z.enum(["beginner", "intermediate", "advanced"]).nullable(), + updatedAt: z.string().nullable(), + estimatedMinutes: z.number().int().positive(), + status: z.enum(["published", "archived"]), anchors: z.array(z.string()), hash: z.string().min(1), isSectionIndex: z.boolean(), diff --git a/lib/markdown.ts b/lib/markdown.ts index 7911025..469903c 100644 --- a/lib/markdown.ts +++ b/lib/markdown.ts @@ -27,8 +27,9 @@ export interface TocItem { depth: 2 | 3; } -const CALLOUT_TYPES = new Set(["tip", "warning", "info", "note"]); +const CALLOUT_TYPES = new Set(["tip", "warning", "info", "note", "important"]); const CODE_FILENAME_PATTERN = /(?:title|filename)=["']?([^\s"']+)["']?/; +const CODE_HIGHLIGHT_PATTERN = /\{([\d,\s-]+)\}/; function createMdxAttribute(name: string, value: string) { return { @@ -44,7 +45,8 @@ function parseCodeInfo(lang?: string | null, meta?: string | null) { return { lang: normalizedLang, - filename: filenameMatch?.[1] + filename: filenameMatch?.[1], + highlight: meta ? CODE_HIGHLIGHT_PATTERN.exec(meta)?.[1] : undefined }; } @@ -56,6 +58,10 @@ export function createDocsAstPlugin(tocItems: TocItem[] = []): Plugin { visit(tree, (node: unknown, index: number | undefined, parent: unknown) => { const typedNode = node as MdastNode; + if (typedNode.type === "heading" && typedNode.depth === 1) { + typedNode.depth = 2; + } + if (typedNode.type === "heading" && (typedNode.depth === 2 || typedNode.depth === 3)) { const title = toString(typedNode).trim(); @@ -77,7 +83,7 @@ export function createDocsAstPlugin(tocItems: TocItem[] = []): Plugin { const typedParent = parent as MdastParent; if (typedNode.type === "code") { - const { lang, filename } = parseCodeInfo(typedNode.lang, typedNode.meta); + const { lang, filename, highlight } = parseCodeInfo(typedNode.lang, typedNode.meta); const attributes = [ createMdxAttribute("lang", lang), createMdxAttribute("code", "value" in typedNode && typeof typedNode.value === "string" ? typedNode.value : "") @@ -86,6 +92,9 @@ export function createDocsAstPlugin(tocItems: TocItem[] = []): Plugin { if (filename) { attributes.push(createMdxAttribute("filename", filename)); } + if (highlight) { + attributes.push(createMdxAttribute("highlight", highlight)); + } typedParent.children[index] = { type: "mdxJsxFlowElement", diff --git a/lib/mdx.ts b/lib/mdx.ts index cb6fff6..340f291 100644 --- a/lib/mdx.ts +++ b/lib/mdx.ts @@ -3,11 +3,17 @@ import rehypeSlug from "rehype-slug"; import { Callout } from "@/components/ui/Callout"; import { CodeBlock } from "@/components/ui/CodeBlock"; +import { CollapsibleCode } from "@/components/ui/CollapsibleCode"; +import { Figure } from "@/components/ui/Figure"; +import { SelfCheck } from "@/components/ui/SelfCheck"; import { getMarkdownRemarkPlugins, type TocItem } from "@/lib/markdown"; const mdxComponents = { Callout, - CodeBlock + CodeBlock, + CollapsibleCode, + Figure, + SelfCheck }; interface CompileDocMdxOptions { diff --git a/public/search-index.json b/public/search-index.json index 599ee51..69bf451 100644 --- a/public/search-index.json +++ b/public/search-index.json @@ -1 +1 @@ -{"version":1,"generatedAt":"2026-09-02T15:58:14.561Z","docs":[{"id":"ai","href":"/docs/ai","slug":["ai"],"section":"ai","sectionTitle":"AI","title":"AI","description":"Рабочие тетради по искусственному интеллекту в формате MDX.","preview":"AI обзор Раздел объединяет 8 рабочих тетрадей по дисциплине «Искусственный интеллект», перенесенных в MDX формат. Материалы идут от базового Python и научных библиотек к классическим ML методам, нейросетям, эволюционным алгоритмам и кластеризации. Что внутри P","keywords":["notebook","python","ai","ml","данных","деревья","методы","раздел","решений","knn","mdx","numpy","pandas","алгоритмам","базового","библиотек","внутри","генетические"],"topics":["python","ai","knn","pandas","numpy","algorithms","clustering","regression"],"chunks":[{"id":"chunk-0","heading":"AI обзор","text":"Раздел объединяет 8 рабочих тетрадей по дисциплине «Искусственный интеллект», перенесенных в MDX формат. Материалы идут от базового Python и научных библиотек к классическим ML методам, нейросетям, эволюционным алгоритмам и кластеризации.","keywords":["ai","mdx","mdx.","ml","python","алгоритмам","базового","библиотек","дисциплине","идут","интеллект","интеллекту"],"topics":["python","ai"]},{"id":"chunk-1","heading":"Что внутри","text":"Python, NumPy и pandas для подготовки данных; метрики расстояния, KNN и базовые техники классификации; регрессия и деревья решений; эволюционные методы, нейросети и кластеризация.","keywords":["ai","knn","mdx.","numpy","pandas","python","базовые","внутри","данных","деревья","интеллекту","искусственному"],"topics":["python","knn","pandas","numpy","clustering","regression"]},{"id":"chunk-2","heading":"Ноутбуки","text":"Notebook 1 — Основа Python типы данных, условия, циклы и вводные примеры. Notebook 2 — NumPy и pandas массивы, таблицы и базовая подготовка данных. Notebook 3 — Метрики и KNN расстояния между объектами и классификация ближайших соседей. Notebook 4 — Регрессия линейные модели, аппроксимация и оценка качества. Notebook 5 — Деревья решений деревья решений и работа с классификаторами","keywords":["notebook","ai","деревья","решений","knn","mdx.","numpy","pandas","python","аппроксимация","базовая","ближайших"],"topics":["python","knn","pandas","numpy","regression"]},{"id":"chunk-3","heading":"Ноутбуки","text":". Notebook 6 — Генетические и эволюционные методы оптимизация, генетические алгоритмы и отжиг. Notebook 7 — Нейронные сети персептрон, MLP и основы обучения сети. Notebook 8 — Кластеризация методы группировки данных без учителя.","keywords":["ai","notebook","генетические","методы","mdx.","mlp","алгоритмы","без","группировки","данных","интеллекту","искусственному"],"topics":["algorithms","clustering"]},{"id":"chunk-4","heading":"Как читать раздел","text":"Начните с Notebook 1 и Notebook 2 , если нужно выровнять базу по Python и обработке данных. Для классического ML переходите к Notebook 3 , Notebook 4 и Notebook 5 . Темы оптимизации и более продвинутых подходов собраны в Notebook 6 , Notebook 7 и Notebook 8 .","keywords":["notebook","ai","mdx.","ml","python","базу","более","выровнять","данных.","если","интеллекту","искусственному"],"topics":["python","ai"]}]},{"id":"ai/notebook-01-python-basics","href":"/docs/ai/notebook-01-python-basics","slug":["ai","notebook-01-python-basics"],"section":"ai","sectionTitle":"AI","title":"AI Notebook 1 — Основа Python","description":"Типы данных, условия, циклы и старт работы с NumPy.","preview":"Основа Python. Библиотеки. Дата 25.02.2023 1.1. Теоретический материал – Типы данных Типы данных Все типы данных в Python относятся к одной из 2 х категорий: изменяемые (mutable) и неизменяемые (immutable). Неизменяемые объекты: исловые данные (int, float), bo","keywords":["print","python","type","задача","10","elif","dev","от","plt.plot","range","данных","apple","df","if","import","rng","trapz","массива"],"topics":["python","ai","numpy","knn"],"chunks":[{"id":"chunk-0","heading":"","text":"Типы данных Все типы данных в Python относятся к одной из 2 х категорий: изменяемые (mutable) и неизменяемые (immutable). Неизменяемые объекты: исловые данные (int, float), bool, None, символьные строки (class 'str'), кортежи (tuple). Изменяемые объекты: списки (list), множества (set), словари (dict).","keywords":["ai","данных","типы","python","изменяемые","неизменяемые","объекты","bool","class","dict","float","immutable"],"topics":["python"]},{"id":"chunk-1","heading":"","text":"python x= 3+5.2 7 y= None z= 'a',5,12.345, (2,'b') df= [['Антонова Антонина',34,'ж'],['Борисов Борис',26,'м']] A={1,'title',2,'content'} print(x,' ',type(x),'\\n',y,' ',type(y),'\\n',df,' ',type(df),'\\n',A,' ',type(A),'\\n')","keywords":["type","ai","df","python","12.345","26","3+5.2","34","content","none","notebook","numpy."],"topics":["python"]},{"id":"chunk-2","heading":"","text":"code 39.4 None [['Антонова Антонина', 34, 'ж'], ['Борисов Борис', 26, 'м']] {'content', 1, 2, 'title'}","keywords":["ai","26","34","39.4","code","content","none","notebook","numpy.","python","title","антонина"],"topics":[]},{"id":"chunk-3","heading":"","text":"python x=5 =2 A={ 1,3,7,8} B={2,4,5,10,'apple'} C=A&B df= 'Антонова Антонина',34,'ж' z='type' D=[1,'title',2,'connect'] print(x,' ',type(x),'\\n',A,' ',type(A),'\\n',B,' ',type(B),'\\n',C,' ',type(C),'\\n',df,' ',type(df),'\\n',z,' ',type(z),'\\n',D,' ',type(D),'\\n')","keywords":["type","ai","df","python","10","34","apple","connect","notebook","numpy.","print","title"],"topics":["python"]},{"id":"chunk-4","heading":"","text":"text True {8, 1, 3, 7} {2, 'apple', 4, 5, 10} set() ('Антонова Антонина', 34, 'ж') type [1, 'title', 2, 'connect']","keywords":["ai","10","34","apple","connect","notebook","numpy.","python","set","text","title","true"],"topics":[]},{"id":"chunk-5","heading":"","text":"В коде часто приходится проверять выполнимость или невыполнимость каких то условий. Синтаксис:","keywords":["ai","notebook","numpy.","python","выполнимость","данных","каких","коде","невыполнимость","основа","приходится","проверять"],"topics":[]},{"id":"chunk-6","heading":"","text":"Обратите внимание, что код, который должен выполняться внутри каждого условия, записывается с отступом в 4 пробела от уровня if, elif и else: в питоне области видимости переменных обозначаются отступами.","keywords":["ai","условия","elif","else","if","notebook","numpy.","python","видимости","внимание","внутри","выполняться"],"topics":[]},{"id":"chunk-7","heading":"","text":"То есть, отступы позволяют понять, где начинается код, который должен выполняться при выполнении условия в if, и где заканчивается.","keywords":["ai","условия","if","notebook","numpy.","python","выполнении","выполняться","данных","должен","заканчивается.","код"],"topics":[]},{"id":"chunk-8","heading":"","text":"Задача:Вывести на экран является ли переменная х положительной, отрицательной или равна нулю.","keywords":["ai","notebook","numpy.","python","вывести","данных","задача","ли","нулю.","основа","отрицательной","переменная"],"topics":[]},{"id":"chunk-9","heading":"","text":"python x=125 if x<0: print('x отрицательный') elif x==0: print('x равен 0') else: print('x положительный')","keywords":["ai","print","python","125","elif","else","if","notebook","numpy.","данных","основа","отрицательный"],"topics":["python"]},{"id":"chunk-10","heading":"","text":"Задача: Напишите код. Задается х, напечатать какому из интервалов принадлежит: ( infinity, 5), [ 5, 5] или от (5, +infinity)","keywords":["ai","+infinity","infinity","notebook","numpy.","python","данных","задается","задача","интервалов","какому","код."],"topics":[]},{"id":"chunk-11","heading":"","text":"python x=int(input()) if x < 5: print('x пренадлежит интервалу от бесконечности до 5') elif 5