O que% s significa em uma string de formato python?


167

O que %ssignifica em Python? E o que o seguinte pedaço de código faz?

Por exemplo...

 if len(sys.argv) < 2:
     sys.exit('Usage: %s database-name' % sys.argv[0])

 if not os.path.exists(sys.argv[1]):
     sys.exit('ERROR: Database %s was not found!' % sys.argv[1])

4
O %operador foi descontinuado em favor do str.formatmétodo mais poderoso , consulte PEP-3101 .
Paulo Scardine 17/07/2013

35
Na verdade, o PEP diz "No Python 3.0, o operador% é complementado por um método de formatação de string mais poderoso" e que é portado para o Python 2.6. De onde eu venho "suplementado" significa adicionado a, não substituído. O PEP não diz "suplantado" e em nenhuma parte do PEP diz que o operador% está obsoleto (ainda assim, diz que outras coisas estão obsoletas no fundo). Você pode preferir str.format e tudo bem, mas até que um PEP diga que está obsoleto, não faz sentido afirmar que é quando não está.
Ben

Respostas:


199

É uma sintaxe de formatação de string (que é emprestada de C).

Por favor, veja "PyFormat" :

O Python suporta a formatação de valores em strings. Embora isso possa incluir expressões muito complicadas, o uso mais básico é inserir valores em uma sequência com o %sespaço reservado.

Edit: Aqui está um exemplo muito simples:

#Python2
name = raw_input("who are you? ")
print "hello %s" % (name,)

#Python3+
name = input("who are you? ")
print("hello %s" % (name,))

O %stoken me permite inserir (e potencialmente formatar) uma string. Observe que o %stoken é substituído pelo que eu passar para a sequência após o %símbolo. Observe também que estou usando uma tupla aqui também (quando você tem apenas uma string usando uma tupla é opcional) para ilustrar que várias strings podem ser inseridas e formatadas em uma instrução.


11
Observe que esse tipo de interpolação de cadeias é preterido em favor do str.formatmétodo mais poderoso .
Paulo Scardine 17/07/2013

6
Em python3, raw_input () agora é apenas input () para aqueles que estão tentando por si mesmos.
Gothburz

1
Por que (name,)e não apenas name?
Cameron Hudson

112

A resposta de Andrew é boa.

E apenas para ajudá-lo um pouco mais, veja como você usa várias formatações em uma sequência

"Hello %s, my name is %s" % ('john', 'mike') # Hello john, my name is mike".

Se você estiver usando ints em vez de string, use% d em vez de% s.

"My name is %s and i'm %d" % ('john', 12) #My name is john and i'm 12

2
legais. % d evita que você projete str (int). alguma idéia do que% s e% d representam? Acho que vou lembrá-los como string e dígito.
user391339

1
@ user391339 significa decimal :) eles estão todos aqui docs.python.org/2/library/...
sqram

Eu não sei para versões anteriores, mas pelo menos para a 3.6 funciona da mesma maneira, mesmo se você usar %snúmeros inteiros, será apenas convertido em uma string.
lapin 21/03

@lapin você está correto :). mas isso nem sempre pode ser o que você deseja. Digamos que você queira preencher um dígito, por exemplo. print('This number will be padded with 4 zeros: %05d ' % 1)- isso vai funcionar. print('This number will be padded with 4 zeros: %05s ' % 1)- isso não vai `
sqram 24/03

28

O formatmétodo foi introduzido no Python 2.6. É mais capaz e não muito mais difícil de usar:

>>> "Hello {}, my name is {}".format('john', 'mike')
'Hello john, my name is mike'.

>>> "{1}, {0}".format('world', 'Hello')
'Hello, world'

>>> "{greeting}, {}".format('world', greeting='Hello')
'Hello, world'

>>> '%s' % name
"{'s1': 'hello', 's2': 'sibal'}"
>>> '%s' %name['s1']
'hello'

11
Esta resposta poderia ser melhorada se explicou que a sintaxe em que a pergunta foi a formatação de texto e , em seguida, demonstrou o método mais recente. Dessa forma, poderia permanecer por conta própria. Fornecer um exemplo equivalente ao exemplo da pergunta também seria uma vantagem.
21713 Steve S

13

%sindica um tipo de conversão de string ao usar os recursos de formatação de string do python. Mais especificamente, %sconverte um valor especificado em uma string usando a str()função Compare isso com o %rtipo de conversão que usa a repr()função para conversão de valor.

Veja os documentos para formatação de string .


13

%se %dsão especificadores de formato ou espaços reservados para formatar seqüências de caracteres / decimais / flutuadores etc.

MAIS especificador formato usado comum:

%s : corda

%d : decimais

%f : flutuador

Código auto-explicativo:

name = "Gandalf"
extendedName = "the Grey"
age = 84
IQ = 149.9
print('type(name):', type(name)) #type(name): <class 'str'>
print('type(age):', type(age))   #type(age): <class 'int'>   
print('type(IQ):', type(IQ))     #type(IQ): <class 'float'>   

print('%s %s\'s age is %d with incredible IQ of %f ' %(name, extendedName, age, IQ)) #Gandalf the Grey's age is 84 with incredible IQ of 149.900000 

#Same output can be printed in following ways:


print ('{0} {1}\'s age is {2} with incredible IQ of {3} '.format(name, extendedName, age, IQ))          # with help of older method
print ('{} {}\'s age is {} with incredible IQ of {} '.format(name, extendedName, age, IQ))          # with help of older method

print("Multiplication of %d and %f is %f" %(age, IQ, age*IQ)) #Multiplication of 84 and 149.900000 is 12591.600000          

#storing formattings in string

sub1 = "python string!"
sub2 = "an arg"

a = "i am a %s" % sub1
b = "i am a {0}".format(sub1)

c = "with %(kwarg)s!" % {'kwarg':sub2}
d = "with {kwarg}!".format(kwarg=sub2)

print(a)    # "i am a python string!"
print(b)   # "i am a python string!"
print(c)    # "with an arg!"
print(d)   # "with an arg!"

6

Em resposta à sua segunda pergunta: O que esse código faz? ...

Esse é um código de verificação de erro bastante padrão para um script Python que aceita argumentos da linha de comando.

Portanto, a primeira ifdeclaração se traduz em: se você não me passou uma discussão, eu vou lhe dizer como você deve me passar uma discussão no futuro, por exemplo, você verá isso na tela:

Usage: myscript.py database-name

A próxima ifinstrução verifica se o 'nome do banco de dados' que você transmitiu para o script realmente existe no sistema de arquivos. Caso contrário, você receberá uma mensagem como esta:

ERROR: Database database-name was not found!

A partir da documentação :

argv [0] é o nome do script (depende do sistema operacional se este é um nome de caminho completo ou não). Se o comando foi executado usando a opção de linha de comando -c para o intérprete, argv [0] é definido como a string '-c'. Se nenhum nome de script foi passado para o interpretador Python, argv [0] é a string vazia.


2

Aqui está um bom exemplo em Python3.

  >>> a = input("What is your name?")
  What is your name?Peter

  >>> b = input("Where are you from?")
  Where are you from?DE

  >>> print("So you are %s of %s" % (a, b))
  So you are Peter of DE
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.