Видеокурс выложен на сайте Altube.ru вместо Youtube и плеер Altube не поддерживает субтитры. Прошу решить вопрос о предоставлении русских субтитров в этом англоязычном видеокурсе. |
Кортежи (tuples)
20.9. Отладка
Списки, словари и кортежи являются примерами структур данных; в этой главе мы начали рассматривать сложные ("составные") структуры данных, например, списки кортежей, словари, которые содержат кортежи в качестве ключей и списки в качестве значений. Сложные структуры данных очень полезны, но они часто приводят к ошибкам, которые я называю ошибки формы; эти ошибки возникают, когда структура данных имеет неправильный тип, размер или состав, или, возможно, когда при написании некоторого кода вы забыли форму этих данных.
Например, если вы ожидаете список с одним целым числом, а вам предоставляется обычное целое число (не в списке), программа работать не будет.
При отладке программы и особенно при исправлении тяжелой ошибки пытайтесь выполнить четыре вещи.
Чтение: проверьте свой код, прочитайте его еще раз, чтобы убедиться, действительно ли он выражает то, что вы хотели.
Выполнение: экспериментируйте путем внесения изменений и запускайте различные версии. Часто, если вы вставили правильный код в правильное место в программе, проблема становится очевидной, но иногда необходимо потратить значительное время на вспомогательную работу.
Размышляйте: найдите время на размышления! Что это за ошибка: синтаксическая, времени выполнения, семантическая? Какую информацию можно получить из сообщений об ошибках или из вывода программы? Какая ошибка может породить эту проблему? Какие последние изменения были внесены до появления ошибки?
Отступление: бывает так, что лучшее из того, что можно предпринять – это отменять последние изменения, пока вы не вернетесь к программе, которая работает. Затем можно начать пошаговое восстановление.
Начинающие программисты часто застревают на одном из этих действий и забывают о других.
Каждое действие имеет свои собственные ошибки. Например, чтение кода позволит обнаружить опечатку, но не поможет, если ошибка заключается в концептуальном непонимании. Если вы не понимаете, что делает ваша программа, вы не сможете обнаружить ошибку, даже если прочтете код 100 раз, потому что ошибка у вас в голове. Экспериментирование может помочь, особенно при запуске небольших простых тестов. Но если вы начнете экспериментировать без обдумывания и чтения кода, то в конце концов можете дойти до "программирования методом случайного блуждания", которое представляет собой процесс внесения случайных изменений до тех пор, пока программа не станет работать правильно. Излишне говорить, что случайное блуждание может длиться неопределенно долго. Не лучше ли немного подумать?
Отладка похожа на экспериментальную науку. Необходимо иметь хотя бы одну гипотезу о причинах проблемы. При наличии двух и более возможностей постарайтесь придумать тест, исключающий одну из них.
Небольшой перерыв помогает дальнейшим размышлениям. Также полезны обсуждения. Если вы объясните проблему кому-то (или даже себе), возможно, вы найдете ответ еще до того, как закончите задавать вопрос.
Однако даже лучшие способы отладки бессильны, когда в коде слишком много ошибок или когда код, который вы хотите исправить, слишком большой и сложный. Иногда лучше отступить и упростить программу, пока не получится то, что работает и всё еще находится под вашим контролем.
Начинающие программисты зачастую неохотно вносят изменения, боясь удалить строку кода, даже когда она неправильная. Для спокойствия скопируйте программу в другой файл перед началом его правки. При необходимости легко можно будет вставить фрагменты исходного кода назад.
Поиск серьезных ошибок требует чтения, запусков, размышлений, а иногда и отмены последних изменений. Если вы застряли на одном из действий, попробуйте другие.
20.10. Глоссарий
Сравнимый (comparable): тип, два значения которого можно сравнивать друг с другом, определяя, что первое значение больше, меньше или равно второму. Сравнимые типы можно помещать в список и сортировать.
Структура данных (data structure): совокупность связанных значений, часто представленная в виде списков, словарей, кортежей и т.д.
DSU: Сокращение от "decorate-sort-undecorate," (декорирование-сортировка-раздекорирование) – метод, который включает в себя построение списка кортежей, сортировку и извлечение части результата.
Сборка (gather): операция формирования кортежа путем объединения произвольного числа аргументов.
Хешируемый (hashable): тип, имеющий хеш-функцию. Неизменяемые типы, такие как целые или вещественные числа и строки, являются хешируемыми; изменяемые, такие как списки и словари, – нет.
Разброс (scatter): операция использования последовательности в качестве списка аргументов.
Форма структуры данных (shape): совокупность типа, размера и состава структуры данных.
Одноэлементный (singleton): список (или другая последовательность) с одним элементом.
Кортеж (tuple): неизменяемая последовательность элементов.
Присваивание кортежей (tuple assignment): присваивание последовательности, стоящей с правой стороны от оператора присваивания, кортежу переменных с левой стороны. Правая сторона сначала вычисляется, затем вычисленные значения присваиваются переменным с левой стороны.
20.11. Упражнения
Упражнение 20.1.
Доработайте первоначальную программу следующим образом: она должна читать и разбирать поле "From" каждого сообщения и извлекать адрес из него. С помощью словаря нужно для каждого человека подсчитать число отправленных им сообщений.
После завершения обработки данных выводится имя человека, отправившего наибольшее число сообщений, при помощи создания списка кортежей (количество, e-mail) из словаря и последующей сортировки списка в обратном порядке.
Пример:
From stephen.marquard@uct.ac.za Sat Jan 5 09:14:16 2008 Enter a file name: mbox-short.txt cwen@iupui.edu 5 Enter a file name: mbox.txt zqian@umich.edu 195
Упражнение 20.2.
Программа должна рассчитать распределение количества сообщений для каждого часа в сутках. Номер часа можно извлечь из поля "From" сообщения, найдя в нем подстроку, задающую время, и разделив ее на части по двоеточиям. После подсчета количества сообщений для каждого часа выведите значения счетчиков, по одному на каждую строку, отсортировав их по номеру часа, как показано ниже.
Пример выполнения программы:
python timeofday.py Enter a file name: mbox-short.txt 04 3 06 1 07 1 09 2 10 3 11 6 14 1 15 2 16 4 17 2 18 1 19 1
Упражнение 20.3.
Напишите функцию most_frequent (наиболее частые), которая получает строку и выводит ее буквы в порядке убывания частоты. Найдите образцы текста на разных языках и посмотрите, как частоты букв меняются в разных языках. Сравните свои результаты с таблицей по адресу wikipedia.org/wiki/Letter_frequencies.