12 Проектов на Python для Начинающих - Курс Кодирования

YOUTUBE · 26.11.2025 06:11

Ключевые темы и таймкоды

Введение

0:00
  • Кайли Ин представляет 12 проектов на Python для начинающих.
  • Проекты расположены от простых к сложным: от madlibs до искусственного интеллекта.
  • Ошибки в коде оставлены для демонстрации исправления.

Призыв к подписке

0:56
  • Приглашение подписаться на YouTube-канал, Twitch, Instagram и Twitter Кайли Ин.

Основы madlibs

1:22
  • Объяснение традиционного madlibs с пробелами в абзаце.
  • Использование конкатенации строк для воссоздания madlibs на Python.

Методы конкатенации строк

2:20
  • Описание трёх методов конкатенации: с помощью знака «плюс», фигурных скобок и строки f.
  • Пример с переменной youtuber и её заполнением.

Реализация madlibs на Python

3:42
  • Определение переменных для прилагательных, глаголов и знаменитых людей.
  • Получение пользовательского ввода и создание madlibs.

Пример madlibs

5:44
  • Пример madlibs с глаголами «прыгнуть с парашютом» и «прыгать» и знаменитым человеком «Капитан Америка».

Random madlibs

5:58
  • Упоминание файла random madlibs, который выбирает один из четырёх подготовленных madlibs для игры.

Введение

6:30
  • Очаровательное сияние озарило заколдованное небо.
  • Рука Волдеморта превратилась в пылающую бутылку с водой.

Реализация игры на угадывание

6:57
  • Компьютер генерирует секретный номер с помощью функции random.randint.
  • Пользователь пытается угадать число, вводя предположения в терминале.
  • Компьютер сообщает, является ли предположение слишком высоким, слишком низким или правильным.

Цикл угадывания

7:51
  • Используется цикл while для непрерывного угадывания числа.
  • Цикл останавливается, когда предположение равно случайному числу.
  • Переменная предположения инициализируется нулём.

Обратная связь от компьютера

10:44
  • Если предположение меньше случайного числа, выводится «извините, повторное предположение слишком низкое».
  • Если предположение больше случайного числа, выводится «извините, повторное предположение слишком высокое».
  • Если предположение равно случайному числу, выводится «ура, поздравляю!».

Пример игры

12:33
  • Пользователь пытается угадать число от 1 до 10.
  • После нескольких попыток пользователь правильно угадывает число 3.

Обратная функция

13:18
  • Создаётся функция для компьютера, который должен угадать секретное число.
  • Устанавливаются низкие и высокие границы диапазона для угадывания.
  • Компьютер генерирует случайные числа между границами.

Обратная связь от пользователя

15:12
  • Пользователь вводит «h» для слишком высокого, «l» для слишком низкого или «c» для правильного.
  • Верхняя граница диапазона уменьшается на 1, если предположение слишком велико.
  • Нижняя граница увеличивается на 1, если предположение слишком низко.

Завершение

17:47
  • Если компьютер правильно угадал число, выводится «ура», компьютер угадал твой номер.

Угадывание числа

17:55
  • Переменная «угадай» сохраняет последнее угаданное компьютером число.
  • Если низкое и высокое значения совпадают, цикл прерывается.
  • Компьютер сужает круг поисков, если пользователь указывает, что число слишком мало или слишком много.

Реализация прерывания цикла

18:49
  • Важно, чтобы пользователь знал, что компьютер выбрал правильно.
  • Если низкий уровень не равен высокому, генерируется случайное число между ними.
  • В случае совпадения низкого и высокого уровней предположение равно одному из них.

Пример игры

19:49
  • Пример с секретным числом 6: пользователь указывает, что 5 и 7 — слишком мало и слишком много.
  • Компьютер правильно угадывает число 6.
  • Игра может быть масштабирована на множество участников.

Игра «Камень, ножницы, бумага»

