Форматирование строк с помощью метода format
Если для подстановки требуется только один аргумент, то значение - сам аргумент:
>>> 'Hello, {}!'.format('Vasya')'Hello, Vasya!'А если несколько, то значениями будут являться все аргументы со строками подстановки (обычных или именованных):
>>> '{0}, {1}, {2}'.format('a', 'b', 'c')'a, b, c'>>> '{}, {}, {}'.format('a', 'b', 'c')'a, b, c'>>> '{2}, {1}, {0}'.format('a', 'b', 'c')'c, b, a'>>> '{2}, {1}, {0}'.format(*'abc')'c, b, a'>>> '{0}{1}{0}'.format('abra', 'cad')'abracadabra'>>> 'Coordinates: {latitude}, {longitude}'.format(latitude='37.24N', longitude='-115.81W')'Coordinates: 37.24N, -115.81W'>>> coord = {'latitude': '37.24N', 'longitude': '-115.81W'}>>> 'Coordinates: {latitude}, {longitude}'.format(**coord)'Coordinates: 37.24N, -115.81W'Однако метод format умеет большее. Вот его синтаксис:
поле замены ::= "{" [имя поля] ["!" преобразование] [":" спецификация] "}"имя поля ::= arg_name ("." имя атрибута | "[" индекс "]")*преобразование ::= "r" (внутреннее представление) | "s" (человеческое представление)спецификация ::= см. нижеНапример:
Теперь спецификация формата:
спецификация ::= [[fill]align][sign][#][0][width][,][.precision][type]заполнитель ::= символ кроме '{' или '}'выравнивание ::= "<" | ">" | "=" | "^"знак ::= "+" | "-" | " "ширина ::= integerточность ::= integerтип ::= "b" | "c" | "d" | "e" | "E" | "f" | "F" | "g" | "G" | "n" | "o" | "s" | "x" | "X" | "%"Выравнивание производится при помощи символа-заполнителя. Доступны следующие варианты выравнивания:
Флаг | Значение |
'<' | Символы-заполнители будут справа (выравнивание объекта по левому краю) (по умолчанию). |
'>' | выравнивание объекта по правому краю. |
'=' | Заполнитель будет после знака, но перед цифрами. Работает только с числовыми типами. |
'^' | Выравнивание по центру. |
Опция "знак" используется только для чисел и может принимать следующие значения:
Флаг | Значение |
'+' | Знак должен быть использован для всех чисел. |
'-' | '-' для отрицательных, ничего для положительных. |
'Пробел' | '-' для отрицательных, пробел для положительных. |
Поле "тип" может принимать следующие значения:
Тип | Значение |
'd', 'i', 'u' | Десятичное число. |
'o' | Число в восьмеричной системе счисления. |
'x' | Число в шестнадцатеричной системе счисления (буквы в нижнем регистре). |
'X' | Число в шестнадцатеричной системе счисления (буквы в верхнем регистре). |
'e' | Число с плавающей точкой с экспонентой (экспонента в нижнем регистре). |
'E' | Число с плавающей точкой с экспонентой (экспонента в верхнем регистре). |
'f', 'F' | Число с плавающей точкой (обычный формат). |
'g' | Число с плавающей точкой. с экспонентой (экспонента в нижнем регистре), если она меньше, чем -4 или точности, иначе обычный формат. |
'G' | Число с плавающей точкой. с экспонентой (экспонента в верхнем регистре), если она меньше, чем -4 или точности, иначе обычный формат. |
'c' | Символ (строка из одного символа или число - код символа). |
's' | Строка. |
'%' | Число умножается на 100, отображается число с плавающей точкой, а за ним знак %. |
И напоследок, несколько примеров:
>>> coord = (3, 5)>>> 'X: {0[0]}; Y: {0[1]}'.format(coord)'X: 3; Y: 5' >>> "repr() shows quotes: {!r}; str() doesn't: {!s}".format('test1', 'test2')"repr() shows quotes: 'test1'; str() doesn't: test2" >>> '{:<30}'.format('left aligned')'left aligned '>>> '{:>30}'.format('right aligned')' right aligned'>>> '{:^30}'.format('centered')' centered '>>> '{:*^30}'.format('centered') # use '*' as a fill char'***********centered***********' >>> '{:+f}; {:+f}'.format(3.14, -3.14) # show it always'+3.140000; -3.140000'>>> '{: f}; {: f}'.format(3.14, -3.14) # show a space for positive numbers' 3.140000; -3.140000'>>> '{:-f}; {:-f}'.format(3.14, -3.14) # show only the minus -- same as '{:f}; {:f}''3.140000; -3.140000' >>> # format also supports binary numbers>>> "int: {0:d}; hex: {0:x}; oct: {0:o}; bin: {0:b}".format(42)'int: 42; hex: 2a; oct: 52; bin: 101010'>>> # with 0x, 0o, or 0b as prefix:>>> "int: {0:d}; hex: {0:#x}; oct: {0:#o}; bin: {0:#b}".format(42)'int: 42; hex: 0x2a; oct: 0o52; bin: 0b101010' >>> points = 19.5>>> total = 22>>> 'Correct answers: {:.2%}'.format(points/total)'Correct answers: 88.64%'Метод format является наиболее правильным, но часто можно встретить программный код с форматированием строк в форме оператора %.
Форматирование строк с помощью оператора %
Если для подстановки требуется только один аргумент, то значение - сам аргумент:
>>> 'Hello, %s!' % 'Vasya''Hello, Vasya!'А если несколько, то значением будет являться кортеж со строками подстановки:
>>> '%d %s, %d %s' % (6, 'bananas', 10, 'lemons')'6 bananas, 10 lemons'Теперь, а почему я пишу то %d, то %s? А всё зависит от того, что мы используем в качестве подстановки и что мы хотим получить в итоге.
Формат | Что получится |
'%d', '%i', '%u' | Десятичное число. |
'%o' | Число в восьмеричной системе счисления. |
'%x' | Число в шестнадцатеричной системе счисления (буквы в нижнем регистре). |
'%X' | Число в шестнадцатеричной системе счисления (буквы в верхнем регистре). |
'%e' | Число с плавающей точкой с экспонентой (экспонента в нижнем регистре). |
'%E' | Число с плавающей точкой с экспонентой (экспонента в верхнем регистре). |
'%f', '%F' | Число с плавающей точкой (обычный формат). |
'%g' | Число с плавающей точкой. с экспонентой (экспонента в нижнем регистре), если она меньше, чем -4 или точности, иначе обычный формат. |
'%G' | Число с плавающей точкой. с экспонентой (экспонента в верхнем регистре), если она меньше, чем -4 или точности, иначе обычный формат. |
'%c' | Символ (строка из одного символа или число - код символа). |
'%r' | Строка (литерал python). |
'%s' | Строка (как обычно воспринимается пользователем). |
'%%' | Знак '%'. |
Спецификаторы преобразования записываются в следующем порядке:
1. %.
2. Ключ (опционально), определяет, какой аргумент из значения будет подставляться.
3. Флаги преобразования.
4. Минимальная ширина поля. Если *, значение берётся из кортежа.
5. Точность, начинается с '.', затем - желаемая точность.
6. Модификатор длины (опционально).
7. Тип (см. таблицу выше).
>>> print ('%(language)s has %(number)03d quote types.' % {"language": "Python", "number": 2})Python has 002 quote types.Флаги преобразования:
Флаг | Значение |
"#" | Значение будет использовать альтернативную форму. |
"0" | Свободное место будет заполнено нулями. |
"-" | Свободное место будет заполнено пробелами справа. |
" " | Свободное место будет заполнено пробелами справа. |
"+" | Свободное место будет заполнено пробелами слева. |
Списки (list)
Списки в Python - упорядоченные изменяемые коллекции объектов произвольных типов (почти как массив, но типы могут отличаться).
Чтобы использовать списки, их нужно создать. Создать список можно несколькими способами. Например, можно обработать любой итерируемый объект (например, строку) встроенной функцией list:
>>> list('список')['с', 'п', 'и', 'с', 'о', 'к']Список можно создать и при помощи литерала:
>>> s = [] # Пустой список>>> l = ['s', 'p', ['isok'], 2]>>> s[]>>> l['s', 'p', ['isok'], 2]Как видно из примера, список может содержать любое количество любых объектов (в том числе и вложенные списки), или не содержать ничего.
И еще один способ создать список - это генераторы списков. Генератор списков - способ построить новый список, применяя выражение к каждому элементу последовательности. Генераторы списков очень похожи на цикл for.
>>> c = [c * 3 for c in 'list']>>> c['lll', 'iii', 'sss', 'ttt']Возможна и более сложная конструкция генератора списков:
>>> c = [c * 3 for c in 'list' if c != 'i']>>> c['lll', 'sss', 'ttt']>>> c = [c + d for c in 'list' if c != 'i' for d in 'spam' if d != 'a']>>> c['ls', 'lp', 'lm', 'ss', 'sp', 'sm', 'ts', 'tp', 'tm']Но в сложных случаях лучше пользоваться обычным циклом for для генерации списков.