Форматирование строк в Python 3

Я делаю это в Python 2:

"(%d goals, $%d)" % (self.goals, self.penalties)

Что это за версия Python 3?

Я пытался искать примеры в Интернете, но я продолжал получать версии Python 2.

Ответ 1

Вот документы о синтаксисе "нового" формата. Примером может служить:

"({:d} goals, ${:d})".format(self.goals, self.penalties)

Если оба goals и penalties являются целыми числами (т.е. их формат по умолчанию одобрен), его можно сократить до:

"({} goals, ${})".format(self.goals, self.penalties)

И поскольку параметры являются полями self, есть способ сделать это, используя один аргумент дважды (как заметил в комментариях @Burhan Khalid):

"({0.goals} goals, ${0.penalties})".format(self)

Разъяснение:

  • {} означает только следующий аргумент positional со стандартным форматом;
  • {0} означает аргумент с индексом 0 со стандартным форматом;
  • {:d} - следующий позиционный аргумент с десятичным целочисленным форматом;
  • {0:d} - это аргумент с индексом 0 с десятичным целочисленным форматом.

Есть много других вещей, которые вы можете сделать при выборе аргумента (используя именованные аргументы вместо позиционных, доступ к полям и т.д.) и многие параметры формата (заполнение номера, использование разделителей тысяч, отображение знака или нет).). Некоторые другие примеры:

"({goals} goals, ${penalties})".format(goals=2, penalties=4)
"({goals} goals, ${penalties})".format(**self.__dict__)

"first goal: {0.goal_list[0]}".format(self)
"second goal: {.goal_list[1]}".format(self)

"conversion rate: {:.2f}".format(self.goals / self.shots) # '0.20'
"conversion rate: {:.2%}".format(self.goals / self.shots) # '20.45%'
"conversion rate: {:.0%}".format(self.goals / self.shots) # '20%'

"self: {!s}".format(self) # 'Player: Bob'
"self: {!r}".format(self) # '<__main__.Player instance at 0x00BF7260>'

"games: {:>3}".format(player1.games)  # 'games: 123'
"games: {:>3}".format(player2.games)  # 'games:   4'
"games: {:0>3}".format(player2.games) # 'games: 004'

Примечание.. Как отмечали другие, новый формат не заменяет первый, оба доступны как в Python 3, так и в более новых версиях Python 2. Некоторые могут сказать, что это вопрос предпочтения, но IMHO - более выразительный, чем более старый, и его следует использовать при написании нового кода (конечно, если он не нацелен на более старые среды).

Ответ 2

Python 3.6 теперь поддерживает строчную интерполяцию строк с PEP 498. Для вашего случая использования новый синтаксис просто:

f"({self.goals} goals, ${self.penalties})"

Это похоже на предыдущий стандарт .format, но позволяет легко делать вещи как:

>>> width = 10
>>> precision = 4
>>> value = decimal.Decimal('12.34567')
>>> f'result: {value:{width}.{precision}}'
'result:      12.35'

Ответ 3

Эта строка работает как есть в Python 3.

>>> sys.version
'3.2 (r32:88445, Oct 20 2012, 14:09:29) \n[GCC 4.5.2]'
>>> "(%d goals, $%d)" % (self.goals, self.penalties)
'(1 goals, $2)'

Ответ 4

Это не было устарело; ваш код работает нормально. Подробнее здесь.

Ответ 5

Мне нравится этот подход

my_hash = {}
my_hash["goals"] = 3 #to show number
my_hash["penalties"] = "5" #to show string
print("I scored %(goals)d goals and took %(penalties)s penalties" % my_hash)

Обратите внимание на добавленные d и s в скобках соответственно.

вывод будет:

I scored 3 goals and took 5 penalties