21:16
  • Использование случайного метода для выбора вариантов.
  • Пользователь вводит «r» для камня, «p» для бумаги или «s» для ножниц.
  • Компьютер выбирает вариант случайным образом.

Определение победителя

22:15
  • Функция win определяет, кто победил: игрок или компьютер.
  • Правила игры: камень побеждает ножницы, ножницы побеждают бумагу, бумага побеждает камень.
  • Если выбор пользователя и компьютера совпадает, объявляется ничья.

Реализация функции win

23:15
  • Функция завершается сразу после определения победителя.
  • Отсутствие оператора if перед последним возвратом экономит код.

Пример игры «Камень, ножницы, бумага»

24:07
  • Пользователь выбирает «с» для ножниц, компьютер выигрывает.
  • При повторной игре пользователь выигрывает.

Игра «Палач»

24:37
  • Выбор случайного английского слова из списка.
  • Импорт списка слов в Python.
  • Функция «получить правильное слово» выбирает слово без пробелов и тире.

Отслеживание букв

26:57
  • Переменная word letters сохраняет все буквы в слове.
  • Алфавит импортируется как список заглавных букв английского языка.
  • Use letters используется для отслеживания угаданных пользователем букв.

Ввод данных от пользователя

27:51
  • Запрос ввода данных от пользователя.
  • Проверка допустимости буквы: если буква в алфавите и ещё не использована, она добавляется в use letters.
  • Удаление угаданной буквы из word letters при правильном угадывании.

Обработка ошибок

29:44

Введение в цикл while

30:05
  • Использование цикла while для продолжения ввода пользователем до угадывания слова.
  • Удаление буквы из набора букв word letters при каждом вводе.
  • Условие завершения цикла: длина букв в слове равна нулю.

Отображение информации пользователю

31:04
  • Печать использованных букв и текущего слова с тире вместо неугаданных букв.
  • Создание списка угаданных букв и его преобразование в строку с помощью точечного соединения.

Введение понятия жизней

32:46
  • Добавление понятия жизней для усложнения игры.
  • Уменьшение количества жизней на единицу при отсутствии буквы в слове.
  • Обновление отображения количества жизней перед каждым вводом.

Расширение условия цикла

33:35
  • Добавление условия «время жизни больше нуля» в цикл while.
  • Выход из цикла при победе или смерти игрока.
  • Сообщение пользователю о победе или смерти в зависимости от количества жизней.

Создание игры «крестики-нолики»

35:55
  • Разделение игроков на классы для удобства управления игрой.
  • Импорт необходимых библиотек для математики и рандомизации.
  • Определение базового класса игроков и его инициализация.

Реализация классов игроков

36:54
  • Создание случайного компьютерного игрока и игрока-человека через наследование.
  • Определение функции get_move для каждого игрока.

Определение правил игры

37:43
  • Создание класса «крестики-нолики» с доской размером 3x3.
  • Индексация пробелов на доске и отслеживание текущего победителя.
  • Печать доски для отображения её состояния.

Печать доски

38:39
  • Индексация строк доски и их объединение для печати.
  • Использование статического метода для печати номеров плат.
  • Объяснение диапазонов индексов для каждой строки доски.

Логика игры и обработка ходов

41:25
  • Обозначаем пустые места на доске пробелами.
  • Возвращаем список индексов доступных ходов после хода игрока.
  • Инициализируем список переходов и используем enumerate для создания кортежей с индексами и значениями.

Обработка кортежей и добавление индексов

42:08
  • В цикле for присваиваем значения кортежам: i — индекс, x — значение.
  • Если x равно пробелу, добавляем индекс в список перемещений.
  • Альтернативный способ: сведение цикла for в одну строку.

Выбор хода для компьютерного игрока

43:00
  • Выбираем случайное пустое место на доске для компьютерного игрока.

Ввод и проверка хода для игрока-человека

