Марк Лутц - Изучаем Python, Четвертое издание (1184811), страница 62
Текст из файла (страница 62)
В общем виде синтаксис использования спецификатора форматавыглядит следующим образом:%[(name)][flags][width][.precision]codeСимвол спецификатора формата (code) из табл. 7.4 располагается в самом конце. Между символом % и символом спецификатора можно добавлять следующую информацию: ключ в словаре (name); список флагов (flags), которые могутопределять, например, признак выравнивания (-), знак числа (+), наличие ведущих нулей (0); общую ширину поля и число знаков после десятичной точкии многое другое.
Параметры формата width и precision могут также приниматьзначение *, чтобы показать, что фактические значения этих параметров должны извлекаться из следующего элемента в списке входных значений.Полное описание синтаксиса спецификаторов формата вы найдете в стандартном руководстве по языку Python, а сейчас для демонстрации наиболее типичных случаев их использования приведем несколько примеров. В первом примере сначала применяется форматирование целого числа с параметрами поумолчанию, а затем целое число выводится в поле шириной в шесть символов,с выравниванием по левому краю и с дополнением ведущими нулями:>>> x = 1234>>> res = “integers: ...%d...%-6d...%06d” % (x, x, x)>>> res‘integers: ...1234...1234 ...001234’Спецификаторы %e, %f и %g отображают вещественные числа разными способами, как демонстрируется в следующем примере:>>> x = 1.23456789>>> x1.2345678899999999>>> ‘%e | %f | %g’ % (x, x, x)‘1.234568e+00 | 1.234568 | 1.23457’>>> ‘%E’ % x‘1.234568E+00’Для вещественных чисел можно реализовать дополнительные эффекты форматирования, указав необходимость выравнивания по левому краю, дополнениеведущими нулями, знак числа, ширину поля и число знаков после десятичнойточки.
Для простых задач можно было бы использовать простые функции преобразования чисел в строки с применением выражения форматирования иливстроенной функции str, продемонстрированной ранее:>>> ‘%-6.2f | %05.2f | %+06.1f’ % (x, x, x)‘1.23 | 01.23 | +001.2’238Глава 7. Строки>>> “%s” % x, str(x)(‘1.23456789’, ‘1.23456789’)Если ширина поля и количество знаков после десятичной точки заранее не известны, их можно вычислять во время выполнения, а в строке формата вместофактических значений использовать символ *, чтобы указать интерпретатору,что эти значения должны извлекаться из очередного элемента в списке входных значений, справа от оператора %. Число 4 в кортеже определяет количествознаков после десятичной точки:>>> ‘%f, %.2f, %.*f’ % (1/3.0, 1/3.0, 4, 1/3.0)‘0.333333, 0.33, 0.3333’Если вас заинтересовала эта особенность, поэкспериментируйте самостоятельно с этими примерами, чтобы получить более полное представление.Форматирование строк из словаряОперация форматирования позволяет также использовать в спецификаторахформата ссылки на ключи словаря, который указывается в правой части выражения, для извлечения соответствующих значений.
Мы пока немного говорили о словарях, поэтому следующий пример демонстрирует самый простойслучай:>>> “%(n)d %(x)s” % {“n”:1, “x”:”spam”}‘1 spam’В данном случае (n) и (x) в строке формата ссылаются на ключи в словаре в правой части выражения и служат для извлечения соответствующих им значений.
Этот прием часто используется в программах, создающих код разметкиHTML или XML, – вы можете построить словарь значений и затем подставитьих все одним выражением форматирования, которое использует ключи:>>> reply = “””# Шаблон с замещаемыми спецификаторами форматаGreetings...Hello %(name)s!Your age squared is %(age)s“””>>> values = {‘name’: ‘Bob’, ‘age’: 40}# Подготовка фактических значений>>> print reply % values# Подстановка значенийGreetings...Hello Bob!Your age squared is 40Этот способ также часто используется в комбинации со встроенной функциейvars, которая возвращает словарь, содержащий все переменные, существующие на момент ее вызова:>>> food = ‘spam’>>> age = 40>>> vars(){‘food’: ‘spam’, ‘age’: 40, ...и еще множество других...
}Если задействовать эту функцию в правой части оператора форматирования,можно отформатировать значения, обращаясь к ним по именам переменных(то есть по ключам словаря):Метод форматирования строк239>>> “%(age)d %(food)s” % vars()‘40 spam’Словари во всех подробностях мы будем изучать в главе 8. А в главе 5 вы найдете примеры использования спецификаторов %x и %o для преобразования значений в шестнадцатеричное и восьмеричное строковое представление.Метод форматирования строкКак уже упоминалось выше, в ���������������������������������������������Python��������������������������������������� 2.6 и 3.0 появился новый способ форматирования строк, более близкий по духу к идеям языка Python. В отличие отвыражений форматирования, метод форматирования не так сильно опираетсяна модель функции «�������������������������������������������������������printf�������������������������������������������������» языка C и имеет более подробный и явный синтаксис.
С другой стороны, новый способ по-прежнему опирается на некоторые концепции функции «printf», такие как символы и параметры спецификаторовформата. Кроме того, возможности метода форматирования в значительнойстепени пересекаются с возможностями выражений форматирования (иногда,правда, за счет большего объема программного кода) и могут выполнять стольже сложные операции форматирования. Вследствие этого сложно сказать, какой из двух способов лучше, поэтому для большинства программистов совсемне лишним будет знакомство с обоими.ОсновыВ двух словах, новый метод format объектов строк, появившийся в версиях 2.6и 3.0 (и выше), использует строку, относительно которой он вызывается, какшаблон и принимает произвольное количество аргументов, представляющихзначения для подстановки.
Фигурные скобки внутри строки шаблона используются для обозначения замещаемых спецификаторов и их параметров,которые могут определять порядковые номера позиционных аргументов (например, {1}) или имена именованных аргументов (например, {food}). В главе 18вы узнаете, что аргументы могут передаваться функциям и методам в виде позиционных и именованных аргументов, а язык Python��������������������������������������������������предоставляет возможность создавать функции и методы, способные принимать произвольное количество позиционных и именованных аргументов.
Ниже приводится несколькопримеров использования метода format в Python 2.6 и 3.0:>>> template = ‘{0}, {1} and {2}’ # Порядковые номера позиционных аргументов>>> template.format(‘spam’, ‘ham’, ‘eggs’)‘spam, ham and eggs’>>> template = ‘{motto}, {pork} and {food}’# Имена именованных аргументов>>> template.format(motto=’spam’, pork=’ham’, food=’eggs’)‘spam, ham and eggs’>>> template = ‘{motto}, {0} and {food}’# Оба варианта>>> template.format(‘ham’, motto=’spam’, food=’eggs’)‘spam, ham and eggs’Естественно, строка шаблона также может быть литералом, кроме того, сохраняется возможность подстановки значений объектов любых типов:>>> ‘{motto}, {0} and {food}’.format(42, motto=3.14, food=[1, 2])‘3.14, 42 and [1, 2]’240Глава 7.
СтрокиКак и при использовании оператора форматирования % и других строковых методов, метод format создает и возвращает новый объект строки, который можно тут же вывести на экран или сохранить для последующего использования(не забывайте, что строки являются неизменяемыми объектами, поэтому метод format вынужден создавать новый объект). Возможность форматированиястрок может использоваться не только для их отображения:>>> X = ‘{motto}, {0} and {food}’.format(42, motto=3.14, food=[1, 2])>>> X‘3.14, 42 and [1, 2]’>>> X.split(‘ and ‘)[‘3.14, 42’, ‘[1, 2]’]>>> Y = X.replace(‘and’, ‘but under no circumstances’)>>> Y‘3.14, 42 but under no circumstances [1, 2]’Использование ключей, атрибутов и смещенийКак и оператор форматирования %, метод format обладает дополнительнымивозможностями. Например, в строках формата допускается ссылаться на имена атрибутов объектов и ключи словарей, – как и в привычном синтаксисеязыка ������������������������������������������������������������������Python������������������������������������������������������������, квадратные скобки обозначают ключи словаря, а точка применяется для организации доступа к атрибутам объектов, на которые ссылаютсяпозиционные или именованные спецификаторы.
В первом примере ниже демонстрируется подстановка значения ключа «������������������������������spam��������������������������» словаря и значения атрибута «platform» объекта импортированного модуля sys, которые передаютсякак позиционные аргументы. Во втором примере делается то же самое, но наэтот раз объекты для подстановки передаются в виде именованных аргументов:>>> import sys>>> ‘My {1[spam]} runs {0.platform}’.format(sys, {‘spam’: ‘laptop’})‘My laptop runs win32’>>> ‘My {config[spam]} runs {sys.platform}’.format(sys=sys,config={‘spam’: ‘laptop’})‘My laptop runs win32’В квадратных скобках в строках формата можно также указывать смещениеот начала списка (или любой другой последовательности), но при этом допускается использовать только положительные смещения, поэтому данная возможность не является достаточно универсальной, как можно было бы подумать.Как и в операторе %, чтобы обратиться по отрицательному смещению, получитьсрез или вставить результат произвольного выражения, данные для подстановки должны быть подготовлены отдельными выражениями, за пределами строки формата:>>> somelist = list(‘SPAM’)>>> somelist[‘S’, ‘P’, ‘A’, ‘M’]>>> ‘first={0[0]}, third={0[2]}’.format(somelist)‘first=S, third=A’Метод форматирования строк241>>> ‘first={0}, last={1}’.format(somelist[0], somelist[-1]) # Если [-1]‘first=S, last=M’ # использовать внутри строки формата, это приведет к ошибке>>> parts = somelist[0], somelist[-1], somelist[1:3] # Если [1:3]>>> ‘first={0}, last={1}, middle={2}’.format(*parts) # использовать внутри“first=S, last=M, middle=[‘P’, ‘A’]” # строки формата, это приведет к ошибкеСпециальные приемы форматированияЕще одно сходство с оператором форматирования % состоит в том, что за счет использования дополнительных синтаксических конструкций форматированияимеется возможность выполнять более точное форматирование.