Quelle est la différence entre% s et% d dans le formatage de chaîne Python?

138

Je ne comprends pas quoi %set %dfaire et comment ils fonctionnent.

Karlzt
la source

Réponses:

185

Ils sont utilisés pour le formatage des chaînes. %sagit comme un espace réservé pour une chaîne tandis que %dagit comme un espace réservé pour un nombre. Leurs valeurs associées sont transmises via un tuple à l'aide de l' %opérateur.

name = 'marcog'
number = 42
print '%s %d' % (name, number)

imprimera marcog 42. Notez que nom est une chaîne (% s) et nombre est un entier (% d pour décimal).

Voir https://docs.python.org/3/library/stdtypes.html#printf-style-string-formatting pour plus de détails.

Dans Python 3, l'exemple serait:

print('%s %d' % (name, number))
moinudin
la source
2
Dans Google Chrome: Paramètres >> Recherche >> Gérer les moteurs de recherche ... remarquez comment %sest utilisé avec les configurations des moteurs de recherche. Chrome utilise %spour remplacer les mots clés saisis dans la barre d'adresse. Python utilise %sde la même manière. Dans print('description: %s' % descrip)l' %sopérateur sera remplacé par la chaîne de texte stockée dans la descripvariable. Les accolades rondes empêchent un message d'erreur dans Python 3.
noobninja
comment appelez-vous ces% s,% d, etc?
Chaine
1
@Chaine, ils s'appellent des espaces réservés, ce sont des variables remplaçables
Leo
@Leo Merci!
Chaine
37

à partir de python 3 doc

%d est pour un entier décimal

%s est pour une chaîne ou un objet générique et en cas d'objet, il sera converti en chaîne

Considérez le code suivant

name ='giacomo'
number = 4.3
print('%s %s %d %f %g' % (name, number, number, number, number))

la sortie sera

giacomo 4.3 4 4.300000 4.3

comme vous pouvez le voir, il %dsera tronqué en entier, %smaintiendra le formatage, %fsera imprimé en flottant et %gest utilisé pour le nombre générique

évidemment

print('%d' % (name))

générera une exception; vous ne pouvez pas convertir une chaîne en nombre

vénérien
la source
Cela mérite plus de votes positifs. Il explique ce qui se passerait si %sétait utilisé pour un nombre à la place.
Vikas Prasad
1
Quelle est la différence entre% d et% i, si les deux sont convertis en entier? Comment% d se compare-t-il à% i et% f?
srini
34

%s est utilisé comme espace réservé pour les valeurs de chaîne que vous souhaitez injecter dans une chaîne formatée.

%d est utilisé comme espace réservé pour les valeurs numériques ou décimales.

Par exemple (pour python 3)

print ('%s is %d years old' % ('Joe', 42))

Sortirait

Joe is 42 years old
Soviut
la source
6
N'explique pas vraiment le problème? Je n'explique pas le problème, je donne une réponse concise à la question. La question demandait spécifiquement à quoi servaient% s et% d.
Soviut
2
connaissez-vous la différence entre% i et% d? est-ce que python prend en charge% i?
cryanbhu
11

Ce sont des espaces réservés:

Par exemple: 'Hi %s I have %d donuts' %('Alice', 42)

Cette ligne de code remplacera% s par Alice (str) et% d par 42.

Production: 'Hi Alice I have 42 donuts'

Ceci pourrait être réalisé avec un "+" la plupart du temps. Pour mieux comprendre votre question, vous pouvez également vérifier {} / .format (). Voici un exemple: Formatage de chaîne Python:% vs .format

voir aussi ici une vidéo tutoriel google python @ 40 ', elle a quelques explications https://www.youtube.com/watch?v=tKTZoB2Vjuk

Kevin
la source
10

Les "commandes" de mise en forme des chaînes %det %ssont utilisées pour formater les chaînes. Le %dest pour les nombres, et%s est pour les chaînes.

À titre d'exemple:

print("%s" % "hi")

et

print("%d" % 34.6)

Pour transmettre plusieurs arguments:

print("%s %s %s%d" % ("hi", "there", "user", 123456)) reviendra hi there user123456

Sam Bernstein
la source
9

Ce sont toutes des réponses informatives, mais aucune ne permet de comprendre la différence entre %set%d .

%sindique au formateur d'appeler la str()fonction sur l'argument et puisque nous contraignons à une chaîne par définition, il %sest essentiellement performant str(arg).

%dd'autre part, fait appel int()à l'argument avant d'appeler str(), comme str(int(arg)), Cela provoquera la intcoercition ainsi que la strcoercition.

