М. Лутц - Изучаем Python (4-е издание)- 2011 (1126907), страница 61
Текст из файла (страница 61)
Для простых задач можно было бы использовать простые функции преобразования чисел в строки с применением выражения форматирования иливстроенной функции 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’]” # строки формата, это приведет к ошибкеСпециальные приемы форматированияЕще одно сходство с оператором форматирования % состоит в том, что за счет использования дополнительных синтаксических конструкций форматированияимеется возможность выполнять более точное форматирование.
Вслед за идентификатором символа подстановки, через двоеточие, можно указать спецификатор формата, определяющий ширину поля вывода, выравнивание и код типазначения. Ниже приводится формальный синтаксис спецификатора формата:{fieldname!conversionflag:formatspec}Поля спецификатора имеют следующий смысл:•• fieldname – порядковый номер или имя именованного аргумента, за которым может следовать необязательное имя «.name» атрибута или индекс«[index]» элемента.•• conversionflag – может быть r, s или a, которые определяют применениек значению встроенной функции repr, str или ascii соответственно.•• formatspec – определяет способ представления значения, описывает такиехарактеристики представления, как ширина поля вывода, выравнивание,дополнение, количество знаков после десятичной точки и так далее, и завершается необязательным кодом типа значения.Поле formatspec, следующее за двоеточием, в общем виде имеет следующийсинтаксис (квадратные скобки окружают необязательные компоненты и неимеют отношения к синтаксису поля):[[fill]align][sign][#][0][width][.precision][typecode]В поле align может указываться символ <, >, = или ^, обозначающий выравнивание по левому или по правому краю, дополнение после символа знака числаили выравнивание по центру соответственно.