¿Cuál es la diferencia entre% sy% d en el formato de cadena de Python?

Respuestas:

185

Se utilizan para formatear cadenas. %sactúa como marcador de posición para una cadena mientras que %dactúa como marcador de posición para un número. Sus valores asociados se pasan a través de una tupla utilizando el %operador.

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

imprimirá marcog 42. Tenga en cuenta que name es una cadena (% s) y number es un número entero (% d para decimal).

Consulte https://docs.python.org/3/library/stdtypes.html#printf-style-string-formatting para obtener más detalles.

En Python 3 el ejemplo sería:

print('%s %d' % (name, number))
moinudin
fuente
2
En Google Chrome: Configuración >> Buscar >> Administrar motores de búsqueda ... observe cómo %sse usa con las configuraciones de motores de búsqueda. Chrome utiliza %spara reemplazar las palabras clave ingresadas en la barra de direcciones. Python usa %sde manera similar. En print('description: %s' % descrip)el %soperador será reemplazado por la cadena de texto almacenada en la descripvariable. Los corchetes evitan un mensaje de error en Python 3.
noobninja
¿Cómo se llaman estos% s,% d, etc.?
Chaine
1
@Chaine se llaman marcadores de posición, son variables reemplazables
Leo
@Leo ¡Gracias!
Chaine
37

de python 3 doc

%d es para entero decimal

%s es para cadena u objeto genérico y en caso de objeto, se convertirá en cadena

Considere el siguiente código

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

la salida será

giacomo 4.3 4 4.300000 4.3

como puede ver, %dse truncará a entero, %smantendrá el formato, %fse imprimirá como flotante y %gse usará para un número genérico

obviamente

print('%d' % (name))

generará una excepción; no puedes convertir una cadena en un número

venergiac
fuente
Esto desea más votos positivos. Explica lo que sucedería si %sse usara para un número en su lugar.
Vikas Prasad
1
¿Cuál es la diferencia entre% d y% i, si ambos se convertirán a entero? ¿Cómo se compara% d con% i y% f?
srini
34

%s se utiliza como marcador de posición para los valores de cadena que desea inyectar en una cadena con formato.

%d se utiliza como marcador de posición para valores numéricos o decimales.

Por ejemplo (para python 3)

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

Saldría

Joe is 42 years old
Soviut
fuente
66
¿Realmente no explica el problema? No estoy explicando el problema, estoy dando una respuesta concisa a la pregunta. La pregunta específicamente preguntaba para qué eran% sy% d.
Soviut
2
¿Conoces la diferencia entre% i y% d? ¿Python admite% i?
cryanbhu
11

Estos son marcadores de posición:

Por ejemplo: 'Hi %s I have %d donuts' %('Alice', 42)

Esta línea de código sustituirá% s con Alice (str) y% d con 42.

Salida: 'Hi Alice I have 42 donuts'

Esto podría lograrse con un "+" la mayor parte del tiempo. Para obtener una comprensión más profunda de su pregunta, también puede marcar {} / .format (). Aquí hay un ejemplo: Formato de cadena de Python:% vs. .format

También vea aquí un video tutorial de Google Python @ 40 ', tiene algunas explicaciones https://www.youtube.com/watch?v=tKTZoB2Vjuk

Kevin
fuente
10

El %dy el %sformato de cadenas de "comandos" se utilizan para las cadenas de formato. El %des para números, y %ses para cadenas.

Para un ejemplo:

print("%s" % "hi")

y

print("%d" % 34.6)

Para pasar múltiples argumentos:

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

Sam Bernstein
fuente
9

Estas son todas respuestas informativas, pero ninguna está llegando al núcleo de cuál es la diferencia entre %sy%d .

%sle dice al formateador que llame a la str()función en el argumento y dado que estamos coaccionando a una cadena por definición, %sesencialmente se está ejecutando str(arg).

%dpor otro lado, está recurriendo int()al argumento antes de invocar str(), como str(int(arg)), Esto causará intcoacción y strcoerción.

Por ejemplo, puedo convertir un valor hexadecimal a decimal,

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

o truncar un flotador.

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

Pero la operación generará una excepción si el argumento no es un número.

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

Entonces, si la intención es solo llamar str(arg), entonces%s es suficiente, pero si necesita un formato adicional (como formatear lugares decimales flotantes) u otra coerción, entonces se necesitan los otros símbolos de formato.

Con la f-stringnotación, cuando deja el formateador fuera, el valor predeterminado es 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'

Lo mismo es cierto con string.format; el valor predeterminado es str.

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

%dy %sson marcadores de posición, funcionan como una variable reemplazable. Por ejemplo, si crea 2 variables

variable_one = "Stackoverflow"
variable_two = 45

puede asignar esas variables a una oración en una cadena usando una tupla de las variables.

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

Tenga en cuenta que %sfunciona para String y %dfunciona para variables numéricas o decimales.

si imprimes variable_3se vería así

print(variable_3 % (variable_one, variable_two))

Estaba buscando una respuesta en StackOverflow y encontré más de 45 respuestas a mi pregunta.

León
fuente
5

Son especificadores de formato. Se usan cuando desea incluir el valor de sus expresiones de Python en cadenas, con un formato específico impuesto.

Ver Sumérgete en Python para una introducción relativamente detallada.

Lucas Jones
fuente
2

En caso de que desee evitar% so% d entonces ...

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

Salida:

my name is marcog and my name is 42
Sujatha
fuente
2
¿Qué tiene que ver esta respuesta con la pregunta? El interrogador preguntaba sobre el uso de %sy %d.
Mark Dickinson
Por cierto, el código que muestra no es válido en Python 3.5.1: printes una función en Python 3, no una declaración.
Mark Dickinson
He editado la publicación ... por favor mírala. En realidad, lo publiqué como una alternativa ... si alguien pudiera evitar usar% do% s. Y gracias por la detección de errores, ... he editado el código.
Sujatha
3
Gracias por las ediciones. Desafortunadamente, esto todavía no es una respuesta a la pregunta.
Mark Dickinson
2

% s se usa para mantener espacio para la cadena% d se usa para mantener espacio para el número

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))

Salida del programa

este video profundiza sobre ese consejo https://www.youtube.com/watch?v=4zN5YsuiqMA

Noel Moses Mwadende
fuente
¡Bienvenido a Stack Overflow! ¿Cómo es tu respuesta diferente a los otros 12?
Vasil Velichkov
casi esos formatos funcionan igual pero todo lo que quería es dar más ejemplos para aumentar la comprensión
Noel Moses Mwadende
¡Eso es genial! Puede mejorar su respuesta agregando la salida del programa como texto y no como imagen.
Vasil Velichkov
gracias por su preocupación, haré algunos cambios, de
nada
1

hablando de eso ...
¡viene con python3.6 f-stringsque hace que las cosas sean mucho más fáciles de formatear!
ahora, si su versión de Python es superior a 3.6, puede formatear sus cadenas con estos métodos 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
fuente