2016-04-24 11 views
1

Dies ist ziemlich einfach:Python-String-Format Fehler

my_name="nishant" 
my_age=24 
print "My name is %s"%my_name 
print "My age is %d & my name is %s, what are you ?" %(my_age, my_name) 

Es funktioniert gut, und druckt das gewünschte Ergebnis, aber wenn ich die letzte Zeile wie diese ersetzen:

print "My age is %d & my name is %s, what are you ?" %my_age , %my_name 

Ich bekomme diese Fehlermeldung:

File "my_tests.py", line 7 
    print "My age is %d & my name is %s, what are you ?" %my_age, %my_name 
                   ^
SyntaxError: invalid syntax 

Meine Frage ist:

  1. Warum ist %(my_age, my_name)! = %my_age , %my_name?
  2. Wie interpretiert Python so etwas?

Antwort

3

Was von Ihrem Snippet ausgeführt wird, ist binary arithmetic operation, und es erfordert einzelnes Objekt als zweites Argument.

Mit Klammern definieren Sie dieses Argument als ein Zwei-Element-Tupel. Ich habe zusätzliche Klammern hinzugefügt, um zu betonen, wie Code interpretiert wird.

print ("My age is %d & my name is %s, what are you ?" % (my_age, my_name)) 

Wenn nicht, Argument ist einzelnes Element und , %my_name wird als zweites Argument print statement interpretiert.

print evaluates each expression in turn and writes the resulting object to standard output

print ("My age is %d & my name is %s, what are you ?" % my_age), (%my_name) 

Da %my_name ist ungültig Python-Ausdruck, SyntaxError angehoben wird.

+0

das macht irgendwie Sinn für mich –

0
>>> print "My name is %s & my age is %d, what are you?" % (my_name, my_age) 
My name is nishant & my age is 24, what are you? 

Nach dem% -Zeichen Sie in einem Tupel der Variablen übergeben Sie benötigen.

Entschuldigung, ich habe Ihre Frage in meiner vorherigen Antwort falsch interpretiert.

0

weil Formatierer ein Tupel erwartet.

+1

Sie gemeint, wenn Sie wollen, dass mehrere Formate in Ihrer Zeichenfolge mehrere Variablen drucken, müssen Sie sie innerhalb() (Klammern) getrennt durch, (Kommas). ? –

+0

ja ein% und Tupel mit der Anzahl der Variablen gleich% in String –

0

Es ist die Python-Syntax für Strings, können Sie die Python-Dokumentation, wie ein Konvertierungsspezifizierer mit mehr als zwei Variablen arbeiten lesen:

https://docs.python.org/2/library/stdtypes.html#string-formatting-operations

Es ist nur eine Design-Lösung, dass die Entwickler gedacht war am besten . Python erwartet ein Tupel, wenn es mehr als eine Variable gibt.

+0

yep .. ich lese, dass doc .. immer noch, warum haben sie das getan –

+0

@NishantSingh Sie haben zwei Werte, müssen sie als '' 'Tupel' wickeln "". –

+0

Denn so wollten es die Entwickler von Python sein. Es ist eine Entwurfslösung, um Variablen innerhalb einer Zeichenkette zu setzen. – cenh

0

Der Operator % sollte nur einmal angezeigt werden - er ist nicht Teil des Variablennamens. Dies ist, wie Sie in der Regel sehen würden es verwendet:

print "My age is %d & my name is %s, what are you ?" % (my_age, my_name) 

Der Raum zwischen den % und das Tupel nur ihre Unterscheidbarkeit zu betonen.

1

% ist ein Operator wie +, -, /, *, &, | usw. So wie Sie nicht 4 * 5, * 6 tun können, können Sie nicht '%s %s' % 'here', % 'there' tun.Eigentlich ist x % y nur eine Abkürzung für x.__mod__(y) . Daher verwenden

'%s %s' % ('here', 'there') -> '%s %s'.__mod__(('here', 'there')) 

% zweimal nur keinen Sinn macht:

'%s %s'.__mod__('here'), .__mod__('there') 

oder y.__rmod__(x) wenn x.__mod__() existiert nicht.