43:55
  • Пользователь вводит квадрат, который проверяется на допустимость.
  • При ошибке преобразования в целое число или отсутствии хода в списке доступных ходов цикл повторяется.
  • После ввода правильного квадрата ход игрока-человека возвращается.

Начало игры и настройка параметров

45:40
  • Определяем функцию play для начала игры.
  • Передаём данные о игроках и переменной print для вывода шагов.
  • Начинаем игру с буквы «x».

Проверка пустых квадратов и получение хода

46:32
  • Создаём функцию empty_squares для проверки наличия пустых квадратов.
  • Подсчитываем количество пустых квадратов на доске.
  • Получаем ход от соответствующего игрока в зависимости от текущей буквы.

Реализация хода игрока

48:10
  • Определяем функцию для реализации хода игрока.
  • Проверяем правильность хода и присваиваем букву квадрату.
  • Возвращаем true при правильном ходе, false — при неверном.

Печать хода и смена букв

49:04
  • Печатаем ход игрока и новое изображение доски.
  • Меняем буквы игроков: если старая буква была «x», новая будет «o», и наоборот.

Проверка победителя и завершение игры

50:21
  • Создаём функцию для проверки победителя.
  • После хода проверяем текущего победителя и завершаем игру, если он есть.
  • Возвращаем победителя или «нет» при ничьей.

Завершение игры

51:26
  • При завершении игры печатаем «ничья».
  • Завершаем игру, возвращая победителя или «нет».

Определение победителя в крестики-нолики

52:03
  • Функция определяет победителя, проверяя наличие трёх одинаковых символов в строке, столбце или диагонали.
  • Индекс строки вычисляется путём деления квадрата на три и округления в меньшую сторону.
  • Строка представляет собой список элементов, соответствующих буквам.

Проверка строк и столбцов

53:02
  • Для каждой точки в строке проверяется, соответствует ли она букве.
  • Если все элементы в строке равны букве, возвращается true.
  • Аналогично проверяется наличие трёх букв в столбце.

Проверка диагоналей

54:49
  • Диагонали проверяются на чётность квадрата.
  • Элементы на доске соответствуют числам 0, 4, 8 для верхней диагонали и 2, 4, 6 для нижней.
  • Если каждая точка в диагонали соответствует букве, возвращается true.

Реализация игры

56:24
  • Импорт игроков-человека и случайного компьютерного игрока.
  • Создание экземпляра игры и настройка режима печати.
  • Тестирование игры в терминале.

Оптимизация игры

1:00:02
  • Обсуждение возможности создания алгоритма, который никогда не проигрывает.
  • Введение алгоритма минимакс для максимизации выигрыша и минимизации потерь.
  • Применение функции полезности для оценки оптимальности ходов.

Пример применения минимакса

1:01:29
  • Расчёт полезности для каждого возможного сценария игры.
  • Распространение значений полезности вверх по дереву решений.
  • Определение наиболее оптимального пути для максимизации выигрыша.

Выбор оптимального решения

1:04:23
  • Максимизация выигрыша для игрока X.
  • Минимизация потерь для игрока O.
  • Выбор среднего пути как наиболее оптимального для минимизации количества шагов.

Создание гениального компьютерного игрока

1:04:37
  • Инициализация игрока как суперкласса.
  • Активация функции move для выбора хода.
  • Случайный выбор хода, если все места свободны.
  • Использование минимаксного алгоритма для выбора оптимального хода.

Реализация минимаксного алгоритма

1:05:33
  • Определение функции minimax вне функции get_move.
  • Передача состояния игры на каждой итерации минимакса.
  • Проверка наличия победителя в текущем состоянии игры.

Формула для расчёта счёта

1:07:03
  • Расчёт счёта на основе количества пустых квадратов.
  • Учёт максимального количества очков другого игрока.
  • Нейтральный счёт при отсутствии победителя.

Инициализация переменных

