Wie drucke ich wie printf in Python3?

125

In Python 2 habe ich verwendet:

print "a=%d,b=%d" % (f(x,n),g(x,n))

Ich habe es versucht:

print("a=%d,b=%d") % (f(x,n),g(x,n))
Mike L.
quelle
11
%war schon immer ein String-Operator, der nicht mit der printAnweisung zusammenhängt. Sie können beispielsweise eine Zeichenfolge mit erstellen und diese Zeichenfolge s="a=%d,b=%d"%(f(x,n),g(x,n))dann mit drucken print s.
Chepper

Antworten:

206

In Python2 printwar ein Schlüsselwort, das eine Anweisung einführte:

print "Hi"

In Python3 printist eine Funktion, die aufgerufen werden kann:

print ("Hi")

In beiden Versionen %ist dies ein Operator, der eine Zeichenfolge auf der linken Seite und einen Wert oder ein Tupel von Werten oder ein Zuordnungsobjekt (wie dict) auf der rechten Seite benötigt.

Ihre Linie sollte also so aussehen:

print("a=%d,b=%d" % (f(x,n),g(x,n)))

Die Empfehlung für Python3 und höher lautet außerdem, die {}Formatierung im Stil anstelle der %Formatierung im Stil zu verwenden:

print('a={:d}, b={:d}'.format(f(x,n),g(x,n)))

Python 3.6 führt ein weiteres Paradigma für die Formatierung von Zeichenfolgen ein: f-Zeichenfolgen .

print(f'a={f(x,n):d}, b={g(x,n):d}')
Robᵩ
quelle
14
oder: In print('a={first:4.2f}, b={second:03d}'.format(first=f(x,n),second=g(x,n))) diesem Beispiel wird gezeigt, wie Sie die Modifikatoren im printf-Stil verwenden und dennoch Schlüsselwörter verwenden können.
Fbicknel
2
@rapt, es hat einige große Vorteile. Nicht zuletzt können Sie dasselbe Format nur mehrmals oder in falscher Reihenfolge referenzieren: "{1}, {1}, {0} und {1}" .format ("Eier", "Spam") = = "Spam, Spam, Eier und Spam"
Dr. Xorile
53

Die am meisten empfohlene Methode ist die Verwendung der formatMethode. Lesen Sie hier mehr darüber

a, b = 1, 2

print("a={0},b={1}".format(a, b))
thefourtheye
quelle
28

Einfache printf () -Funktion aus O'Reillys Python-Kochbuch .

import sys
def printf(format, *args):
    sys.stdout.write(format % args)

Beispielausgabe:

i = 7
pi = 3.14159265359
printf("hi there, i=%d, pi=%.2f\n", i, pi)
# hi there, i=7, pi=3.14
stackoverflowuser2010
quelle
Heh ... PRINTund FORMAT...? Zurück in der Zeit 60+ Jahre bis zu den Tagen von FORTRAN :)
Skeeve
1
Der Link zum Kochbuch von O'Reilly ist tot.
Ideogramm
22

In Python 3.6 wurden F-Strings für die Inline-Interpolation eingeführt. Noch schöner ist, dass die Syntax erweitert wurde, um auch Formatspezifizierer mit Interpolation zuzulassen. Etwas, an dem ich gearbeitet habe, während ich das gegoogelt habe (und auf diese alte Frage gestoßen bin!):

print(f'{account:40s} ({ratio:3.2f}) -> AUD {splitAmount}')

PEP 498 enthält die Details. Und ... es hat meinen Ärger mit Formatspezifizierern in anderen langs sortiert - ermöglicht Spezifizierer, die selbst Ausdrücke sein können! Yay! Siehe: Formatbezeichner .

kva1966
quelle
2
Hinweis: Dies ist auch die performanteste Methode, um Variablen in Zeichenfolgen einzufügen.
Rotareti
17

Einfaches Beispiel:

print("foo %d, bar %d" % (1,2))

Donald Derek
quelle
11

Eine einfachere.

def printf(format, *values):
    print(format % values )

Dann:

printf("Hello, this is my name %s and my age %d", "Martin", 20)
Famory Toure
quelle
2

Da Sie %sich außerhalb der print(...)Klammern befinden, versuchen Sie, Ihre Variablen in das Ergebnis Ihres printAufrufs einzufügen . print(...)kehrt zurück None, so dass dies nicht funktioniert, und es gibt auch die kleine Sache, dass Sie Ihre Vorlage bereits gedruckt haben, und Zeitreisen sind nach den Gesetzen des Universums, in dem wir leben, verboten.

Das Ganze, das Sie drucken möchten, einschließlich des %Operanden und seines Operanden, muss sich in Ihrem print(...)Aufruf befinden, damit die Zeichenfolge vor dem Drucken erstellt werden kann.

print( "a=%d,b=%d" % (f(x,n), g(x,n)) )

Ich habe ein paar zusätzliche Leerzeichen hinzugefügt, um es klarer zu machen (obwohl sie nicht notwendig sind und im Allgemeinen nicht als guter Stil angesehen werden).

irgendwie
quelle
2

Mit anderen Worten: printf fehlt in Python ... Ich bin überrascht! Bester Code ist

def printf(format, *args):
    sys.stdout.write(format % args)

Aufgrund dieses Formulars darf \ n nicht gedruckt werden. Alle anderen nein. Deshalb ist der Druck ein schlechter Operator. Außerdem müssen Sie Argumente in spezieller Form schreiben. Es gibt keine Nachteile in der obigen Funktion. Es ist eine übliche Standardform der printf-Funktion.

Anatoliy
quelle
1
Sie können \ n im Druck trivial vermeiden. Fügen Sie einfach "," nach dem zu druckenden Wert hinzu.
Hejazzman
1
print("Name={}, balance={}".format(var-name, var-balance))
User707
quelle