На этом шаге мы рассмотрим параметры и использование этого метода.
Помимо операции форматирования, мы можем использовать для этой же цели метод format(). Он имеет следующий синтаксис:
<Строка> = <Строка специального формата>.format(*args, **kwargs)
В параметре <Строка специального формата> внутри символов фигурных скобок: { и } - указываются спецификаторы, имеющие следующий синтаксис:
{[<Поле>][!<Функция>][:<Формат>]}
Все символы, расположенные вне фигурных скобок, выводятся без преобразований. Если внутри строки необходимо использовать символы { и }, то эти символы следует удвоить, иначе возбуждается исключение ValueError. Пример:
>>> print("Символы {{ и }} - {0}".format("специальные")) Символы { и } - специальные
В параметре <Поле> можно указать индекс позиции (нумерация начинается с нуля) или ключ. Допустимо комбинировать позиционные и именованные параметры, В этом случае в методе format () именованные параметры указываются в самом конце. Пример:
>>> "{0} - {1} - {2}".format(10, 12.3, "string") # Индексы '10 - 12.3 - string' >>> arr = [10, 12.3, "string"] >>> "{0} - {1} - {2}".format(*arr) # Индексы '10 - 12.3 - string' >>> "{model} - {color}".format(color="red", model="BMW") # Ключи 'BMW - red' >>> d = {"color": "red", "model": "BMW"} >>> "{model} - {color}".format(**d) # Ключи 'BMW - red' >>> "{color} - {0}".format(2015, color="red") # Комбинация 'red - 2015'
В качестве параметра в методе format () можно указать объект. Для доступа к элементам по индексу внутри строки формата применяются квадратные скобки, а для доступа к атрибутам объекта используется точечная нотация:
>>> arr = [10, 12.3, "string"] >>> "{0[0]} - {0[1]} - {0[2]}".format(arr) # Индексы '10 - 12.3 - string' >>> "{arr[0]} - {arr[2]}".format(arr=arr) # Индексы '10 - string' >>> class Car: color, model = "red", "BMW" >>> car = Car() >>> "{0.model} - {0.color}".format(car) # Атрибуты 'BMW - red'
Существует также краткая форма записи, при которой параметр <Поле> не указывается. В этом случае скобки без указанного индекса нумеруются слева направо, начиная с нуля:
>>> "{} - {} - {} - {n}".format(1, 2, 3, n=4) # {0} - {1} - {2} - {n} '1 - 2 - 3 - 4' >>> "{} - {} - {n} - {}".format(1, 2, 3, n=4) # {0} - {1} - {n} - {2} '1 - 2 - 4 - 3'
Параметр <Функция> задает функцию, с помощью которой обрабатываются данные перед вставкой в строку. Если указано значение s, то данные обрабатываются функцией str (), если значение r, то функцией repr (), а если значение a, то функцией ascii (). Если параметр не указан, то для преобразования данных в строку используется функция str(). Пример:
>>> print("{0!s}".format("строка")) # str() строка >>> print("{0!r}".format("строка")) # repr() 'строка' >>> print("{0!a}".format("строка")) # ascii() '\u0441\u0442\u0440\u043e\u043a\u0430'
В параметре <Формат> указывается значение, имеющее следующий синтаксис:
[[<Заполнитель>]<Выравнивание>][<Знак>][#][0][<Ширина>][,] [.<Точность>][<Преобразование>]
>>> "'{0:10}' '{1:3}'".format(3, "string") "' 3' 'string'"
Ширину поля можно передать в качестве параметра в методе format (). В этом случае вместо числа указывается индекс параметра внутри фигурных скобок:
>>> "'{0:{1}}'".format(3, 10) # 10 - это ширина поля "' 3'"
>>> "'{0:<10}' '{1:>10}' '{2:^10}'".format(3, 3, 3) "'3 ' ' 3' ' 3 '"
>>> "'{0:=10}' '{1:=10}'".format(-3, 3) "'- 3' ' 3'"
Как видно из приведенного примера, пространство между знаком и числом по умолчанию заполняется пробелами, а знак положительного числа не указывается. Чтобы вместо пробелов пространство заполнялось нулями, необходимо указать нуль перед шириной поля:
>>> "'{0:=010}' '{1:=010}'".format(-3, 3) "'-000000003' '0000000003'"
>>> "'{0:0=10}' '{1:0=10}'".format(-3, 3) "'-000000003' '0000000003'" >>> "'{0:*<10}' '{1:+>10}' '{2:.^10}'".format(3, 3, 3) "'3*********' '+++++++++3' '....3.....'"
>>> "'{0:+}' '{1:+}' '{0:-}' '{1:-}'".format(-3, 3) "'-3' '+3' '-3' '3'" >>> "'{0: }' '{1: }'".format(-3, 3) # Пробел "'-3' ' 3'"
>>> "'{0:b}' '{0:#b}'".format(3) "'11' '0b11'"
>>> "'{0:c}'".format(100) "'d'"
>>> import locale >>> locale.setlocale(locale.LC_NUMERIC, 'Russian_Russia.1251') 'Russian_Russia.1251' >>> print("{0:n}".format(100000000).replace("\uffa0", " ")) 100 000 000
В Python 3 между разрядами вставляется символ с кодом \uffa0, который отображается квадратиком. Чтобы вывести символ пробела, мы производим замену в строке с помощью метода replace (). В Python версии 2 поведение было другим. Там вставлялся символ с кодом \ха0 и не нужно было производить замену. Чтобы в Python 3 вставлялся символ с кодом \ха0, следует воспользоваться функцией format () из модуля locale:
>>> import locale >>> locale.setlocale(locale.LC_NUMERIC, 'Russian_Russia.1251') 'Russian_Russia.1251' >>> print(locale.format('%d', 100000000, grouping=True)) 100 000 000 >>> locale.localeconv()["thousands_sep"] '\xa0'
Можно также разделить тысячные разряды запятой, указав ее в строке формата;
>>> print("{0:,d}".format(100000000)) 100,000,000
>>> "'{0:d}' '{0:o}' '{0:#o}'".format(511) "'511' '777' '0o777'"
>>> "'{0:x}' '{0:#x}'".format(255) "'ff' '0xff'"
>>> "'{0:X}' '{0:#X}'".format(255) "'FF' '0XFF'"
>>> "'{0:f}' '{1:f}' '{2:f}'".format(30, 18.6578145, -2.5) "'30.000000' '18.657815' '-2.500000'"
>>> "'{0:.7f}' '{1:.2f}'".format(18.6578145, -2.5) "'18.6578145' '-2.50'"
>>> "'{0:e}' '{1:e}'".format(3000, 18657.81452) "'3.000000e+03' '1.865781e+04'"
>>> "'{0:E}' '{1:E}'".format(3000, 18657.81452) "'3.000000E+03' '1.865781E+04'"
Здесь по умолчанию количество знаков после запятой также равно шести, но мы можем указать другую величину этого параметра:
>>> "'{0:.2e}' '{1:.2e}'".format(3000, 18657.81452) "'3.00e+03' '1.87e+04'"
>>> "'{0:g}' '{1:g}'".format(0.86578, 0.000086578) "'0.86578' '8.6578e-05'"
>>> "'{0:G}' '{1:G}'".format(0.86578, 0.000086578) "'0.86578' '8.6578E-05'"
>>> "'{0:%}' '{1:.4%}'".format(0.86578, 0.000086578) "'86.578000%' '0.0087%'"
На следующем шаге мы рассмотрим функции и методы для работы со строками.