1:08:44
  • Инициализация переменной best для хранения наилучшей позиции и результата.
  • Сравнение каждого результата с текущим лучшим.
  • Минимизация результата для игрока, не являющегося максимальным.

Шаги алгоритма

1:09:16
  • Выполнение хода и моделирование игры после его выполнения.
  • Отмена хода для следующей итерации.
  • Обновление словарей при необходимости.

Завершение алгоритма

1:11:16
  • Замена лучшего словаря на лучший результат.
  • Получение списка позиций и результатов.
  • Индексация позиции для возврата квадрата.

Тестирование алгоритма

1:12:15
  • Игра против гениального компьютерного игрока.
  • Исправление ошибки в коде.
  • Демонстрация умного хода алгоритма.

Анализ результатов

1:13:59
  • Отслеживание количества побед и ничьих.
  • Повторение игры 1000 раз.
  • Результаты: 0 выигрышей, 793 нулевых выигрыша, 207 ничьих.

Заключение

1:15:07
  • Гениальный компьютерный игрок никогда не проигрывает.
  • Он только выигрывает или связывает игру.
  • Результаты не меняются при многократном повторении.

Введение в бинарный поиск

1:15:56
  • Бинарный поиск — это алгоритм «разделяй и властвуй», который ускоряет поиск в упорядоченном списке.
  • Он работает, проверяя средний элемент списка и разделяя его на две части: левую и правую.
  • Если цель меньше среднего элемента, поиск продолжается в левой половине списка; если больше — в правой.

Принцип работы бинарного поиска

1:16:47
  • Если цель равна среднему элементу, поиск завершается.
  • Если цель меньше среднего элемента, поиск повторяется в левой половине списка.
  • Если цель больше среднего элемента, поиск повторяется в правой половине списка.

Сравнение с наивным поиском

1:17:40
  • Наивный поиск перебирает весь список, проверяя каждый элемент.
  • Бинарный поиск использует принцип «разделяй и властвуй», что значительно ускоряет процесс.

Реализация наивного поиска

1:18:40
  • Наивный поиск принимает список и цель и проверяет каждый элемент.
  • Если цель найдена, возвращается индекс; если нет — отрицательный результат.

Реализация бинарного поиска

1:19:35
  • Бинарный поиск находит среднюю точку списка и проверяет её.
  • Если цель меньше средней точки, поиск повторяется в левой половине списка.
  • Если цель больше средней точки, поиск повторяется в правой половине списка.

Оптимизация бинарного поиска

1:21:49
  • Для оптимизации используются переменные low и high, которые определяют границы поиска.
  • Low устанавливается равным нулю, high — длине списка минус один.
  • Средняя точка рассчитывается как среднее значение low и high.

Тестирование алгоритмов

1:24:13
  • Создаётся случайный отсортированный список длиной 10.
  • Измеряется время выполнения наивного и бинарного поиска.
  • Наивный поиск занимает около 443 микросекунд, бинарный — 6,8 микросекунд.

Заключение

1:27:18
  • Бинарный поиск значительно быстрее наивного, поэтому его следует использовать для поиска в отсортированных списках.

Введение в игру

1:27:38
  • Использование рекурсии и классов для создания игры.
  • Создание простой версии игры из командной строки для обучения программированию.
  • Фокус на реализации алгоритмов, а не на пользовательском интерфейсе.

Этапы игры

1:28:33
  • Создание игрового поля и установка бомб.
  • Отображение поля пользователю и запрос на выбор места для копания.
  • Рекурсивное копание до обнаружения бомбы или завершения игры.
  • Повторение шагов 2 и 3 до победы.

Объектно-ориентированное программирование

1:29:33
  • Создание объекта board для представления игры.
  • Инициализация класса board с указанием размера и количества бомб.
  • Отслеживание локаций, где были обнаружены бомбы и где копал пользователь.

Создание доски

