= Задание =

{{{#!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"]`