Саммерфилд - Программирование на Python 3 (1077331), страница 39
Текст из файла (страница 39)
ивегпаее = ((Г!е108[ЕОЛЕМАМЕ][0] и 11е1св[М100(ЕМАМЕ][:)] + Г!е108[808МАМЕ]).гер1асе("-", "").геР1асе("'", "")) ивегпаме = ог!д!па1 паве = ивегпаме[г8]. 1оиег() соим = ! мы1е ивегпаме !п ивегпамев: ивегпаме = "(0)(1)".Гогмаг(ог!д(па1 паве, соил!) соил! г= ! ивегпамев.аоо(ивегпаме) ге!игп ивегпаме При первой попытке имя пользователя создается путем конкатенации первого символа имени, первого символа отчества и фамилии целиком, после чего из полученной строки удаляются дефисы и апострофы.
Выражение, извлекающее первый символ отчества, таит в себе одну хитрость. Если просто использовать обращение Г!в108[М[00[ЕМАМЕ][О], то в случае отсутствия отчества будет возбуждено исключение ]псехЕггог. Но при использовании операции извлечения среза мы получаем либо первый символ отчества, либо пустую строку. Затем мы переводим все символы полученного имени пользователя в нижний регистр и ограничиваем его длину восемью символами.
Если имя пользователя уже занято (то есть оно уже присутствует в множе- Примеры 179 стве озегпваез), предпринимается попытка добавить в конец имени пользователя символ «1», если это имя пользователя тоже занято, тогда предпринимается попытка добавить символ «2» и т. д., пока не будет получено незанятое имя пользователя. После этого имя пользователа добавляется в множество озегпзаез и возвращается вызывающей программе. овг рмпс оввгв(овегв): паае»1осп = 32 оввгпвав»1ПСП = 9 ргспс("(О:<(па)) (1: 6) (2:(оа))".Гогааг( 'йаав", "10", "Овегпвав", па=папе»!с!в, ои=овегпааеи!Осп)) рг!пс("(О;-<(па)) (О:-<6) (О:-<(оа))".(огавс( пи=паае»1ссп, оа=оввгпааваспсп)) гог зеу !и вогсеп(оввгв); пвег = овегв[веу] 1пы!а1 = "" 1( иввг.юоо1епвав: !п111а1 = " " » оввг.а!ОО1впаае[О] паве = "(О, вогпзав), (О. гогвпаав) (1) ".
(огаас(оввг, сп!11а1) рг1пс("(О;.<(па)) ((1.16:4)) (1. оввгпвав:(оа))". ГогааС( паве, оввг, па=озава(ССП, оа=озегпвавасПСП)) После обработки всех записей вызывается функция рг1гс изегз(), которой в качестве параметра передается словарь о вега. Первая инструкция ргспс() выводит заголовки столбцов. Вторая инструкция рг1пс() выводит дефисы под каждым из заголовков. В этой второй инструкции метод в! г. (Огаас() используется довольно оригинальным образом.
Для вывода ему определяется строка "", то есть пустая строка; в результате при выводе пустой строки мы получаем строку из дефисов заданной ширины поля вывода. Затем мы используем цикл (ог ... 1п для вывода информации о каждом пользователе, извлекая ключи из отсортированного словаря. Для удобства мы создаем переменную озег, чтобы не вводить каждый раз овегв[пеу] в оставшейся части функции. В цикле сначала вызывается метод всг. (Огавс(), чтобы записать в переменную паае фамилию сотрудника, имя и необязательный первый символ отчества. Обращение к элементам в именованном кортеже овег производится по их именам. Собрав строку с именем пользователя, мы выводим информацию о пользователе, ограничивая ширину каждого столбца (имя сотрудника, идентификатор и имя пользователя) желаемыми значениями. Полный программный код программы (который несколько отличается от того, что мы только что рассмотрели„несколькими начальными строками с комментариями и инструкциями импорта) находится в файле делега(е ивегпагпев.ру.
Структура программы — чтение данных из Мо Глава 3. Типы коллекций 51аб56С5.РУ Предположим, что у нас имеется пакет файлов с данными, содержащих числовые результаты некоторой обработки, выполненной нами, и нам необходимо вычислить некоторые основные статистические характеристики, которые дадут нам возможность составить общую картину о полученных данных.
В каждом файле находится обычный текст (в кодировке АЯСП), с одним или более числами в каждой строке (разделенными пробельными символами). Ниже приводится пример информации, которую нам необходимо получить: !63 130. 56 43. 00 = (5.00, 7.00, 50.00] 235.0! соил! аеап аеегап ааое жо.
Ьеи. Здесь видно, что было прочитано 183 числа, из которых наиболее час- то встречаются числа 5, 7 и 50, и со стандартным отклонением по вы- борке 235.01. Сами статистические характеристики хранятся в именованном корте- же Бгаг!61106! 5(аг!в11св = со11ес14опв.пааеогир1е("5(аг!в!!се", "аеап аосе аеогап в1О Оеи") Функция аа1п() может служить схематическим отображением струк- туры программы: Оег аа!и(); 4( 1еп(вув.агро) == ! ог вув.агро[!] ю ("-П", "--Пе1р"): рппг("иваре: (О) Г!1е! [141е2 [... (11еа]]".Гогааг( вув.агро[0])) вув.ах!1() пиаЬегв = (] ггециепс1ев = со11ео(1опв.оегаи1104сг(1пг) гог гв1епаае 1п вув.агро(1:]: геас Оа1а(Г41епаае, пиаоегв, Ггециепс1ев) !Г пиаЬегв: в!а!!в!!ив = са1си1аге вгаг!в!!се(пиаьегв, ггециепсгев) рг1пг геви11в(1еп(пиаьегв), в1а11в14св) е1ве: рып1("по пиаьегв гоипо") Все числа из всех файлов сохраняются в списке пиаЬегв.
Для нахождения модальных (анаиболее часто встречающихсяэ) значений нам необ- файла, обработка каждой записи, вывод результата — одна из наиболее часто встречающихся, и она повторяется в следующем примере. Примеры ЗВАЛ ходимо знать, сколько раз встречается каждое число, поэтому мы создаем словарь со значениями по умолчанию, используя функцию спС() в качестве фабричной функции, где будут накапливаться счетчики.
Затем выполняется обход списка файлов и производится чтение данных из них. В качестве дополнительных аргументов мы передаем функции геаб баСа() список и словарь со значениями по умолчанию, чтобы она могла обновлять их. После чтения всех данных мы исходим из предположения, что некоторые числа были благополучно прочитаны, и вызываем функцию са!си1асе всассвс!св(). Она возвращает именованный кортеж типа 3сассвс сов, который затем используется для вывода результатов.
бес геаб бага(сс1епаае, пиаоегв, Сгвдиепссвв): Гог 1спо, 11па сп епиаега(е(преп(сс1епаае, епообспд="авос1"), вСагС=)): Гог х сп 1спв,вр1сС(): сгу: пиаЬег = 11оаС(х) пиаоегв.аррепб(пиаовг) Ггадивпосев[пиаьег) ч= 1 ехоерс ча1иееггог ав вгг: ргспС("(0).( 1): васррспд (2): (3)".Гогаас( Гс1епаав, 1спо, х, егг)) Каждая строка разбивается по пробельным символам, после чего производится попытка преобразовать каждый элемент в число типа (1оаС. Если преобразование удалось, следовательно, это либо целое число, либо число с плавающей точкой в десятичной или в экспоненциальной форме.
Полученное число добавляется в список пизЬегв и выполняется обновление словаря (гедиепс!ев со значениями по умолчанию. (Если бы здесь использовался обычный словарь бссс, программный код, выполняющий обновление словаря, мог бы выглядеть так: Сгедиепссев[пивеег) = ггедиепс1ев. дес(пивЬег, 0) ь 1.) Если преобразование потерпело неудачу, выводится номер строки (счет строк в текстовых файлах по традиции начинается с 1), текст, который программа пыталась преобразовать в число, и сообщение об ошибке, соответствующее исключению ча1иеЕ г го г.
бес са1си1а(е в(аС1в(1св(пиаЬегв, Ггадиепосев): аеап = виа(пиаЬегв) Г 1еп(пиаЬегв) арба = са1си1а(е зобе(сгедивпссев, 3) аебсап = са!си1аге аебсап(пиеоагв) всб беч = са1си1асе всб беч(пиаьегв, аеап) ге!иго 3сас1вс!ов(аеап, зобе, аебсап, ыб беч) Эта функция используется для сбора всех статистических характеристик воедино. Поскольку среднее значение вычисляется очень просто, мы делаем зто прямо здесь. Вычислением других статистических характеристик занимаются отдельные функции, и в заключение данная Глава 3. Типы коллекций функция возвращает экземпляр именованного кортежа ЯСаС!эС!Оэ, со- держащий четыре вычисленные статистические характеристики.
Ое( са!ои1а(е аопе((гедиепссеэ, вахсаив аоиеэ): псдьеэс ггепиепоу = апх(ггепиепо1еэ.ча!иеэ()) аоие = [пиаЬег Гог пивЬег, Сгедиепсу Сп ГгедиепсСее, !Севе() сс васо.гаьэ(ггедиепоу - шдьеэс ггеоиепсу) <= пуэ Г1оаС Сп(о.ерэс1оп] сГ поС (1 <= !еп(воие) <= аахсаив ариев); аоое = лопе е1эе: воое.эогс() ге(игп воле В выборке может существовать сразу несколько значений, встречающихся наиболее часто, поэтому, помимо словаря (герреро[ее, функции передается максимально допустимое число модальных значений.
[Эта функция вызывается из са1си!а(е э(а([э([сэ(), и при вызове задается максимальное число модальных значений, равное трем.) Функция азх() используется для поиска наибольшего значения в словаре Ггедиепс[еэ. Затем с помощью генератора списков создается список из значений, которые равны наивысшему значению.
Поскольку числа могут быть с плавающей точкой, мы сравниваем абсолютное значение разницы (используя функцию аэСЬ. гаээ(), поскольку она лучше подходит для случаев сравнения малых величин, близких к порогу точности представления числовых значений в компьютере, чем зЬэ()) с наименьшим значением, которое может быть представлено компьютером. Если число модальных значений равно О или больше максимального, то в качестве модального значения возвращается Иоле; в противном случае возвращается сортированный список модальных значений. иеГ са1си1аге аепсап(пивЬегэ): пиаЬегэ = поггеп(пиаЬегэ) аШО1е = 1еп(пивоегэ) О 2 аеисап = пиаЬегэ[а1ОО1е] с( 1еп(пивЬегп) в 2 == 0; вес[оп = (веосап + пивьегп[асоо1е - 1]) г' 2 гегигп аеОСап Медиана [<среднее значение в) — это значение, находящееся в середине упорядоченной выборки чисел, за исключением случая, когда в выборке присутствует четное число чисел, — тогда значение медианы определяется как среднее арифметическое значение двух чисел, находящихся в середине.