Саммерфилд - Программирование на Python 3 (1077331), страница 40
Текст из файла (страница 40)
Функция вычисления медианы сначала выполняет сортировку чисел по возрастанию. Затем посредством целочисленного деления определяется позиция середины выборки, откуда извлекается число и сохраняется как значение медианы. Если выборка содержит четное число ]ВЗ Примеры значений, то значение медианы определяется как среднее арифмети- ческое двух чисел, находящихся в середине. оег са1си!асе зсо оеч(пивьегз, аеап): Сота1 = 0 Гог пиаЬег сп пиаЬегз соса1 а= ((пиаьег - веап) ** 2) чагсапсе = Сота1 / (1еп(пиаЬегз) - 1) гесигп васа.загс(чаг1апсе) Стандартное отклонение — это мера дисперсии; оно определяет, как сильно отклоняются значения в выборке от среднего значения.
Вычисление стандартного отклонения в этой функции выполняется по формуле Е хах и-1 У где х — очередное число, х — среднее значение, а и — количество чисел. оег рыпс гези1сз(соипс, я(асса(соя); геа1 = "9.2Г' сг зсас1зсссз.аоое ся ропе; воое11пе = "" е)т( 1еп(зсассзтссз.воее) == т: аоое1спе = "воое = (0.((ас))ттп".(огвас( ягассзссся.воре[0], гас=геа1) е1зе; восе1спе = ("аосе = [" а ".)о1п(["(О;.2()".Гогаат(а) (ог а сп зсаСпнссз,воое]) а "]ттп") ргспс("""1 сосет = (О.'О) аеас = (1.аеап.(гвс)) веосап = (т.аес1ап:((ат)) (2)1 ясо, оеч, = (т.зсс Оеч:(гвс))""".(огаас( соипс, масса(соя, воое11пе, гас=геа1)) Большая часть этой функции связана с форматированием списка модальных значений в строку аоое11пе.
Если го„аас() модальные значения отсутствуют, то строка аобе1спе во- стр.100 обще не выводится. Если модальное значение единственное, список модальных значений содержит единственный элемент [аоое(0]), который и выводится с той же строкой форматирования, что используется при выводе других статистических значений. Если имеется несколько модальных значений, они выводятся как список, в котором каждое значение форматируется отдельно.
Делается это с помощью генератора списков, который позво- Глава 3. Типы коллекций 184 ляет получить список строк с модальными значениями; строки затем объединяются в единую строку, где отделяются друг от друга запятой с пробелом (", "). Последняя инструкция рг(пГ() в самом конце получилась очень простой благодаря использованию именованного кортежа. Он позволяет обращаться к статистическим значениям в объекте вгаг1зг(сз, используя не числовые индексы, а их имена, а благодаря строкам в тройных кавычках мы смогли отформатировать выводимый текст наглядным способом.
В этой функции имеется одна особенность, о которой следует упомянуть отдельно. Строка с модальными значениями выводится с помощью элемента строки формата (2), за которым следует символ обратного олеша. Символ обратного олеша экранирует символ перевода строки, поэтому если строка с модальными значениями пустая, то пустая строка выводиться не будет. Именно по этой причине мы вынуждены были добавить символ ~л в конец строки воое11ле, если она не пустая.
В заключение В этой главе мы рассмотрели все встроенные типы коллекций в языке Ру(лоп, а также пару типов коллекций из стандартной библиотеки. Мы рассмотрели коллекции-последовательности, Гцр1е, со11есГ(олз. лазвстцр1е и 11вт, поддерживающие, как и строки, возможность извлечения срезов. Также было рассмотрено использование оператора распаковывания последовательностей (*) и коротко было упомянуто использование аргументов со звездочками в вызовах функций. Мы также рассмотрели типы множеств вет и Ггоаелвет и типы отображений С(ст и со11ес11олв.ов(аз1ГО1сГ. Мы узнали, как использовать именованные кортежи из стандартной библиотеки языка Ру(Ьоп для создания своих собственных типов кортежей, доступ к элементам которых выполняется не только с помощью числовых индексов, но и более удобным способом — с помощью имен.
Мы также увидели, как создавать «константы ь, используя для этого переменные, идентификаторы которых состоят исключительно из символов верхнего регистра. При изучении списков мы увидели, что все, что применимо к кортежам, в равной степени применимо и к спискам. А благодаря тому, что списки относятся к категории изменяемых объектов, они обладают гораздо более широкими функциональными возможностями, чем кортежи.
В число этих возможностей входят методы, изменяющие содержимое списка (например, 11в1. роз()), а поддержка операций со срезами обеспечивает возможность вставки, замены и удаления срезов. Списки идеально подходят для хранения последовательностей элементов, особенно, когда необходим быстрый доступ к элементам по их индексам. В заключение 185 При обсуждении типов эе1 и ггозегэег мы отметили, что они могут содержать только элементы хешируемых типов данных. Множества обеспечивают быструю работу оператора проверки на вхождение и удобны для фильтрации повторяющихся данных.
Словари отчасти напоминают множества, например, ключами словарей могут быть только уникальные значения хешируемых типов данных, как и элементы множеств. Но, в отличие от множеств, словари хранят пары ключ-значение, в которых значениями могут быть данные любых типов. При изучении словарей были охвачены методы С[сг. Ве1() и С[сг. эе(сегар11(), а при описании словарей со значениями по умолчанию были продемонстрированы альтернативы этим методам. Подобно множествам, словари предоставляют очень эффективный оператор проверки на вхождение и обеспечивают быстрый доступ к элементам по ключу. Списки, множества, словари — все они имеют собственные реализации генераторов, которые могут использоваться для создания коллекций этих типов из итерируемых объектов (которые в свою очередь также могут быть генераторами), с наложением дополнительных условий, если это необходимо.
Функции гаазе() и ззр() часто используются для создания коллекций; обе эти функции удобно использовать в циклах гог ... ш и в генераторах. Элементы изменяемых коллекций могут удаляться с помощью соответствующих методов, таких как 1[Б1. рор( ) и зе1. С[эсаге(), или с помощью инструкции се1 — например, инструкция се1 С[К) удалит из словаря с элемент с ключом К. В языке Ру1Ьоп используются ссылки на объекты, что делает операцию присваивания чрезвычайно эффективной, но это также означает, что при использовании оператора присваивания (=) сами объекты не копируются. Мы рассмотрели различия между поверхностным и глубоким копированием, а позднее увидели, как с помощью операции извлечения среза 1[: ) можно создать поверхностную копию всего списка, а с помощью метода сзсГ.сору() создать поверхностную копию словаря. Любой объект, допускающий возможность копирования, может быть скопирован с помощью функций из модуля сору, например, функция сору.
сору() выполняет поверхностное копирование, а функция сору. Сеерсору() выполняет глубокое копирование. Мы познакомились с высокооптимизированной встроенной функцией зог1еО(). Эта функция широко используется при программировании на языке Ру1йоп. В языке Ру$Ьоп отсутствуют типы упорядоченных коллекций, поэтому, когда необходимо выполнить итерации через коллекции в определенном порядке, это можно реализовать с помощью функции эогтео(). Встроенных типов коллекций — кортежей, списков, множеств, фиксированных множеств и словарей — вполне достаточно для решения лю- Глава 3.
Типы коллекций 186 бого круга задач. Тем не менее в стандартной библиотеке имеется несколько дополнительных типов коллекций и значительное количество типов, созданных сторонними разработчиками. Часто возникает необходимость читать коллекции данных из файлов или записывать содержимое коллекций в файлы. В этой главе, в ходе очень краткого рассмотрения принципов работы с текстовыми файлами, основное наше внимание мы уделили чтению и записи текстовых строк. Полное описание работы с файлами приводится в главе 7, а дополнительные средства сохранения данных — в главе 11. В следующей главе мы поближе познакомимся с управляющими конструкциями языка Руб)юп, среди которых будет представлена одна конструкция, с которой мы еще не сталкивались.
Кроме того, мы более подробно изучим тему обработки исключений и некоторые дополнительные инструкции, такие как аввег(, с которыми мы еще не знакомы. Помимо этого, мы рассмотрим порядок создания собственных функций и в частности изучим чрезвычайно гибкий механизм работы с аргументами, используемый в языке Ру$Ьоп. Упражнения 1. Модифицируйте программу ехгегпа1 з!(езару и задействуйте в ней словарь со значениями по умолчанию. Это легко сделать, добавив одну дополнительную инструкцию !арог! и изменив всего две строки. Решение приводится вфайлеехгегпа1 з(вез апзру. 2. Модифицируйте программу ип1гТиегрогдз2.ру так, чтобы она выводила слова не в алфавитном порядке, а по частоте встречаемости.