Главная страница
Навигация по странице:

  • Рис. 2.5.

  • Спецификаторы формата

  • Рис. 2.6.

  • Пример: print_unicode.py

  • Программирование на Python 3. Руководство издательство СимволПлюс


    Скачать 3.74 Mb.
    НазваниеРуководство издательство СимволПлюс
    Дата10.11.2022
    Размер3.74 Mb.
    Формат файлаpdf
    Имя файлаПрограммирование на Python 3.pdf
    ТипРуководство
    #780382
    страница13 из 74
    1   ...   9   10   11   12   13   14   15   16   ...   74
    Преобразования
    Когда мы обсуждали числа типа decimal.Decimal, мы отме
    чали, что такие числа могут выводиться одним из двух способов, например:
    Тип
    dict
    , стр. 151
    Числа типа
    Decimal
    , стр. 82

    Строки
    103
    >>> decimal.Decimal("3.4084")
    Decimal('3.4084')
    >>> print(decimal.Decimal("3.4084"))
    3.4084
    Первый способ отображения значения типа decimal.Deci
    mal
    – это репрезентативная форма. Ее назначение состо
    ит в том, чтобы предоставить строку, которая может быть воспринята интерпретатором Python для воссозда
    ния объекта, который она представляет. Программы на языке Python могут прибегать к интерпретации отдель
    ных фрагментов программного кода или целых про
    грамм, поэтому в некоторых ситуациях такая возмож
    ность может оказаться совсем нелишней. Не все объекты могут быть представлены в форме, позволяющей выпол
    нить их воспроизведение; в таких случаях они предо
    ставляются в виде строки, заключенной в угловые скоб
    ки. Например, репрезентативной формой модуля sys яв
    ляется строка "".
    Второй способ отображения значения типа decimal.Decimal – это стро
    ковая форма. Эта форма предназначена для представления человеку,
    поэтому основное ее назначение состоит в том, чтобы отображать ин
    формацию в том виде, в каком она будет иметь определенный смысл для человека. Если тип данных не имеет строковой формы представле
    ния, но необходима именно строка, Python будет использовать репре
    зентативную форму.
    Встроенные типы данных языка Python знакомы с методом str.for
    mat()
    и при передаче их в качестве аргументов этому методу возвраща
    ют соответствующую строку для отображения. В том, чтобы добавить в метод str.format() поддержку собственных типов данных, нет ничего сложного, в этом вы сможете убедиться в главе 6. Кроме того, имеется
    Функция
    eval()
    , стр. 400
    индекс позиционного аргумента
    {0}
    {1[5]}
    {2[capital]}
    {3.rate}
    индекс ключ атрибут
    {title}
    {color[12]}
    {point[y]}
    {book.isbn}
    имя именованного аргумента
    Рис. 2.5. Примеры спецификаторов формата в именах полей с примечаниями

    104
    Глава 2. Типы данных возможность переопределять привычное поведение типов данных и,
    по желанию, заставлять их возвращать строковую или репрезентатив
    ную форму представления. Этого можно добиться путем добавления в поля спецификаторов преобразования. В настоящее время существу
    ет три таких спецификатора: s – для принудительного вывода строко
    вой формы, r – для принудительного вывода репрезентативной формы и a – для принудительного вывода репрезентативной формы, но с ис
    пользованием только символов ASCII. Ниже приводится пример ис
    пользования этих спецификаторов:
    >>> "{0} {0!s} {0!r} {0!a}".format(decimal.Decimal("93.4"))
    "93.4 93.4 Decimal('93.4') Decimal('93.4')"
    В данном случае строковая форма объекта decimal.Decimal совпадает со строкой, предоставляемой для метода str.format(), что является впол
    не обычным делом. Кроме того, в данном конкретном примере нет ни
    какой разницы между репрезентативной формой и репрезентативной формой ASCII, поскольку в обоих случаях используются только сим
    волы ASCII.
    Ниже приводится еще один пример, но на сей раз в нем используется строка, содержащая заголовок фильма «
    » и хранящаяся в переменной movie. Если вывести строку как "{0}".format(movie), она будет выведена без изменений, но если необходимо избежать вывода символов, не входящих в набор ASCII, можно использовать либо вызов ascii(movie)
    , либо выводить ее как "{0!a}".format(movie) – в обоих случа
    ях будет получена строка '\u7ffb\u8a33\u3067\u5931\u308f\u308c\u308b'.
    К настоящему моменту мы знаем, как помещать значения перемен
    ных в строку формата и как принудительно выбирать строковую или репрезентативную форму представления. Теперь мы готовы перейти к рассмотрению приемов форматирования самих значений.
    Спецификаторы формата
    Форматирование целых чисел, чисел с плавающей точкой и строк час
    то бывает вполне удовлетворительным. Но если нам требуется более тонкое управление форматированием, мы легко можем реализовать его с помощью спецификаторов формата. Мы будем отдельно рассмат
    ривать форматирование строк, целых чисел и чисел с плавающей точ
    кой, чтобы было легче разобраться в деталях. Общий синтаксис, кото
    рый в равной мере относится ко всем этим типам данных, показан на рис. 2.6.
    В случае строк мы можем управлять символомзаполнителем, вырав
    ниванием внутри поля, а также минимальной и максимальной шири
    ной поля. Спецификаторы формата для строк начинаются с символа двоеточия (:), за которым следует пара необязательных символов –
    символзаполнитель (который не может быть правой фигурной скоб
    кой }) и символ выравнивания (< – по левому краю, ^ – по центру и > –

    Строки
    105
    по правому краю). Далее следует необязательное число, определяющее минимальную ширину поля вывода, и далее, при желании, через точ
    ку можно указать максимальную ширину поля вывода.
    Обратите внимание, что если указан символзаполнитель, то должно быть указано и направление выравнивания. Мы опустили части спе
    цификатора формата, определяющие знак и тип, потому что на строки они не оказывают никакого влияния. Вполне безопасно (хотя и бес
    смысленно) использовать одно только двоеточие без указания допол
    нительных элементов спецификатора.
    Рассмотрим несколько примеров:
    >>> s = "The sword of truth"
    >>> "{0}".format(s) # форматирование по умолчанию 'The sword of truth'
    >>> "{0:25}".format(s) # минимальная ширина поля вывода 25
    'The sword of truth '
    >>> "{0:>25}".format(s) # выравнивание по правому краю, минимальная ширина 25
    ' The sword of truth'
    >>> "{0:^25}".format(s) # выравнивание по центру, минимальная ширина 25
    ' The sword of truth '
    >>> "{0:^25}".format(s) #  заполнитель, по центру, минимальная ширина 25
    'The sword of truth'
    >>> "{0:.<25}".format(s) # . заполнитель, по левому краю, минимальная ширина 25
    'The sword of truth.......'
    >>> "{0:.10}".format(s) # максимальная ширина поля вывода 10
    'The sword '
    В предпоследнем примере нам пришлось определить выравнивание по левому краю (даже при том, что это – значение по умолчанию). В про
    тивном случае спецификатор формата приобрел бы вид :.25 и просто означал бы максимальную ширину поля вывода 25 символов.
    :
    .точность
    тип
    ширина
    0
    выравнивание
    знак
    заполнитель
    #
    int b, c,
    d, n,
    o, x,
    X;
    floats e, E,
    f, g,
    G, n,
    %
    < по левому краю;
    > по правому краю;
    ^ по центру
    = заполнять нулями прост
    ранство между знаком числа и первой зна
    чащей цифрой
    Любой символ,
    кроме
    }
    + всегда вы
    водить знак;
    – знак выво
    дится,
    только когда необходимо;
    “ ”
    пробел или знак «–»
    префик с для целых чисел
    0b
    , 0o
    , or
    0x
    Дополнение чисел ну лями
    Мини
    мальная ширина поля
    Максимальная ширина поля для строк;
    количество знаков после запятой для чисел с плава
    ющей точкой
    Рис. 2.6. Спецификатор формата в общем виде

    106
    Глава 2. Типы данных
    Как уже отмечалось ранее, внутри спецификатора формата можно ис
    пользовать замещаемые поля. Это делает возможным динамически оп
    ределять формат вывода. Ниже приводится пример, демонстрирую
    щий два способа определить максимальную ширину строки с помо
    щью переменной maxwidth:
    >>> maxwidth = 12
    >>> "{0}".format(s[:maxwidth])
    'The sword of'
    >>> "{0:.{1}}".format(s, maxwidth)
    'The sword of'
    В первом случае используется обычная операция извлечения среза, во втором – вложенное замещаемое поле.
    Применительно к целым числам спецификаторы формата позволяют управлять символомзаполнителем, выравниванием внутри поля вы
    вода, отображением знака числа, минимальной шириной поля и осно
    ванием системы счисления.
    Спецификаторы формата для целых чисел начинаются с двоеточия,
    после которого может следовать пара необязательных символов – сим
    волзаполнитель (который не может быть символом закрывающей фи
    гурной скобки }) и символ выравнивания (< – по левому краю, ^ – по центру, > – по правому краю и = – указывающий на необходимость за
    полнять пространство между знаком числа и первой значащей циф
    рой). Далее следует необязательный символ знака числа: «+» – говорит об обязательной необходимости вывода знака числа, «

    » – знак выво
    дится только для отрицательных чисел, и пробел говорит о том, что для положительных чисел вместо знака числа должен выводиться пробел, а для отрицательных чисел – знак «

    ». Далее следует значение минимальной ширины поля, которому может предшествовать символ
    «#» с обозначением системы счисления (двоичная, восьмеричная или шестнадцатеричная) и символ «0» – в случае необходимости дополне
    ния числа нулями слева. Если число должно выводиться в системе счисления, отличной от десятичной, необходимо указать символ типа системы счисления: «b» – для двоичной, «o» – для восьмеричной, «x» –
    для шестнадцатеричной с символами в нижнем регистре и «X» – для шестнадцатеричной с символами в верхнем регистре. Для полноты картины следует заметить, что допускается использовать символ «d»,
    обозначающий десятичную систему счисления. Существует еще два символа типа: «c», который означает, что должен выводиться символ
    Юникода, соответствующий целому числу, и «n» – когда необходимо обеспечить вывод чисел с учетом региональных настроек.
    Дополнение нулями слева можно реализовать двумя способами:
    >>> "{0:0=12}".format(8749203) # 0  символзаполнитель, минимальная ширина 12
    '000008749203'
    >>> "{0:0=12}".format(8749203)# 0  символзаполнитель, минимальная ширина 12
    '00008749203'

    Строки
    107
    >>> "{0:012}".format(8749203) # дополнение 0 и минимальная ширина 12
    '000008749203'
    >>> "{0:012}".format(8749203) # дополнение 0 и минимальная ширина 12
    '00008749203'
    В первых двух примерах 0 определяется как символзаполнитель, кото
    рым заполняется пространство между знаком числа и первой значащей цифрой (=). Во вторых двух примерах определяется минимальная ши
    рина поля 12 символов и признак необходимости дополнения нулями.
    Ниже приводится несколько примеров управления выравниванием:
    >>> "{0:*<15}".format(18340427) # * символзаполнитель, выравнивание '18340427*******' # по левому краю, минимальная ширина 15
    >>> "{0:*>15}".format(18340427) # * символзаполнитель, выравнивание '*******18340427' # по правому краю, минимальная ширина 15
    >>> "{0:*^15}".format(18340427) # * символзаполнитель, выравнивание '***18340427****' # по центру, минимальная ширина 15
    >>> "{0:*^15}".format(18340427) # * символзаполнитель, выравнивание '***18340427***' # по центру, минимальная ширина 15
    Ниже приводится несколько примеров управления выводом знака числа:
    >>> "[{0: }] [{1: }]".format(539802, 539802) # пробел или знак ""
    '[ 539802] [539802]'
    >>> "[{0:+}] [{1:+}]".format(539802, 539802) # знак выводится принудительно '[+539802] [539802]'
    >>> "[{0:}] [{1:}]".format(539802, 539802) # знак "" выводится только '[539802] [539802]' # при необходимости
    Далее следуют два примера использования символов управления типом:
    >>> "{0:b} {0:o} {0:x} {0:X}".format(14613198)
    '110111101111101011001110 67575316 deface DEFACE'
    >>> "{0:#b} {0:#o} {0:#x} {0:#X}".format(14613198)
    '0b110111101111101011001110 0o67575316 0xdeface 0XDEFACE'
    Для целых чисел невозможно определить максимальную ширину по
    ля вывода, потому что в противном случае это может повлечь необхо
    димость отсечения значащих цифр числа и вывод числа, не имеющего смысла.
    Последний символ управления форматом вывода целых чисел (доступ
    ный также для чисел с плавающей точкой) – это символ «n». Он имеет то же действие, что и символ «d» в случае вывода целых чисел или сим
    вол «g» в случае вывода чисел с плавающей точкой. Отличительной особенностью символа «n» является то, что он учитывает региональ
    ные настройки, то есть использует характерный для текущего региона символразделитель целой и дробной части числа и разделитель разря
    дов. Регион, используемый по умолчанию, называется «C», и для это
    го региона в качестве разделителя целой и дробной части числа ис
    пользуется точка, а в качестве разделителя разрядов – пустая строка.

    108
    Глава 2. Типы данных
    Чтобы иметь возможность принимать во внимание региональные на
    стройки пользователя, в начале программы в качестве двух первых выполняемых инструкций можно добавить следующие две строки:
    1
    import locale locale.setlocale(locale.LC_ALL, "")
    Передавая пустую строку в качестве названия региона, мы тем самым предлагаем интерпретатору попытаться автоматически определить ре
    гион пользователя (например, путем определения значения перемен
    ной окружения LANG) и перейти на использование региона «C» в случае неудачи. Ниже приводятся несколько примеров, демонстрирующих влияние различных региональных настроек на вывод целых и вещест
    венных чисел:
    x, y = (1234567890, 1234.56)
    locale.setlocale(locale.LC_ALL, "C")
    c = "{0:n} {1:n}".format(x, y) # c == "1234567890 1234.56"
    locale.setlocale(locale.LC_ALL, "en_US.UTF8")
    en = "{0:n} {1:n}".format(x, y) # en == "1,234,567,890 1,234.56"
    locale.setlocale(locale.LC_ALL, "de_DE.UTF8")
    de = "{0:n} {1:n}".format(x, y) # de == "1.234.567.890 1.234,56"
    Символ «n» очень удобно использовать с целыми числами, но при вы
    воде чисел с плавающей точкой он имеет ограниченное применение,
    потому что большие вещественные числа выводятся в экспоненциаль
    ной форме.
    При выводе чисел с плавающей точкой спецификаторы формата дают возможность управлять символомзаполнителем, выравниванием в пре
    делах поля вывода, выводом знака числа, минимальной шириной поля,
    числом знаков после десятичной точки и формой представления – про
    стая, экспоненциальная или в виде процентов.
    Для форматирования чисел с плавающей точкой используются те же самые спецификаторы, что и для целых чисел, с двумя отличиями в конце. После необязательного значения минимальной ширины поля вывода можно указать число знаков после десятичной точки, добавив символ точки и целое число. В самом конце мы можем указать символ типа: «e» – для вывода числа в экспоненциальной форме, с символом
    «e» в нижнем регистре; «E» – для вывода числа в экспоненциальной форме, с символом «E» в верхнем регистре; «f» – для вывода числа в стандартной форме, «g» – для вывода числа в «общей» форме, то есть для небольших чисел действует как символ «f», а для очень больших –
    как символ «e», и «G» – то же самое, что символ «g», только использу
    1
    В программах, имеющих несколько потоков выполнения, функцию loca
    le.setlocale()
    лучше вызывать всего один раз, на этапе запуска програм
    мы, и еще до того, как будут запущены дополнительные потоки, поскольку эту функцию обычно небезопасно вызывать в многопоточном окружении.

    Строки
    109
    ется формат либо «f», либо «E». Кроме того, допускается использовать символ «%», при использовании которого выводимое число умножает
    ся на 100 и для вывода применяется формат «f», с добавлением симво
    ла «%» в конце числа.
    Ниже приводятся несколько примеров вывода числа в экспоненциаль
    ной и стандартной форме:
    >>> amount = (10 ** 3) * math.pi
    >>> "[{0:12.2e}] [{0:12.2f}]".format(amount)
    '[ 3.14e+03] [ 3141.59]'
    >>> "[{0:*>12.2e}] [{0:*>12.2f}]".format(amount)
    '[****3.14e+03] [*****3141.59]'
    >>> "[{0:*>+12.2e}] [{0:*>+12.2f}]".format(amount)
    '[***+3.14e+03] [****+3141.59]'
    В первом примере установлена минимальная ширина поля вывода
    12 символов и 2 знака после десятичной точки. Второй пример постро
    ен на основе первого и к нему добавлен вывод символазаполнителя
    «*». При использовании символазаполнителя необходимо указывать символ выравнивания, поэтому мы указали выравнивание по правому краю (даже при том, что этот способ выравнивания используется по умолчанию для чисел). Третий пример построен на основе двух преды
    дущих, в нем добавлен символ «+» управления принудительным выво
    дом знака числа.
    К моменту написания этих строк в языке Python отсутствовали средст
    ва прямого управления форматированием комплексных чисел. Одна
    ко мы легко можем решить эту проблему, форматируя действитель
    ную и мнимую части как отдельные числа с плавающей точкой. На
    пример:
    >>> "{0.real:.3f}{0.imag:+.3f}j".format(4.75917+1.2042j)
    '4.759+1.204j'
    >>> "{0.real:.3f}{0.imag:+.3f}j".format(4.759171.2042j)
    '4.7591.204j'
    Мы обращаемся к каждому атрибуту комплексного числа по отдельно
    сти и форматируем их как числа с плавающей точкой с тремя знаками после запятой. Кроме того, мы принудительно выводим знак мнимой части, добавляя символ j.
    Пример: print_unicode.py
    В предыдущих подразделах мы детально исследовали спецификаторы формата для метода str.format() и видели достаточно много фрагментов программного кода, демонстрирующих аспекты их применения на практике. В этом подподразделе мы рассмотрим небольшой, но доста
    точно поучительный пример использования метода str.format(), в кото
    ром мы увидим применение спецификаторов формата в реальном кон
    тексте. В примере также используются некоторые строковые методы,

    110
    Глава 2. Типы данных с которыми мы познакомились в предыдущем разделе, и вводится в использование функция из модуля unicodedata.
    1
    Эта программа состоит всего из 25 строк выполняемого программного кода. Она импортирует два модуля, sys и unicodedata, и определяет од
    ну функцию – print_unicode_table(). Рассмотрение примера мы начнем с запуска программы, чтобы увидеть, что она делает; затем мы рас
    смотрим программный код в конце программы, где выполняется вся фактическая работа; и в заключение рассмотрим функцию, определяе
    мую в программе.
    print_unicode.py spoked decimal hex chr name
       
    10018 2722
    ✢ Four TeardropSpoked Asterisk
    10019 2723
    ✣ Four BalloonSpoked Asterisk
    10020 2724
    ✤ Heavy Four BalloonSpoked Asterisk
    10021 2725
    ✥ Four ClubSpoked Asterisk
    10035 2733
    ✳ Eight Spoked Asterisk
    10043 273B
    ✽ TeardropSpoked Asterisk
    10044 273C
    ✼ Open Centre TeardropSpoked Asterisk
    10045 273D
    ✽✽ Heavy TeardropSpoked Asterisk
    10051 2743
    ❃ Heavy TeardropSpoked Pinwheel Asterisk
    10057 2749
    ❈ BalloonSpoked Asterisk
    10058 274A
    ❊ Eight TeardropSpoked Propeller Asterisk
    10059 274B
    ❋ Heavy Eight TeardropSpoked Propeller Asterisk
    При запуске без аргументов программа выводит таблицу всех символов
    Юникода, начиная с пробела и до символа с наибольшим возможным кодом. При запуске с аргументом, как показано в примере, выводятся только те строки таблицы, где в названии символов Юникода содер
    жится значение строкиаргумента, переведенной в нижний регистр.
    word = None if len(sys.argv) > 1:
    if sys.argv[1] in ("h", "help"):
    print("usage: {0} [string]".format(sys.argv[0]))
    word = 0
    else:
    word = sys.argv[1].lower()
    1
    Эта программа предполагает, что консоль настроена на ра
    боту в кодировке UTF8. К сожалению, консоль в операцион
    ной системе Windows имеет весьма ограниченную поддерж
    ку UTF8, а консоль в системе Mac OS X по умолчанию ис
    пользует кодировку Apple Roman. Чтобы обойти эти ограни
    чения, в состав примеров к книге включен файл print_
    unicode_uni.py
    – версия программы, выполняющая вывод в файл, который затем может быть открыт в редакторе, та
    ком как IDLE, поддерживающем кодировку UTF8.
    Глава 7, рабо
    та с файлами, стр. 334

    Строки
    1   ...   9   10   11   12   13   14   15   16   ...   74


    написать администратору сайта