Форматування рядків у Python 3


114

Я роблю це в Python 2:

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

Що таке версія Python 3?

Я спробував шукати приклади в Інтернеті, але продовжував отримувати версії Python 2.


Це не було застарілим; ваш код працює добре. Детальніше читайте тут .
jackcogdill

32
Примітка для випадкового читача: знак долара не має особливого значення. Тут просто знак долара. (Спасибі
Мартійн


1
Знак долара зробив це дуже заплутано ..
cchamberlain

Відповіді:


173

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

"({: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 набагато виразніше, ніж старіший, і його слід використовувати щоразу при написанні нового коду (якщо, звичайно, це не орієнтоване на старі середовища).


9
Ви також можете зробити"({0.goals} goals, ${0.penalties})".format(self)
Бурхан Халід

Вам потрібно вивести '%' поза фігурними дужками, наприклад {: .2f%} -> {: .2f}%
SuperElectric

@SuperElectric ви маєте на увазі в цьому рядку "conversion rate: {:.2%}".format(self.goals / self.shots):? Для мене добре працює як є ... (Python 3.4) Зауважте, що в ньому немає f, я прошу форматувати у відсотках, а не як число з плаваючою комою.
mgibsonbr

Ти маєш рацію; Схоже, це працює в Python 3.4, тож це добре, оскільки ОП запитували про Python3. Щойно я виявив, що це не працює з python 2.7.6. "{:.2f}%".format(float_num)працює чудово для обох.
SuperElectric

1
@JohnSchmitt Так, цей приклад повинен був дати такий самий точний вихід, як і код, наведений у питанні. Тут $немає особливого значення, ні в синтаксисі старого формату, ні в новому, тому він повинен бути присутнім у створеному рядку без змін.
mgibsonbr

67

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'

12

Цей рядок працює як є в 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)'

ГАРАЗД. COOL. Після того як я опублікував це запитання, я продовжував пошук і виявив, що ми повинні робити {% d}, а не% d, чи правильно це теж? Або спосіб Python2 - єдиний спосіб зробити це?
JoseBazBaz

2
Python 3 вводить новий синтаксис - це фігурні дужки - але вам не потрібно його використовувати. Ви можете використовувати або старий, або новий. Але вони різні; якщо ви використовуєте фігурні фігури, ви не використовуєте знаки відсотків.
Марк Рід

2

Мені подобається такий підхід

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.