Cosa significa% s in una stringa in formato Python?


167

Cosa %ssignifica in Python? E cosa fa il seguente bit di codice?

Per esempio...

 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
L' %operatore è deprecato a favore del str.formatmetodo più potente , vedere PEP-3101 .
Paulo Scardine,

35
In realtà quel PEP dice "In Python 3.0, l'operatore% è integrato da un metodo di formattazione delle stringhe più potente" e che è backportato su Python 2.6. Da dove vengo "integrato" significa aggiunto, non sostituito. Il PEP non dice "soppiantato" e in nessuna parte del PEP dice che l'operatore% è deprecato (eppure dice che altre cose sono deprecate in fondo). Potresti preferire str.format e va bene, ma finché non c'è un PEP che dice che è deprecato, non ha senso affermarlo quando non lo è.
Ben

Risposte:


199

È una sintassi di formattazione di stringa (che prende in prestito da C).

Si prega di consultare "PyFormat" :

Python supporta la formattazione dei valori in stringhe. Sebbene ciò possa includere espressioni molto complicate, l'utilizzo di base è l'inserimento di valori in una stringa con il %ssegnaposto.

Modifica: ecco un esempio davvero semplice:

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

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

Il %stoken mi permette di inserire (e potenzialmente formattare) una stringa. Si noti che il %stoken viene sostituito da qualsiasi cosa passi alla stringa dopo il %simbolo. Nota anche che sto usando una tupla anche qui (quando hai solo una stringa che usa una tupla è facoltativa) per illustrare che più stringhe possono essere inserite e formattate in un'unica istruzione.


11
Si noti che questo tipo di interpolazione di stringhe è deprecato a favore del str.formatmetodo più potente .
Paulo Scardine,

6
In python3 raw_input () ora è solo input () per quelli di voi che stanno provando da soli.
Gothburz,

1
Perché (name,)e non solo name?
Cameron Hudson il

112

La risposta di Andrew è buona.

E solo per aiutarti un po 'di più, ecco come usi la formattazione multipla in una stringa

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

Se si utilizza ints anziché string, utilizzare% d anziché% s.

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

2
simpatico. % d ti evita di lanciare str (int). hai idea di cosa significano% se% d? immagino che li ricorderò come stringa e cifra.
user391339

1
@ user391339 sta per decimale :) sono tutti qui docs.python.org/2/library/…
sqram

Non lo so per le versioni precedenti, ma almeno per 3.6 funziona allo stesso modo anche se lo usi %ssu numeri interi, verrà semplicemente convertito in una stringa.
lapin

@lapin hai ragione :). ma potrebbe non essere sempre quello che vuoi. Supponi di voler inserire una cifra, ad esempio. print('This number will be padded with 4 zeros: %05d ' % 1)- questo funzionerà. print('This number will be padded with 4 zeros: %05s ' % 1)- Questo non lo farà "
sqram

28

Il formatmetodo è stato introdotto in Python 2.6. È più capace e non molto più difficile da usare:

>>> "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
Questa risposta sarebbe migliorata se spiegasse che la sintassi nella domanda stava formattando il testo e quindi dimostrando il metodo più recente. In questo modo potrebbe resistere da solo. Fornire un esempio equivalente all'esempio nella domanda sarebbe anche un vantaggio.
Steve S,

13

%sindica un tipo di conversione di stringa quando si utilizzano le funzionalità di formattazione delle stringhe di Python. Più specificamente, %sconverte un valore specificato in una stringa utilizzando la str()funzione. Confrontalo con il %rtipo di conversione che utilizza la repr()funzione per la conversione del valore.

Dai un'occhiata ai documenti per la formattazione delle stringhe .


13

%se %dsono identificatori di formato o segnaposto per la formattazione di stringhe / decimali / float ecc.

Identificatore di formato più comunemente usato:

%s : corda

%d : decimali

%f : float

Codice autoesplicativo:

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

In risposta alla tua seconda domanda: cosa fa questo codice? ...

Questo è un codice di controllo degli errori abbastanza standard per uno script Python che accetta argomenti da riga di comando.

Quindi la prima ifaffermazione si traduce in: se non mi hai passato un argomento, ti dirò come dovresti passarmi un argomento in futuro, ad esempio vedrai questo sullo schermo:

Usage: myscript.py database-name

L' ifistruzione successiva verifica se il "nome database" passato allo script esiste effettivamente sul filesystem. In caso contrario, riceverai un messaggio come questo:

ERROR: Database database-name was not found!

Dalla documentazione :

argv [0] è il nome dello script (dipende dal sistema operativo sia che si tratti di un percorso completo o meno). Se il comando è stato eseguito utilizzando l'opzione della riga di comando -c per l'interprete, argv [0] è impostato sulla stringa '-c'. Se nessun nome di script è stato passato all'interprete Python, argv [0] è la stringa vuota.


2

Ecco un buon esempio in 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.