1:30:33
  • Использование вспомогательной функции для создания новой доски.
  • Представление доски как списка списков.
  • Установка бомб на доске.

Установка бомб

1:31:44
  • Использование цикла while для выбора случайного места для бомбы.
  • Применение функции randint для определения местоположения бомбы.
  • Индексация доски для проверки наличия бомбы.

Присвоение значений доске

1:34:19
  • Присвоение каждому месту на доске значения, показывающего количество соседних бомб.
  • Предварительное вычисление значений для экономии времени на проверку.
  • Проверка каждой строки и каждого столбца доски.

Завершение

1:35:16
  • Продолжение проверки, если место на доске уже является бомбой.
  • Избегание отмены уже заложенных бомб.

Создание функции для подсчёта соседних бомб

1:36:00
  • Определение функции, которая принимает индексы строки и столбца и возвращает количество бомб в соседних позициях.
  • Использование переменных r и c для обозначения строки и столбца.
  • Инициализация счётчика количества соседних бомб равным нулю.

Подсчёт количества бомб в соседних позициях

1:37:02
  • Проверка всех соседних позиций строки и столбца.
  • Увеличение счётчика на единицу, если в текущей позиции обнаружена бомба.
  • Возврат общего количества соседних бомб после завершения проверки.

Проверка границ диапазона

1:38:58
  • Добавление оператора max для предотвращения выхода за пределы допустимых значений.
  • Учёт минимальной и максимальной длины строки и столбца.

Инициализация доски и планирование бомб

1:39:37
  • Создание экземпляра класса доски и передача размера измерения и количества бомб в функцию воспроизведения.
  • Инициализация доски, установка бомб и создание пустого набора для дуга.

Реализация функции dig

1:40:33
  • Определение функции dig в классе board для поиска по индексам строк и столбцов.
  • Возврат true при успешном раскопе и false при обнаружении бомбы.
  • Отслеживание мест, где уже копали, через кортеж в self.dig.

Рекурсивный поиск соседей

1:41:35
  • Проверка доски в текущей строке и столбце: если бомба — возврат false, если число больше нуля — завершение раскопок, иначе — рекурсивный поиск соседей.
  • Продолжение поиска соседей, если текущее место не было уже раскопано.
  • Завершение поиска при обнаружении места с соседними бомбами.

Создание функции для отображения доски

1:43:00
  • Добавление функции, которая возвращает строку, представляющую доску игроку.
  • Создание нового массива «видимая доска» для отображения видимой части доски.
  • Использование цикла for для заполнения массива значениями доски.

Обработка ввода пользователя

1:45:30
  • Запрос у пользователя места для копания в виде строки.
  • Разделение строки с помощью регулярного выражения для получения строки и столбца.
  • Проверка правильности ввода пользователя и отображение сообщения об ошибке при выходе за пределы доски.

Реализация копания и проверка безопасности

1:48:08
  • Функция dig возвращает true при успешном копании и false при обнаружении бомбы.
  • Проверка безопасности копания: если копка небезопасна, игра заканчивается.
  • Выход из цикла while при обнаружении бомбы.

Завершение игры

1:49:08
  • Если все места для копания исчерпаны, игра завершается победой.
  • Если обнаружена бомба, игра заканчивается сообщением «извините, игра окончена».
  • Отображение всей доски целиком для демонстрации возможных мест для копания.

Тестирование игры

1:50:05
  • Запуск функции play для тестирования игры.
  • Пример игры: начало с нуля-ноль, копка до обнаружения бомб.
  • Демонстрация рекурсивного копания и завершения игры при обнаружении бомбы.

Введение в проект

1:51:57
  • Программа для решения судоку с использованием рекурсии.
  • Функция solve_sudoku решает судоку методом обратного поиска.
  • Головоломка представлена списком списков, где каждый внутренний список — строка судоку.

Принцип работы программы

