Qual é a diferença entre% s e% d na formatação de string do Python?

138

Eu não entendo o que %se %dfazer e como eles funcionam.

karlzt
fonte

Respostas:

185

Eles são usados ​​para formatar seqüências de caracteres. %satua como um espaço reservado para uma seqüência de caracteres enquanto %datua como um espaço reservado para um número. Seus valores associados são passados ​​através de uma tupla usando o %operador.

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

irá imprimir marcog 42. Observe que o nome é uma sequência (% s) e o número é um número inteiro (% d para decimal).

Consulte https://docs.python.org/3/library/stdtypes.html#printf-style-string-formatting para obter detalhes.

No Python 3, o exemplo seria:

print('%s %d' % (name, number))
moinudin
fonte
2
No Google Chrome: Configurações >> Pesquisa >> Gerenciar mecanismos de pesquisa ... observe como %sé usado nas configurações dos mecanismos de pesquisa. O Chrome usa %spara substituir as palavras-chave inseridas na barra de endereço. O Python usa de %smaneira semelhante. print('description: %s' % descrip)No %soperador será substituído pela cadeia de texto armazenado na descripvariável. As chaves redondas evitar uma mensagem de erro em Python 3.
noobninja
como você chama esses% s,% d, etc?
Chaine
1
@Chaine, eles são chamados de espaços reservados, são variáveis ​​substituíveis #
Leo
@ Leo Obrigado!
Chaine
37

do python 3 doc

%d é para inteiro decimal

%s é para string ou objeto genérico e, no caso de objeto, será convertido em string

Considere o seguinte código

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

a saída será

4,3 4 4,300000 4,3

como você pode ver %dtruncará para inteiro, %smanterá a formatação, %fserá impressa como flutuante e %gé usada para número genérico

obviamente

print('%d' % (name))

irá gerar uma exceção; você não pode converter string em número

venérgico
fonte
Isso deseja mais votos. Explica o que aconteceria se %sfosse usado para um número.
Vikas Prasad
1
Qual é a diferença entre% d e% i, se ambos serão convertidos em número inteiro? Como% d se compara a% ie% f?
srini 22/07/19
34

%s é usado como um espaço reservado para os valores da string que você deseja injetar em uma string formatada.

%d é usado como um espaço reservado para valores numéricos ou decimais.

Por exemplo (para python 3)

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

Saída

Joe is 42 years old
Soviut
fonte
6
Realmente não explica o problema? Não estou explicando o problema, estou fornecendo uma resposta concisa para a pergunta. A pergunta perguntou especificamente para que eram% s e% d.
Soviut
2
você sabe a diferença entre% i% d? python suporta% i?
cryanbhu
11

Estes são espaços reservados:

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

Essa linha de código substituirá% s por Alice (str) e% d por 42.

Resultado: 'Hi Alice I have 42 donuts'

Isso pode ser alcançado com um "+" na maioria das vezes. Para entender melhor sua pergunta, você também pode verificar {} / .format (). Aqui está um exemplo: Formatação de string Python:% vs.

veja também aqui um vídeo tutorial do google python @ 40 ', com algumas explicações https://www.youtube.com/watch?v=tKTZoB2Vjuk

Kevin
fonte
10

Os "comandos" de formatação %de %sstring são usados ​​para formatar strings. O %dé para números e%s é para seqüências de caracteres.

Por exemplo:

print("%s" % "hi")

e

print("%d" % 34.6)

Para passar vários argumentos:

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

Sam Bernstein
fonte
9

Todas essas são respostas informativas, mas nenhuma está chegando ao cerne da diferença entre %se %d.

%sdiz ao formatador para chamar a str()função no argumento e, como estamos coagindo a uma string por definição, %sé essencialmente apenas um desempenho str(arg).

%dpor outro lado, está chamando int()o argumento antes de chamar str(), tipo str(int(arg)), Isso causará intcoerção e tambémstr coerção.

Por exemplo, eu posso converter um valor hexadecimal em decimal,

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

ou truncar uma bóia.

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

Mas a operação gerará uma exceção se o argumento não for um número.

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

Portanto, se a intenção é apenas chamar str(arg), então%s é suficiente, mas se você precisar de formatação extra (como formatar casas decimais flutuantes) ou outra coerção, os outros símbolos de formato serão necessários.

Com a f-stringnotação, quando você deixa o formatador de fora, o padrão é 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'

O mesmo acontece com string.format; o padrão é str.

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

%de %ssão espaços reservados, eles funcionam como uma variável substituível. Por exemplo, se você criar 2 variáveis

variable_one = "Stackoverflow"
variable_two = 45

você pode atribuir essas variáveis ​​a uma sentença em uma string usando uma tupla das variáveis.

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

Observe que %sfunciona para String e%d funciona para variáveis ​​numéricas ou decimais.

se você imprimir variable_3ficaria assim

print(variable_3 % (variable_one, variable_two))

Eu estava procurando uma resposta no StackOverflow e encontrei mais de 45 respostas para minha pergunta.

Leo
fonte
5

Eles são especificadores de formato. Eles são usados ​​quando você deseja incluir o valor de suas expressões Python em strings, com um formato específico imposto.

Veja Mergulhe no Python para uma introdução relativamente detalhada.

Lucas Jones
fonte
3

De acordo com os padrões mais recentes, é assim que deve ser feito.

print("My name is {!s} and my number is{:d}".format("Agnel Vishal",100))

Verifique os documentos python3.6 e o programa de amostra

Agnel Vishal
fonte
2

Caso você queira evitar% s ou% d, então ..

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

Resultado:

my name is marcog and my name is 42
Sujatha
fonte
2
O que essa resposta tem a ver com a pergunta? O questionador estava perguntando sobre o uso de %se %d.
Mark Dickinson
BTW, o código que você mostra é inválido no Python 3.5.1: printé uma função no Python 3, não uma declaração.
Mark Dickinson
Eu editei o post ... por favor, veja-o. Na verdade, eu a publiquei como uma alternativa ... se alguém puder evitar o uso de% d ou% s. E obrigado pela detecção de erros, ..Eu editei o código.
Sujatha
3
Obrigado pelas edições. Infelizmente, isso ainda não é uma resposta para a pergunta.
Mark Dickinson #
2

% s é usado para armazenar espaço para a string% d é usado para armazenar espaço para 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))

Saída do programa

este vídeo é aprofundado sobre essa dica https://www.youtube.com/watch?v=4zN5YsuiqMA

Noel Moses Mwadende
fonte
Bem-vindo ao Stack Overflow! Qual é a sua resposta diferente dos outros 12?
Vasil Velichkov
quase esses formatos funcionam da mesma forma, mas tudo o que eu queria é dar mais exemplos para aumentar o entendimento
Noel Moses Mwadende 20/02
Isso é ótimo! Você pode melhorar sua resposta adicionando a saída do programa como um texto e não como uma imagem.
Vasil Velichkov
obrigado pela sua preocupação, vou fazer algumas alterações, de nada
Noel Moses Mwadende 25/02
1

por falar
nisso ... python3.6 vem com o f-stringsque facilita muito a formatação!
Agora, se a sua versão python for maior que 3.6, você poderá formatar suas strings com estes métodos disponíveis:

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
fonte