Question Formatage de chaînes en Python 3


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

^ Je sais faire ça en Python 2

Quelle est la version de Python 3 de cela?

J'ai essayé de chercher des exemples en ligne mais j'ai continué à obtenir des versions de Python 2


96
2017-12-19 04:53


origine


Réponses:


Voici les docs à propos de la "nouvelle" syntaxe de format. Un exemple serait:

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

Si les deux goals et penalties sont des entiers (c’est-à-dire que leur format par défaut est ok), il pourrait être réduit à:

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

Et puisque les paramètres sont des champs de self, il y a aussi une façon de le faire en utilisant un seul argument deux fois (comme @Burhan Khalid a noté dans les commentaires):

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

Expliquant:

  • {} signifie simplement l'argument positionnel suivant, avec le format par défaut;
  • {0} signifie l'argument avec index 0, avec le format par défaut;
  • {:d} est le prochain argument positionnel, avec un format entier décimal;
  • {0:d} est l'argument avec index 0, avec un format entier décimal.

Vous pouvez faire beaucoup d'autres choses en sélectionnant un argument (en utilisant des arguments nommés au lieu de positionnels, en accédant à des champs, etc.) et plusieurs options de format (en remplissant le nombre, Quelques autres exemples:

"({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'

Remarque: Comme d'autres l'ont fait remarquer, le nouveau format ne remplace pas le premier, ils sont tous deux disponibles dans Python 3 et dans les nouvelles versions de Python 2. Certains peuvent dire que c'est une question de préférence, mais à mon humble avis, le plus récent est beaucoup plus expressif que l'ancien, et devrait être utilisé à chaque fois que vous écrivez un nouveau code (à moins qu'il ne cible des environnements plus anciens).


148
2017-12-19 04:56



Python 3.6 prend désormais en charge l'interpolation de chaînes littérales abrégées avec PEP 498. Pour votre cas d'utilisation, la nouvelle syntaxe est simplement:

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

Ceci est similaire à la précédente .format standard, mais permet de faire facilement les choses comme:

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

45
2017-12-26 22:00



Cette ligne fonctionne comme dans 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)'

12
2017-12-19 04:55



Ce n'était pas déconseillé; votre code fonctionne bien. Lire la suite ici.


10
2017-12-19 04:57



J'aime cette approche

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)

Notez les d et s joints respectivement entre parenthèses.

la sortie sera:

I scored 3 goals and took 5 penalties

1
2018-03-19 02:17