- •Формальные языки записи алгоритмов
- •Трансляторы и интерпретаторы языков программирования
- •Зачем нужно уметь программировать?
- •Комментарии к коду
- •Комментарии к коду
- •Экзотические языки программирования Специальные, экзотические и эзотерические языки программирования
- •Эзотерические языки программирования
- •О языке Python
- •Рекомендуемая литература
- •Интерпретация и компиляция
- •Алгоритм работы простого интерпретатора:
- •Ввод-вывод в Python Ввод данных
- •Вывод данных
- •Установка Python и сред разработки
- •Установка интерпретатора
- •Установка интегрированной среды разработки
- •Cреда программирования wing ide
- •Ключевые слова и идентификаторы в Python Идентификаторы
- •Ключевые слова
- •Концепция присваивания
- •Функция определения длины строки в Python
- •Литералы строк в Python
- •Срезы строк в Python
- •Примеры срезов
- •Методы строк в Python
- •Методы find и rfind
- •Метод replace
- •Метод count
- •Работа с тестирующей системой
- •Задачи поиска, замены и удаления подстроки в строке в Python
- •Метод replace
- •Метод count
- •Удаление подстроки
- •Числа с плавающей точкой (вещественные)
- •Основные операции с вещественными числами
- •Логический тип (bool) в Python
- •Логические операции
- •Принцип условного исполнения
- •Условная инструкция в Python
- •Вложенные условные инструкции
- •Операторы сравнения
- •Логические операторы
- •Каскадные условные инструкции
- •Инструкция pass в Python
- •Инструкции управления циклом в Python
- •Цикл while в Python
- •Вывод числа с обратным порядком цифр и в заданной системе счисления
- •Тест простоты
- •Проверка простоты перебором делителей
- •Факторизация перебором делителей
- •Факторизация перебором делителей на python
- •Факторизация перебором делителей на pascal
- •Разложение числа на множители в Python
- •Алгоритм Евклида: Python
- •Проверка числа на простоту в Python
- •Функция range
- •Фильтрация потока чисел
- •Поиск числа в потоке на Python
- •Поиск максимального и минимального числа в потоке на Python
- •Генерация псевдослучайных чисел
- •Детерминированные генераторы
- •Обработка исключений
- •Генерация исключений
- •"Страхование" от ошибок
- •Функции в программировании
- •Важное дополнение
- •Как написать хорошую функцию
- •Преимущества структурного программирования
- •Без использования структурного программирования
- •С использованием структурного программирования
- •Задания
- •Данная программа ищет самый популярный фильм среди данных
- •Функции в Python
- •Вызов функции и возврат значения
- •Передача параметров в функцию
- •Примеры
- •Граф вызовов функций
- •Пример на языке си
- •Что вернет функция a() в место своего вызова?
- •В каком порядке будут напечатаны X() started и X() finished для a, b, c, d?
- •Стек вызовов
- •Области видимости переменных в Python
- •Правила видимости имен
- •Пример перекрытия областей видимости
- •Доступ на присваивание к нелокальным именам
- •Полиморфизм функций в Python
- •Контрольные вопросы
- •Решение
- •Решение
- •Математические функции в Python
- •Функции в библиотеке math
- •Степенные и логарифмические функции
- •Тригонометрические функции
- •Радианы в градусы и наоборот
- •Пример программы с математическими функциями
- •Кортежи в Python Кортежи в Python
- •Кортежи в логическом контексте
- •Присваивание нескольких значений за раз
- •Методы split и join для списка строк в Python
- •Списки в Python
- •Сортировка выбором
- •Пример сортировки выбором минимума на си
- •Пример сортировки выбором минимума на python
- •Пример сортировки выбором минимума на pascal
- •Сортировка методом пузырька
- •Реализация сортировки массива методом пузырька на языке python
- •Реализация сортировки массива методом пузырька на языке pascal
- •Модернизация сортировки методом пузырька
- •Случайное перемешивание массива в Python
- •Сортировка подсчетом
- •Пример сортировки подсчетом на python
- •Пример сортировки подсчетом на языке си
- •Пример сортировки подсчетом на языке pascal
- •Генерация псевдослучайных чисел
- •Детерминированные генераторы
- •Вычисление суммы натуральных чисел от 1 до n
- •Проверка строки на палиндромность
- •Суммирование списка
- •Наибольшее значение в списке
- •Числа фибоначчи
- •Быстрое возведение в степень
- •Ханойские башни
- •Ограничение на глубину рекурсии
- •Стиль программирования (для Python)
- •Основные правила pep 8: Форматирование
- •Комментарии
- •Функции
- •Работа с текстовыми файлами в Python открытие файла
- •Чтение данных из файла
- •Вывод данных в файл
- •Закрытие файла
- •Двумерные массивы в Python
- •Создание вложенных списков
- •Ввод двумерного массива
- •Пример обработки двумерного массива
- •Вложенные генераторы двумерных массивов
- •Генераторы таблиц
- •Вычисление произведения матриц
- •Многомерные списки в Python обработка и вывод вложенных списков
- •Создание двумерного списка
- •Ввод двумерного списка
- •Сложный пример обработки двумерной таблицы
- •Множества в Python
- •Создание множества
- •Изменение множества
- •Удаление элементов множества
- •Основные операции с множествами
- •Множества в логическом контексте
- •Множества
- •Задание множеств
- •Работа с элементами множеств
- •Перебор элементов множества
- •Операции с множествами
- •Словари (ассоциативные массивы) в Python
- •Когда нужно использовать словари
- •Создание словаря
- •Работа с элементами словаря
- •Перебор элементов словаря
- •Словари со смешанными значениями
- •Пример хранения списков в словаре
- •Пример дешифрации текста после алфавитной замены
- •Дан текст:
- •Итог всех замен:
- •Итог всех замен:
- •Окончательный вариант:
- •Рекурсивный перебор
- •Перебор всех подмножеств
- •Перебор всех k-элементных подмножеств
- •Перебор всех перестановок
- •Одномерное динамическое программирование: количество способов Задача о кузнечике
- •Рекурсивное решение
- •Пример на языке python
- •Пример на языке pascal
- •Нерекурсивное решение
- •Пример на языке python
- •Пример на языке pascal
- •Модификации задачи о кузнечике
- •Пример на языке python
- •Пример на языке pascal
- •Пример на языке python
- •Пример на языке pascal
- •Одномерное динамическое программирование: наилучший способ задача о кузнечике со стоимостями
- •Пример на языке python
- •Пример на языке pascal
- •Восстановление ответа
- •Пример программы на языке python:
- •Пример программы на языке pascal:
- •Пример программы на языке python:
- •Пример программы на языке pascal:
- •Пример программы на языке python
- •Пример программы на языке pascal:
- •Линейные задачи
- •Рекурсивный перебор
- •Перебор всех подмножеств
- •Перебор всех k-элементных подмножеств
- •Перебор всех перестановок
- •Сортировка слиянием
- •Быстрая сортировка Хоара: Python
- •Асимптотика алгоритма
- •Объектно-ориентированное программирование
- •Классы в Python
- •Метод init
- •Создание экземпляров
- •Переменные экземпляра
- •Плановая обработка ошибок при помощи исключений в Python
- •Обработка исключений
- •Генерация исключений
- •“Страхование” от ошибок
- •Юнит-тестирование
- •Тестирование как этап разработки программы
- •Виджеты
- •Происхождение термина «виджет»
- •Типовые элементы интерфейса
- •Модуль tkinter Что такое tkinter?
- •Класс Tk
- •Общее для всех виджетов
- •Методы виджетов
- •"Системные" методы
- •Пример, часы:
- •Пример:
- •Основные виджеты
- •Методы виджета
- •Упаковщики
- •Привязка событий
- •Изображения
- •Пошаговые инструкции
- •Математические функции в Python
- •Функции в библиотеке math
- •Степенные и логарифмические функции
- •Тригонометрические функции
- •Радианы в градусы и наоборот
- •Пример программы с математическими функциями
- •Массивы чисел в модуле math Массивы чисел
- •Векторы
- •Математические операции над векторами
- •Векторные функции
- •Использование списков
- •Основы Numerical Python
- •К слову, о срезах
- •Задание координат и значений функций
- •Векторизация
- •Визуализация функций в Matplotlib
- •Набор точек
- •Функция
- •Украшения
- •Несколько кривых
- •Маркеры
- •Дополнительные аргументы plot()
- •Сохранение файла
- •Гистограммы
- •Модуль os в Python
- •Текущий рабочий каталог
- •Работа с именами файлов и каталогов
- •Получение содержимого каталога
- •Получение сведений о файле
- •Получение абсолютных путей
- •Анализ аргументов командной строки в Python
- •Примеры без использования argparse
- •Использование библиотеки argparse
Окончательный вариант:
вначале был эру единый, кого в арда называли илюватаром. он создал первых аинур, священных, бывших порождениями его мысли, и они были с ним задолго до сотворения всего прочего. эру говорил с ними, предлагая им мелодии; аинур пели ему, и он радовался. однако долгое время аинур пели поодиночке либо в несколько голосов, а остальные тем временем слушали; ибо были они способны постичь лишь ту часть замысла илюватара, к которому сами имели непосредственное отношение. понимание собратьев приходило к ним постепенно, но по мере слушания оно росло и увеличивало согласие и гармоничность пения. созвал однажды илюватар всех аинур и предложил им мелодию великой силы, раскрывавшую им тайны более чудесные и значимые, чем те, что когда-либо прежде открывались им. красота ее начальных нот и великолепие конфовки очаровало аинур, и в молчании склонились они перед илюватаром. и сказал им тогда илюватар: — из этой мелодии, что я вам дал, повелеваю сложить гармоничное звучание великой музыки. и поелику зажег я в каждом из вас неугасимое пламя, вы повинны приложить все свои усилия к совершенствованию сей мелодии, и вольны будете вложить в нее, при желании, свои собственные мысли и чаяния. я же буду сидеть и слушать, наслаждаясь тем, как ваша великая красота изливается в песню. и зазвучали голоса аинур, подобные звукам арц и лютней, свирелей и труб, виол и органа, и многоголосому поющему хору, и принялись слагать мелодию илюватара в величайшую музыку. бесконечно изменчивые мелодии стали сплетаться в гармоничное созвучие, выходившее на высочайших и низших нотах за грани слышимости, и место обитания илюватара переполнилось звуком. музыка эта и эхо ее достигли внешней пустоты, и та перестала быть пустотой.
Теперь можно опознать, что этот текст взят из первой главы книги «Сильмариллион» Дж.Р.Р.Толкиена.
Рекурсивный перебор
Важную роль среди алгоритмов играют алгоритмы перебора различных комбинаторных структур. Например, можно перебирать все подмножества данного множества, все подмножества, содержащие заданное число элементов, все перестановки данного набора элементов. Основным способом перебора комбинаторных структур является рекурсия.
Перебор всех подмножеств
Пусть дано некоторое множество, содержащее n элементов a0, a1, …, an−1. Необходимо перебрать все его подмножества. Общее число подмножеств n-элементного множества равно 2n. Например, у множества из 3 элементов {1,2,3} восемь подмножеств: {} (пустое подмножество), {1}, {2}, {3}, {1,2}, {1,3}, {2,3}, {1,2,3}.
Каждое подмножество будем кодировать строкой из n символов, где i-й символ будет равен 0, если aiне входит в выбранное подмножество, или равен 1, если ai входит в выбранное подмножество. То есть строка из одних нулей соответствует пустому множеству, а строка из одних единиц соответствует подмножеству, совпадающему со всем множеством.
Таким образом, задача сводится к перебору всех двоичных строк (т. е. состоящих из символов 0 или 1) длины n. Строки будем перебирать в лексикографическом порядке, то есть для n=3 порядок будет таким:
000 001 010 011 100 101 110 111
В лексикографическом порядке все строки упорядочены по первому символу, т. е. сначала нужно вывести те строки, у которых первый символ равен 0, затем те строки, у которых первый символ равен 1. Те строки, у которых первые символы равны, упорядочены по второму символу, затем - по третьему и т. д.
Если посмотреть на пример для n=3 то можно видеть, что результат перебора построен по следующему принципу. Сначала нужно взять первый символ строки равный 0, затем к нему всеми возможными способами дописать следующие n−1 символ также в лексикографическом порядке. Потом поставим на первое место символ, равный 1 и допишем к нему всеми возможными способами следующие n−1 символ.
В свою очередь, если у нас уже есть какая-то сформированная начальная часть строки (например, первый символ равен 0), то нужно к нему добавить сначала символ 0 (получим начальную часть вида 00) и так же рекурсивно дописать оставшиеся n−2 символа, затем добавить символ 1 (получим начальную часть вида 01), и рекурсивно добавить к этой начальной части еще n−2 символа.
Решение оформим в виде рекурсивной функции generate с двумя параметрами. Первый параметр — число n равное количеству символов строки, которые нужно сгенерировать. Второй параметр — строка prefix, в которой хранится уже сгенерированная начальная часть строки. Функция будет добавлять по одному символу к уже построенной части prefix, сначала добавляя символ «0», затем символ «1», после чего функция будет рекурсивно вызывать себя для построения n−1 оставшегося символа.
Окончание рекурсии: случай n=0, в этом случае функция больше не должна ничего строить и должна вывести построенную строку, которая целиком будет храниться в переменной prefix. Если требуется не вывести полученные строки на экран, а как-то обработать данное подмножество, то вместо функции print нужно вызвать функцию обработки подмножества.
Во всех остальных случаях функция дважды вызывает себя рекурсивно для построения строки длины n−1 - сначала добавив к строке prefix «0», затем добавив «1». Функция может быть реализована следующим образом:
def generate(n, prefix): if n == 0: print(prefix) else: generate(n - 1, prefix + "0") generate(n - 1, prefix + "1")
Для того, чтобы вывести все двоичные строки длины 5, нужно вызвать эту функцию так:
generate(5, "")
Попробуем модифицировать эту функцию. Допустим, нужно вывести все двоичные строки, в которых нет двух символов «1» подряд. Это означает, что добавить символ «1» можно только в том случае, если prefix оканчивается на символ «0», а также в случае пустой строки. Нужно добавить только одно условие:
def generate(n, prefix): if n == 0: print(prefix) else: generate(n - 1, prefix + "0") if prefix == "" or prefix[-1] == "0": generate(n - 1, prefix + "1")
