English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Подробное объяснение функции форматирования строк str.format в Python

преамбула

Python в версии 2.6 добавил новый метод форматирования строк: str.format(). Основная грамматика использует {} и : для замены прежних %.

грамматика占位符 при форматировании:

replacement_field ::= "{" [field_name] ["!" conversion] [":" format_spec] "}"

правило "переноса"

через позицию

str.format() может принимать неограниченное количество параметров, порядок может не соблюдаться:

>>> "{0} {1}".format("hello", "world")
'hello world'
>>> "{} {}".format("hello", "world")
'hello world'
>>> "{1} {0} {1}".format("hello", "world")
'мир hello мир'

через ключевые параметры

Использование ключевых параметров требует указания имен параметров в строке:

>>> "Я {name}, возраст {age}".format(name="huoty", age=18)
'Я huoty, возраст 18'
>>> user = {"name": "huoty", "age": 18}
>>> "Я {name}, возраст {age}".format(**user)
'Я huoty, возраст 18'

через объектные свойства

str.format()可以直接读取用户属性:

>>> class User(object):
...  def __init__(self, name, age):
...   self.name = name
...   self.age = age
...   
...  def __str__(self):
...   return "{self.name}({self.age})".format(self=self)
...  
...  def __repr__(self):
...   return self.__str__()
...  
...
>>> user = User("huoty", 18)
>>> user
huoty(18)
>>> "Я {user.name}, возраст {user.age}".format(user=user)
'Я huoty, возраст 18'

через индекс

Внутри строки, подлежащей форматированию, элементы можно доступить по индексу:

>>> names, ages = ["huoty", "esenich", "anan"], [18, 16, 8]
>>> "Я {0[0]}, возраст {1[2]}".format(names, ages)
'Я huoty, возраст 8'
>>> users = {"names": ["huoty", "esenich", "anan"], "ages": [18, 16, 8]}
>>> "Я {names[0]}, возраст {ages[0]}".format(**users)

определение преобразования

можно определить тип преобразования строки:

 conversion ::= "r" | "s" | "a"

其中 "!r" 对应 repr(); "!s" 对应 str(); "!a" 对应 ascii()。 示例:

>>> "repr() shows quotes: {!r}; str() doesn't: {!s}".format('test1', 'test2')
"repr() shows quotes: 'test1'; str() doesn't: test2"

格式限定符

Где "!r" соответствует repr(); "!s" соответствует str(); "!a" соответствует ascii(). Пример: }}

>>> "repr() shows quotes: {!r}; str() doesn't: {!s}".format('test1', 'test2')

repr() показывает кавычки: 'test1'; str() не показывает: test2
Определители формата
Заполнение и выравнивание
Заполнение часто используется вместе с выравниванием. ^, <, > соответственно по центру, по левому краю, по правому краю, за ними ширина, : после нее символ для заполнения, может быть только один символ, если не указан, то по умолчанию используется пробел для заполнения.
' 181716'
>>> "{:0>8}".format("181716")
'00181716'
>>> "{:->8}".format("181716")
'--181716'
>>> "{:-<8}".format("181716")
'181716--'
>>> "{:-^8}".format("181716")

-181716-

>>> "{:-<25}>".format("Here ")

'Here -------------------->'
Точность плавающей точки
Форматирование f для плавающего типа, и можно добавить контроль точности перед ним:
>>> "[ {:.2f} ]".format(321.33345)
>>> "[ {:.1f} ]".format(321.33345)
>>> "[ {:.4f} ]".format(321.33345)
>>> "[ {:.4f} ]".format(321)
'[ 321.0000 ]'

Для плавающих точек можно указать символ, + означает отображение + перед положительным числом, - перед отрицательным; (пробел) означает добавление пробела перед положительным числом и - перед отрицательным; - совпадает с nothing ( {:f} ):

>>> '{:+f}; {:+f}'.format(3.141592657, -3.141592657)
+3.141593; -3.141593'
>>> '{: f}; {: f}'.format(3.141592657, -3.141592657)
' 3.141593; -3.141593'
>>> '{:f}; {:f}'.format(3.141592657, -3.141592657)
'3.141593; -3.141593'
>>> '{:-f}; {:-f}'.format(3.141592657, -3.141592657)
'3.141593; -3.141593'
>>> '{:+.4f}; {:+.4f}'.format(3.141592657, -3.141592657)
+3.1416; -3.1416

Указание системы счисления

>>> "int: {0:d}; hex: {0:x}; oct: {0:o}; bin: {0:b}".format(18)
'int: 18; hex: 12; oct: 22; bin: 10010'
>>> "int: {0:d}; hex: {0:#x}; oct: {0:#o}; bin: {0:#b}".format(18)
'int: 18; hex: 0x12; oct: 0o22; bin: 0b10010'

Разделитель тысяч

Можешь использовать "," в качестве разделителя тысяч:

>>> '{:,}'.format(1234567890)
'1,234,567,890'

Отображение процента

>>> "progress: {:.2%}".format(19.88/22)
'progress: 90.36%'

На самом деле, format поддерживает больше символов типов:

type ::= "b" | "c" | "d" | "e" | "E" | "f" | "F" | "g" | "G" | "n" | "o" | "s" | "x" | "X" | "%"

Другие хитрости

Вложение占位ных знаков

В некоторых случаях использование占位ных знаков вложено может быть очень полезным:

>>> '{0:{fill}{align}16}'.format("hello", fill='*', align='^')
'*****hello******'
>>>
>>> for num in range(5,12):
...  for base in "dXob":
...   print("{0:{width}{base}}".format(num, base=base, width=5), end=' ')
...  print()
...  
...
 5  5  5  101
 6  6  6  110
 7  7  7  111
 8  8  10  1000
 9  9  11  1001
 10  A  12  1010
 11  B  13  1011

Использование как функции

Можно не указывать параметры форматирования, а использовать как функцию в других местах:

>>> email_f = "Your email address was {email}".format
>>> print(email_f(email="[email protected]"))
Ваш адрес электронной почты был [email protected]

Escape фигурные скобки

Когда в строке необходимо использовать фигурные скобки, их можно использовать в виде escape-символов:

>>> "The {} set is often represented as {{0}}".format("empty")
Пустой набор часто представляется как {0}

Обобщение

Вот и все, что есть в этой статье, надеюсь, что содержимое статьи поможет вам в изучении или работе. Если у вас есть вопросы, пожалуйста, оставляйте комментарии для обсуждения, спасибо за поддержку учебника呐喊.

Заявление: содержимое этой статьи взято из Интернета, авторские права принадлежат соответствующему автору, содержимое предоставлено пользователями Интернета в добровольном порядке, сайт не обладает правами собственности, не был отредактирован вручную, и не несет ответственности за соответствующие юридические последствия. Если вы обнаружите контент,涉嫌侵犯版权, пожалуйста, отправьте письмо по адресу: notice#oldtoolbag.com (при отправке письма, пожалуйста, замените # на @) для сообщения о нарушении,并提供相关证据. При обнаружении факта нарушения, сайт незамедлительно удаляет涉嫌侵权的内容.

Основной учебник
Рекомендуем