1:52:57
  • Компьютер начинает с любого свободного места на доске.
  • Пробует различные комбинации чисел, возвращаясь назад при неудаче.
  • Создаётся вспомогательная функция для поиска следующего свободного места.

Функция поиска следующего свободного места

1:53:56
  • Функция находит следующую незаполненную строку или столбец.
  • Свободные места обозначаются отрицательным знаком.
  • Возвращает индекс строки и столбца или кортеж None, None, если все места заполнены.

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

1:54:53
  • Перебирает все строки и столбцы головоломки.
  • Если не находит пустых мест, возвращает None, None.

Проверка правильности догадки

1:55:53
  • Если все места заполнены, возвращает True, так как головоломка решена.
  • В противном случае продолжает проверку правильности догадки.

Функция проверки правильности догадки

1:57:05
  • Передаёт головоломку, догадку, строку и столбец.
  • Определяет, является ли догадка действительной, проверяя соответствие правилам судоку.
  • Возвращает False, если догадка противоречит правилам.

Проверка матрицы 3x3

1:59:04
  • Находит начальный индекс строки и столбца матрицы 3x3.
  • Итерирует по трём строкам и трём столбцам, проверяя соответствие предположения значениям в матрице.
  • Возвращает False, если предположение уже есть в матрице.

Рекурсивный вызов функции

2:01:26
  • Если догадка действительна, изменяет массив головоломки.
  • Рекурсивно вызывает функцию с новым предположением.
  • Если новое предположение верно, возвращает True, завершая решение головоломки.

Решение судоку

2:02:29
  • Проверка «верно» может быть недействительной.
  • Если не удалось решить судоку, нужно вернуться к предыдущему предположению.
  • Цикл for перебирает все возможные комбинации для каждого пустого места в головоломке.
  • Если все комбинации не сработали, головоломка неразрешима, и возвращается значение false.

Проверка решения

2:03:46
  • Демонстрация работы программы на Python 3.
  • Изменение размера доски судоку для проверки решения.
  • Подтверждение правильности решения путём заполнения ячеек числами.

Рекурсия и чёрный ящик

2:04:40
  • Рекурсия может быть сложной для понимания.
  • Функция решения судоку должна изменять входную головоломку в зависимости от её правильности.
  • Если новое предположение неразрешимо, оно считается неверным.

Проект по редактированию изображений

2:05:37
  • Подготовка начальных кодов для редактирования изображений на Python.
  • Использование изображений озера и города для тестирования.
  • Программа для чтения и записи PNG-файлов.

Инициализация изображений

2:06:25
  • Инициализация изображения через параметры x, y и количество каналов.
  • Создание пустого массива нулей при инициализации.
  • Проверка ввода параметров пользователем.

Чтение и запись изображений

2:08:14
  • Чтение изображения из файла PNG.
  • Изменение размера файла и обрезка значений до 0–1.
  • Запись изображения в выходной файл с помощью PNG writer.

Тестирование импорта и экспорта

2:10:07
  • Тестирование импорта и экспорта изображения «озеро».
  • Подтверждение идентичности исходного и выходного изображений.

Настройка яркости

2:10:42
  • Реализация функции настройки яркости изображения.
  • Масштабирование каждого пикселя на коэффициент.
  • Итерация по каждому пикселю для регулировки яркости.

Примеры настройки яркости

2:13:32
  • Осветление изображения «озеро» с коэффициентом 1,7.
  • Затемнение изображения с коэффициентом 0,3.
  • Сравнение исходного и изменённого изображений.

Затемнение изображения

2:14:20
  • Сравнение затемнённого изображения с исходным.
  • Объяснение невекторизованного способа затемнения через настройку значений каждого пикселя.
  • Упоминание о векторизованной версии с использованием массивов numpy, которая значительно быстрее.

Векторизация операций

2:14:36
  • Преимущества векторизованных операций над итерациями с помощью цикла for.
  • Пример создания второго затемнённого изображения с помощью векторизованного подхода.

