Was bedeutet% s in einer Zeichenfolge im Python-Format?

166

Was %sbedeutet in Python? Und was macht der folgende Code?

Zum Beispiel...

 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])
Tyler
quelle
4
Der %Bediener ist zugunsten der leistungsstärkeren str.formatMethode veraltet , siehe PEP-3101 .
Paulo Scardine
35
Tatsächlich sagt PEP "In Python 3.0 wird der% -Operator durch eine leistungsfähigere Formatierungsmethode für Zeichenfolgen ergänzt" und wird auf Python 2.6 zurückportiert. Woher ich komme von "ergänzt" bedeutet hinzugefügt, nicht ersetzt. Das PEP sagt nicht "ersetzt" und in keinem Teil des PEP heißt es, dass der% -Operator veraltet ist (es heißt jedoch, dass andere Dinge unten veraltet sind). Vielleicht bevorzugen Sie str.format und das ist in Ordnung, aber bis ein PEP sagt, dass es veraltet ist, macht es keinen Sinn zu behaupten, es sei, wenn es nicht ist.
Ben

Antworten:

198

Es handelt sich um eine Syntax zur Formatierung von Zeichenfolgen (die von C übernommen wird).

Bitte sehen Sie "PyFormat" :

Python unterstützt das Formatieren von Werten in Zeichenfolgen. Obwohl dies sehr komplizierte Ausdrücke enthalten kann, besteht die grundlegendste Verwendung darin, Werte mit dem %sPlatzhalter in eine Zeichenfolge einzufügen .

Bearbeiten: Hier ist ein wirklich einfaches Beispiel:

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

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

Mit dem %sToken kann ich eine Zeichenfolge einfügen (und möglicherweise formatieren). Beachten Sie, dass das %sToken durch alles ersetzt wird, was ich nach dem %Symbol an die Zeichenfolge übergebe . Beachten Sie auch, dass ich auch hier ein Tupel verwende (wenn Sie nur eine Zeichenfolge haben, ist die Verwendung eines Tupels optional), um zu veranschaulichen, dass mehrere Zeichenfolgen in eine Anweisung eingefügt und formatiert werden können.

Andrew Hare
quelle
11
Beachten Sie, dass diese Art der Zeichenfolgeninterpolation zugunsten der leistungsstärkeren str.formatMethode veraltet ist .
Paulo Scardine
6
In python3 ist raw_input () nur noch input () für diejenigen unter Ihnen, die es selbst versuchen.
Gothburz
1
Warum (name,)und nicht nur name?
Cameron Hudson
111

Andrews Antwort ist gut.

Und um Ihnen ein bisschen mehr zu helfen, verwenden Sie hier mehrere Formatierungen in einer Zeichenfolge

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

Wenn Sie Ints anstelle von String verwenden, verwenden Sie% d anstelle von% s.

"My name is %s and i'm %d" % ('john', 12) #My name is john and i'm 12
sqram
quelle
2
nett. % d erspart Ihnen das Wirken von str (int). Hast du eine Idee, wofür% s und% d stehen? Ich denke, ich werde mich an sie als Zeichenfolge und Ziffer erinnern.
user391339
1
@ user391339 steht für dezimal :) sie sind alle hier docs.python.org/2/library/…
sqram
Ich weiß es nicht für frühere Versionen, aber zumindest für 3.6 funktioniert es genauso, auch wenn Sie es %sfür ganze Zahlen verwenden. Es wird nur in eine Zeichenfolge konvertiert.
Lapin
@lapin du bist richtig :). Aber das ist vielleicht nicht immer das, was Sie wollen. Angenommen, Sie möchten beispielsweise eine Ziffer auffüllen. print('This number will be padded with 4 zeros: %05d ' % 1)- das wird funktionieren. print('This number will be padded with 4 zeros: %05s ' % 1)- das wird nicht `
sqram
28

Die formatMethode wurde in Python 2.6 eingeführt. Es ist leistungsfähiger und nicht viel schwieriger zu bedienen:

>>> "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'
Dansalmo
quelle
11
Diese Antwort würde verbessert, wenn erklärt würde, dass die Syntax in der Frage Text formatiert, und dann die neuere Methode demonstriert würde. Auf diese Weise könnte es für sich stehen. Ein Beispiel bereitzustellen, das dem Beispiel in der Frage entspricht, wäre ebenfalls ein Plus.
Steve S
13

%sGibt einen Konvertierungstyp für Zeichenfolgen an, wenn die Zeichenfolgenformatierungsfunktionen von Python verwendet werden. Genauer gesagt, %swandelt einen bestimmten Wert in eine Zeichenfolge , die unter Verwendung von str()Funktion. Vergleichen Sie dies mit dem %rKonvertierungstyp, der die repr()Funktion für die Wertkonvertierung verwendet.

Schauen Sie sich die Dokumente zur Formatierung von Zeichenfolgen an .

Brandon E Taylor
quelle
13

%sund %dsind Formatbezeichner oder Platzhalter zum Formatieren von Zeichenfolgen / Dezimalstellen / Gleitkommazahlen usw.

Am häufigsten verwendeter Formatbezeichner:

%s : string

%d : Dezimalstellen

%f : float

Selbsterklärender Code:

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!"
Om Sao
quelle
6

Als Antwort auf Ihre zweite Frage: Was macht dieser Code? ...

Dies ist ein ziemlich normaler Code zur Fehlerprüfung für ein Python-Skript, das Befehlszeilenargumente akzeptiert.

Die erste ifAussage lautet also: Wenn Sie mir kein Argument übergeben haben, werde ich Ihnen sagen, wie Sie mir in Zukunft ein Argument übergeben sollen, z. B. wird dies auf dem Bildschirm angezeigt:

Usage: myscript.py database-name

Die nächste ifAnweisung prüft, ob der 'Datenbankname', den Sie an das Skript übergeben haben, tatsächlich im Dateisystem vorhanden ist. Wenn nicht, erhalten Sie eine Nachricht wie folgt:

ERROR: Database database-name was not found!

Aus der Dokumentation :

argv [0] ist der Skriptname (es hängt vom Betriebssystem ab, ob dies ein vollständiger Pfadname ist oder nicht). Wenn der Befehl mit der Befehlszeilenoption -c für den Interpreter ausgeführt wurde, wird argv [0] auf die Zeichenfolge '-c' gesetzt. Wenn kein Skriptname an den Python-Interpreter übergeben wurde, ist argv [0] die leere Zeichenfolge.

mechanisches Fleisch
quelle
2

Hier ist ein gutes Beispiel 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
Gothburz
quelle