Саммерфилд - Программирование на Python 3 (1077331), страница 23
Текст из файла (страница 23)
Он имеет то же действие, что и символ «0» в случае вывода целых чисел или символ «9» в случае вывода чисел с плавающей точкой. Отличительной особенностью символа «л» является то, что он учитывает региональные настройки, то есть использует характерный для текущего региона символ-разделитель целой и дробной части числа и разделитель разрядов. Регион, используемый по умолчанию, называется «С», и для этого региона в качестве разделителя целой и дробной части числа используется точка, а в качестве разделителя разрядов — пустая строка. »> "(О: ° <15)7.богшат(18340427) '18340427* ° ° ° * *' »> "(О:*>15)".Гогшат(18340427) '** ° * ° ° .18340427' »> "(О:* 15)",гогшат(18340427) '** ° 18340427 ° ° **' »> "(О ° 15)".(огшат(-18340427) '***-18340427 ° ° ° ' в * символ-заполнитель, выравнивание в по левому краю, минимальная ширина 15 в символ-заполнитель, выравнивание В по правому краю, минимальная ширина 15 В символ-заполнитель, выравнивание В по центРу, минимальная ширина 15 В ° символ-заполнитель, выравнивание В по центру, минимальная ширина 15 юв Глава 2.
Типы данных Чтобы иметь возможность принимать во внимание региональные на- стройки пользователя, в начале программы в качестве двух первых выполняемых инструкций можно добавить следующие две строки !вротс 1оса1е )оса)е.ает)оса)е()оса)е.ОС АСС "") Передавая пустую строку в качестве названия региона, мы тем самым предлагаем интерпретатору попытаться автоматически определить регион пользователя (например, путем определения значения переменной окружения САЕ)6) и перейти на использование региона «С» в случае неудачи. Ниже приводятся несколько примеров, демонстрирующих влияние различных региональных настроек на вывод целых и вещественных чисел: х, у = (1234567890, 1234.56) 1оса1е.эег!оса1е(1оса1е.СС АСС с = "(О:и) (1:п)".тагват(х, у) 1оса1е.ае(1оса1е(1оса1е.(С АИ., еп = "(О:п) (1:п)".Тогва((х, у) 1оса1е.зе()оса1е(1оса1е.(С АЫЦ Се = "(О.п) (1:п)7.тогват(х, у) "С") а с == "1234567890 1234.56" "еп 05.ОТЕ-8") а еп == "1,234,567,890 1,234 56" "Се ОЕ.ОТЕ-8") а Ое == "1.234.567.890 1.234,56" Символ «и» очень удобно использовать с целыми числами, но при вы- воде чисел с плавающей точкой он имеет ограниченное применение, потому что большие вещественные числа выводятся в экспоненциаль- ной форме.
Для форматирования чисел с плавающей точкой используются те же самые спецификаторы, что и для целых чисел, с двумя отличиями в конце. После необязательного значения минимальной ширины поля вывода можно указать число знаков после десятичной точки, добавив символ точки и целое число. В самом конце мы можем указать символ типа: «е» — для вывода числа в экспоненциальной форме, с символом «е» в нижнем регистре; «Е» — для вывода числа в зкспоненциальной форме, с символом «Е» в верхнем регистре; «7» — для вывода числа в стандартной форме, «9» — для вывода числа в «общей» форме, то есть для небольших чисел действует как символ «Г», а для очень больших— как символ «е», и «О» — то же самое, что символ «9», только использу- В программах, имеющих несколько потоков выполнения, функцию 1оса- 1е, зес1сса1е() лучше вызывать всего один раз, на этапе запуска програм- мы, и еще до того, как будут запущены дополнительные потоки, поскольку эту функцию обычно небезопасно вызывать э многопоточном окружении.
При выводе чисел с плавающей точкой спецификаторы формата дают возможность управлять символом-заполнителем, выравниванием в пределах поля вывода, выводом знака числа, минимальной шириной поля, числом знаков после десятичной точки и формой представления — простая, экспоненциальная или в виде процентов. Строки 109 ется формат либо «(», либо «Е».
Кроме того, допускается использовать символ «%», при использовании которого выводимое число умножается на 100 и для вывода применяется формат «[», с добавлением символа «%» в конце числа. Ниже приводятся несколько примеров вывода числа в экспоненциаль- ной и стандартной форме: »> авоипт = (10 * ° 3) * вати.р! »> "[(О:12.2е)] [(О:12.2() Г .(птват(авпипт) '[ 3.14е+03] [ 3141.59]' »> "[(О. >12.2е)) [(О:*>12.27)]".(птват(авпипт) '[ ° ° ° 3.
14е+03] [*****3141 59] »> "[(О; >+12.2е)) [(О:*>+12.2()]".(отват(авпипт) '[ ° "«3. 14е+03] [** ° *+3141.59]' В первом примере установлена минимальная ширина поля вывода 12 символов и 2 знака после десятичной точки. Второй пример построен на основе первого и к нему добавлен вывод символа-заполнителя «*». При использовании символа-заполнителя необходимо указывать символ выравнивания, поэтому мы указали выравнивание по правому краю [даже при том, что этот способ выравнивания используется по умолчанию для чисел).
Третий пример построен на основе двух предыдущих, в нем добавлен символ «+ » управления принудительным выводом знака числа. К моменту написания этих строк в языке Руй[топ отсутствовали средства прямого управления форматированием комплексных чисел. Однако мы легко можем решить эту проблему, форматируя действительную и мнимую части как отдельные числа с плавающей точкой. Например: »> "(О.геа):.3()(О.!вас:».31))".(игват(4.75917«1.2042)) '4.759«1.204)' »> "(О.геа):.Зт)(0.!ва9;+.31 Ц ".титват(4.75917-1.2042)) '4.759-1.204)' Мы обращаемся к каждому атрибуту комплексного числа по отдельности и форматируем их как числа с плавающей точкой с тремя знаками после запятой.
Кроме того, мы принудительно выводим знак мнимой части, добавляя символ /. Пример: рг!п1 ыпкоде.ру В предыдущих подразделах мы детально исследовали спецификаторы формата для метода зтг. топив(() и видели достаточно много фрагментов программного кода, демонстрирующих аспекты их применения на практике. В этом подподразделе мы рассмотрим небольшой, но достаточно поучительный пример использования метода э! г. (Огвз((), в котором мы увидим применение спецификаторов формата в реальном контексте. В примере также используются некоторые строковые методы, Глава 2.
Типы данных с которыми мы познакомились в предыдущем разделе, и вводится в использование функция из модуля ап1собебага.' Эта программа состоит всего из 28 строк выполняемого программного кода. Она импортирует два модуля, вув и сп!собебага, и определяет одну функцию — рг1п! ап1собе 180]е(). рассмотрение примера мы начнем с запуска программы, чтобы увидеть, что она делает; затем мы рассмотрим программный код в конце программы, где выполняется вся фактическая работа; и в заключение рассмотрим функцию, определяемую в программе.
рг!пг ап!созе.ру вроКеа бесТеа1 Пех слг пале При запуске без аргументов программа выводит таблицу всех символов Юникода, начиная с пробела и до символа с наибольшим возможным кодом. При запуске с аргументом, как показано в примере, выводятся только те строки таблицы, где в названии символов Юникода содержится значение строки-аргумента, переведенной в нижний регистр. вогб = Ноле !г 1еп(вув.агдч) > 1: вув.агдч[1] !и ("-П", '--Пе1р'): рг1п1("чваде; (0) [в1г!пд]Г.гогаа!(вув.агдч[01)) чога = 0 е1ве: нага = вув.агдч[1]. 1очгег() Эта программа предполагает, что консоль настроена на раГлава 7, рабе- боту в кодировке Т)Тг -8. К сожалению, консоль в операцион- „ф 1п „к ной системе ч(Г(пдочгв имеет весьма ограниченную поддерж- атр 334 ку Т)Тг-8, а консоль в системе Мас 08 Х по умолчанию использует кодировку Арр1е Котап.
Чтобы обойти вти ограничения, в состав примеров к книге включен файл рг)лв ил(соде ил(,ру — версия программы, выполняющая вывод в файл, который затем может быть открыт в редакторе, таком как 1ЭЕЕп поддерживающем кодировку Т)ТР-8. 10018 2722 10019 2723 10020 2724 10021 2725 10035 2733 10043 2738 10044 2730 10045 2730 10051 2743 10057 2749 10058 274А 10059 2748 + Рочг теагагор-зрокеа Авгег1вк ф Рочг Вв11ооп-Зракеа Аввеггвк + Невчу Ровг Ва!1ооп-Зрокеб Ав!еывх + Роаг О!ае-ЗроКеа АввегвВК ва Е4цл1 ЗроКеа Авгег1вк :К Теагбгор-ЗроКеа Авгеывк Нг Ореп Сел!ге Теагагор-ЗроКеа Ав(ег4вк Ф неачу Тевгагор-Зрокеб Автегввк гв неачу теагагор-Зрокеб Р!пвпее1 Аввег1вк 84 Ва11ооп-ЗроКеб Авгег!вк Еа Е!цлг Теагагор-Зрокеб Ргоре11ег Автег1вк 84 Невчу ЕТдлг Тевгагар-Зрокеб Ргоре11ег АвтеывК Строки »Г »ого!= 0; рг!и! оп!собе гаа1е(аогд) После инструкций импортирования и определения функции рг!п! оп!— соде !ад)е() выполнение достигает программного кода, показанного выше.
Сначала предположим, что пользователь не указал в командной строке искомое слово. Если аргумент командной строки присутствует и это -(1 или — пе1р, программа выводит информацию о порядке использования и устанавливает флаг аргб в значение О, указывая тем самым, что работа завершена. В противном случае в переменную хо гд записывается копия аргумента, введенного пользователем, с преобразованием всех символов в нижний регистр. Если значение аогд не равно О, программа выводит таблицу. При выводе информации о порядке использования применяется спецификатор формата, который представляет собой простое имя формата, в данном случае — порядковый номер позиционного аргумента. Мы могли бы записать эту строку, как показано ниже: рг1п!("саада; (0[0]) [в!гвпд]".гогаа!(вув.агро)) При таком подходе первый символ 0 соответствует порядковому номеру позиционного аргумента, а [О] — это индекс элемента внутри аргумента, и такой прием сработает, потому что вув.
а гдо является списком. да( рг1п! оп1сода !аа(а(аогд): рг1п!("бес!аа1 Пех саг (О: 40)".Гогаа!("паае")) рг1п!("-- †--- ----- --- (О:-<40)".(огаа!("")) собе = огд(" ") епб = вув.аахопвсоде »П11а собе < епд: с = сог(собе) пава = оп1содада!а.паап(с, " ° ° опхпоап ° ° ° ") в( оогд 1в попе ог аогд ап папе. 1ооаг(); рг(п!("(О:7) (Огбх) (О: Зс) (1)".Гогаа!( соде, паза.1а11е())) сода += 1 Мы использовали пару пустых строк исключительно для улучшения удобочитаемости. Первые две строки функции выводят строки заголовка.