Настройка контрастности

2:15:50
  • Создание новой копии изображения для настройки контрастности.
  • Принцип регулировки контрастности через увеличение разницы от заданной средней точки на коэффициент.
  • Векторизованная версия регулировки контрастности: вычитание средней точки из каждого значения массива, масштабирование и добавление обратно.

Примеры регулировки контрастности

2:17:41
  • Увеличение контрастности изображения озера с коэффициентом 2 и средней точкой 0,5.
  • Уменьшение контрастности с коэффициентом 0,5.
  • Сравнение результатов: увеличенный контраст делает цвета ярче, уменьшенный — изображение становится более серым.

Размытие изображения

2:19:35
  • Введение понятия размера ядра для размытия.
  • Объяснение процесса усреднения пикселя с окружающими пикселями.
  • Описание наивной реализации размытия через перебор соседей и вычисление среднего значения.

Реализация размытия

2:20:33
  • Создание переменной для отслеживания общей суммы окружающих пикселей.
  • Определение диапазона соседей и проверка границ.
  • Вычисление среднего значения по пикселю и его соседям.

Применение размытия

2:22:32
  • Применение размытия к изображению города с размером ядра 3 и 15.
  • Сравнение результатов размытия с разными размерами ядра.

Размытие изображения

2:23:48
  • Размытое изображение из трёх частей выглядит слегка размытым по сравнению с оригиналом.
  • Процесс размытия занимает 15 секунд, и чем больше размер ядра, тем медленнее работает алгоритм.
  • Увеличение размера ядра приводит к более размытому изображению из-за учёта большего количества пикселей.

Применение ядра к изображению

2:24:34
  • Размытие реализуется путём применения ядра к каждому пикселю изображения.
  • Ядро размером n на n применяется к каждому пикселю, и значения в ядре суммируются с соответствующими пикселями изображения.
  • Создаётся функция для применения любого квадратного ядра к изображению.

Реализация функции применения ядра

2:25:34
  • Размер ядра определяется как одно измерение массива numpy.
  • Итерация по диапазону соседей позволяет найти значение ядра, соответствующее текущему пикселю.
  • Значения ядра индексируются по xk и yk, и суммируются с соответствующими значениями изображения.

Пример с ядром Собела

2:27:27
  • Ядро Собела в направлении x имеет массив 121 - 1 - 2 - 1.
  • Ядро в направлении y аналогично, но с изменёнными значениями.
  • Применение ядер x и y к изображению «город» показывает выделение краёв.

Объединение фильтров x и y

2:28:55
  • Для создания фильтра обнаружения краёв объединяются изображения, полученные с помощью ядер x и y.
  • Размеры массивов должны быть одинаковыми.
  • Объединённое изображение создаётся путём возведения значений в квадрат, сложения и извлечения квадратного корня.

Результат объединения фильтров

2:31:03
  • Объединённые фильтры x и y эффективно выделяют границы изображения.
  • Увеличение изображения показывает чёткие грани.
  • Использование этих приёмов позволяет реализовать функции Photoshop на Python.

Введение в Graph Composer

2:31:51
  • Graph Composer — это проект, основанный на цепочке Маркова.
  • В цепочке Маркова узел представляет значение, а стрелка указывает на другой узел.
  • Проект преобразует текстовый файл в сеть узлов и направленных рёбер с весами.

Пример преобразования текста

2:32:49
  • Каждое слово в тексте преобразуется в вершину графа.
  • Рёбра соединяют вершины, а вес ребра равен количеству раз, когда новое слово следует за предыдущим.
  • Пример: «я подписана на y cubed, и мне это нравится».

Генерация предложений

2:34:40
  • Для генерации предложений случайным образом выбирается начальное слово.
  • Следуя рёбрам, генерируется предложение, учитывая веса рёбер.
  • Чем выше вес ребра, тем больше вероятность выбора этого пути.

Реализация в Python

