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


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

^ Я знаю, как это сделать в Python 2

какова версия Python 3 этого?

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

5 97

5 ответов:

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

"({: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)

пояснив:

  • {} означает только следующий позиционный аргумент, с форматом по умолчанию;
  • {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 The newer гораздо более выразителен, чем старый, и должен использоваться при написании нового код (если он не нацелен на более старые среды, конечно).

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'

эта строка работает как-есть в 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, )'

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

мне нравится такой подход

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