= Задание = {{{#!wiki note green == Предупреждение == Программа, которая выглядит правильно, но не работает (не запускается или всегда валится с ошибкой), всегда заслуживает ровно 0 баллов. Программа, которая работает, но не выполняет задание в точности, как правило, не стоит полной цены задания. Однако, она может быть хорошей почвой для вопросов! В этом случае лучше всего задавать вопрос вида: "я считаю, что здесь у него то-то так-то, но программа ведёт себя так-то, значит у него здесь что-то ещё?" (Самое сложное в ответе на вопросы -- понять, какая модель поведения/устройства питона сложилась у вас в голове). == Отладка функций == Если вы написали функцию в файле (и ничего, кроме функций и импортов), то вы можете сделать вот что: * в IDLE нажать Run module. * при этом ничего не произойдёт (если нет синтаксических ошибок), и IDLE в шелле нарисует вам приглашение командной строки: ">>>" * теперь вы можете в командной строке запускать вашу функцию с разными аргументами и смотреть, что она возвращает, и работает ли она }}} 1. ''(0.3 балла)'' Напишите программу, которая выводит на экран песенку про бутылки с использованием `format`. 2. ''(0.3 балла)'' Напишите функцию `token_type(token)`, которая получает на вход токен, и возвращает слово, описывающее его тип. Одно из: * "lower" -- все буквы, в нижнем регистре * "title" -- все буквы, только первая в верхнем регистре * "upper" -- все буквы, в вернем регистре * "mixed" -- все буквы, разные регистры * "alnum" -- буквы и цифры * "other" -- все остальные Вы можете использовать другую классификацию, если она вам кажется более лингвистически-обоснованной, но при этом нужно её описать в вашем ответе. Я буду проверять соответствие классификации её описанию. 3. ''(0.3 балла)'' Напишите программу, которая открывает файл `words.txt`, и выдаёт в файл `tokens.csv` таблицу из: номера токена, самого токена, его типа. (Разумеется, можно и настоятельно рекомендуется пользоваться функциями `token_type` из задачи 2 и `tokenize` из конспекта) 4. * ''(1 балл)'' Напишите программу, которая открывает файл `words.txt`, и выдаёт в файл `tokens.csv` таблицу из: начальной позиции токена, самого токена, его типа. Начальной позицией токена является номером символа, с которого токен начинается<<FootNote(Для зануд -- в десятичной системе исчисления.)>>. Символы в файле нумеруются с нуля (учитываться должны _все_ символы в файле, включая невидимые)<<FootNote(Другая формулировка: если у нас token из text начинается в позиции pos, то `text[pos:].startswith(token)`)>>. Дополнительное ограничение: в программе не должно быть функции длиннее 10 строк, и вне функций должно быть не больше 10 строк кода. (Это правильное ограничение и для всех остальных программ, которые вы будете когда-либо писать на питоне -- кроме, может быть, отдельных функций). 5. ''(0.1 балла)'' Напишите функцию `lengths(words)`, которая получает на вход список питонских строк, и возвращает список их длин в том же порядке. Т.е. `lengths(["a", "aaa", "aaa!!!"]) == [1, 3, 6]` 6. ''(0.1 балла)'' Напишите функцию `average(numbers)`, которая получает на вход список чисел, и возвращает среднее арифметическое (без округлений). Т.е. `average([1, 2, 3, 4]) == 2.5` 7. ''(0.1 балла)'' Напишите функцию `stringify(list)`, которая получает на вход списко чего угодно, и возвращает список строк, полученных из каждого элемента в том же порядке. Т.е. `stringify(["a", 1, 2]) == ["a", "1", "2"]` 8. ''(0.1 балла)'' Напишите функцию `token_types(tokens)`, которая получает на вход список токенов, и возвращает список их типов в том же порядке. (Разумеется, можно и лучше пользоваться уже готовой функцией `token_type`). Т.е. `token_types([u"Пушкин", u"это", u"что-то"]) == ["title", "lower", "other"]`