2:35:40
  • Загрузка кода для реализации проекта.
  • Создание класса Vertex для представления вершины графа.
  • Инициализация класса Vertex с передачей значения слова.

Работа с рёбрами и весами

2:37:39
  • Добавление рёбер к вершинам с учётом весов.
  • Увеличение веса ребра при повторном появлении слова.
  • Создание функции для добавления второго ребра.

Представление графа

2:39:36
  • Инициализация класса Graph с пустым словарем вершин.
  • Определение функции для получения значений вершин.
  • Добавление новых вершин при встрече с новыми словами.

Получение следующего слова

2:41:32
  • Функция для получения следующего слова на основе весовых сопоставлений.
  • Случайный выбор следующего слова на основе весовых коэффициентов.
  • Важность весовых коэффициентов для определения вероятности выбора следующего слова.

Введение в случайный выбор и карту вероятностей

2:42:35
  • Функция «случайный выбор точек» выбирает элементы списка на основе весов.
  • Карта вероятностей сопоставляет каждое слово с его вероятностью.
  • Создаются списки для отслеживания соседей и их весов.

Преобразование данных для случайного выбора

2:43:30
  • Для каждой вершины добавляется вес и соседняя вершина.
  • Преобразование данных в случайный выбор точек.

Индексация и создание вероятностных карт

2:43:57
  • Индексация списка с нулевым значением для получения первого элемента.
  • Функция «генерировать вероятностные отображения» инициализирует карты вероятностей для каждой вершины.

Извлечение слов из текста

2:45:15
  • Функция «извлечь слова из текста» читает текст, заменяет пробелы одним пробелом, преобразует текст в нижний регистр и удаляет знаки препинания.
  • Разделение текста на слова с помощью функции «разделить».

Построение графика

2:48:16
  • Проверка наличия слова в графе, добавление вершины и ребра при необходимости.
  • Увеличение веса ребра при наличии предыдущего слова.
  • Генерация вероятностных отображений перед возвратом объекта графа.

Генерация следующего слова

2:50:36
  • Функция «compose» генерирует следующее слово для заданного количества слов.
  • Добавление слов в композицию списка.
  • Возврат строки с словами, разделёнными пробелами.

Тестирование и исправление ошибок

2:52:32
  • Запуск функции и обнаружение ошибки «random не определён».
  • Исправление ошибки путём импорта random.
  • Обнаружение и исправление ошибки в функции «getnext word».
  • Успешное тестирование и вывод сгенерированного текста.

Проблемы с реализацией цепи Маркова

2:54:43
  • Текущая реализация цепи Маркова не очень разумна: слова выбираются случайно.
  • Предлагается использовать предыдущие три слова для выбора следующего слова, чтобы текст был более осмысленным.
  • Планируется реализация с песнями, сохраняя основную логику.

Обработка текста песен

2:55:35
  • Удаление скобок и текста внутри них для упрощения анализа песен.
  • Использование регулярного выражения для замены текста в скобках пробелами.
  • Импорт модуля re для работы с регулярными выражениями.

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

2:56:47
  • Импорт модуля os для чтения файлов из папки.
  • Получение списка файлов песен по имени исполнителя.
  • Передача пути к файлу песни для анализа.

Анализ слов из песен

2:58:07
  • Проход по каждому файлу песни и извлечение слов.
  • Добавление слов в список для дальнейшего анализа.
  • Пример с песней Тейлор Свифт.

Решение проблемы с ошибкой

2:58:45
  • Получение сообщения об ошибке и анализ файлов песен.
  • Обнаружение, что сбой произошёл из-за кэша, а не файла песни.
  • Продолжение работы с исправленным файлом.

Заключение

2:59:44
  • Подведение итогов: проект для начинающих, создающий абзацы на основе лексики из песен.
  • Призыв подписаться на канал и социальные сети автора.
  • Упоминание о живых сессиях по кодированию на Twitch.