Par exemple, je peux convertir une valeur hexadécimale en décimal,

>>> '%d' % 0x15
'21'

ou tronquer un flotteur.

>>> '%d' % 34.5
'34'

Mais l'opération lèvera une exception si l'argument n'est pas un nombre.

>>> '%d' % 'thirteen'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: %d format: a number is required, not str

Donc, si l'intention est juste d'appeler str(arg), alors%s suffit, mais si vous avez besoin d'un formatage supplémentaire (comme le formatage des décimales flottantes) ou d'une autre contrainte, les autres symboles de format sont nécessaires.

Avec la f-stringnotation, lorsque vous laissez le formateur de côté, la valeur par défaut est str.

>>> a = 1
>>> f'{a}'
'1'
>>> f'{a:d}'
'1'
>>> a = '1'
>>> f'{a:d}'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: Unknown format code 'd' for object of type 'str'

La même chose est vraie avec string.format; la valeur par défaut est str.

>>> a = 1
>>> '{}'.format(a)
'1'
>>> '{!s}'.format(a)
'1'
>>> '{:d}'.format(a)
'1'
Wyrmwood
la source
8

%det %ssont des espaces réservés, ils fonctionnent comme une variable remplaçable. Par exemple, si vous créez 2 variables

variable_one = "Stackoverflow"
variable_two = 45

vous pouvez affecter ces variables à une phrase dans une chaîne en utilisant un tuple des variables.

variable_3 = "I was searching for an answer in %s and found more than %d answers to my question"

Notez que cela %sfonctionne pour String et%d fonctionne pour les variables numériques ou décimales.

si vous imprimez variable_3cela ressemblerait à ceci

print(variable_3 % (variable_one, variable_two))

Je cherchais une réponse dans StackOverflow et j'ai trouvé plus de 45 réponses à ma question.

Leo
la source
5

Ce sont des spécificateurs de format. Ils sont utilisés lorsque vous souhaitez inclure la valeur de vos expressions Python dans des chaînes, avec un format spécifique appliqué.

Voir Plongez dans Python pour une introduction relativement détaillée.

Lucas Jones
la source
2

Si vous souhaitez éviter% s ou% d alors ..

name = 'marcog'
number = 42
print ('my name is',name,'and my age is:', number)

Production:

my name is marcog and my name is 42
Sujatha
la source
2
Qu'est-ce que cette réponse a à voir avec la question? L'intervenant posait des questions sur l'utilisation de %set %d.
Mark Dickinson
BTW, le code que vous affichez n'est pas valide dans Python 3.5.1: printest une fonction en Python 3, pas une instruction.
Mark Dickinson
J'ai édité le message ... s'il vous plaît le voir. En fait, je l'ai posté comme alternative..si quelqu'un pourrait éviter d'utiliser% d ou% s. Et merci pour la détection d'erreur, .. j'ai édité le code.
Sujatha le
3
Merci pour les modifications. Malheureusement, ce n'est toujours pas une réponse à la question.
Mark Dickinson
2

% s est utilisé pour contenir de l'espace pour la chaîne% d est utilisé pour contenir de l'espace pour le nombre

name = "Moses";
age = 23
print("My name is %s am CEO at MoTech Computers " %name)
print("Current am %d years old" %age)
print("So Am %s and am %d years old" %(name,age))

Sortie programme

cette vidéo explique en profondeur cette astuce https://www.youtube.com/watch?v=4zN5YsuiqMA

Noel Moses Mwadende
la source
Bienvenue dans Stack Overflow! En quoi votre réponse est-elle différente des 12 autres?
Vasil Velichkov le
presque ces formats fonctionnent de la même manière mais tout ce que je voulais, c'est donner plus d'exemples afin d'augmenter la compréhension
Noel Moses Mwadende
C'est génial! Vous pouvez améliorer votre réponse en ajoutant la sortie du programme sous forme de texte et non sous forme d'image.
Vasil Velichkov le
Merci pour votre inquiétude, je vais faire quelques changements, vous êtes les bienvenus
Noel Moses Mwadende
1

en parlant de cela ...
python3.6 est livré avec f-stringsce qui rend les choses beaucoup plus faciles dans le formatage!
maintenant, si votre version de python est supérieure à 3,6, vous pouvez formater vos chaînes avec ces méthodes disponibles:

name = "python"

print ("i code with %s" %name)          # with help of older method
print ("i code with {0}".format(name))  # with help of format
print (f"i code with {name}")           # with help of f-strings
a_m_dev
la source