Comment imprimer comme printf en Python3?

125

Dans Python 2, j'ai utilisé:

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

J'ai essayé:

print("a=%d,b=%d") % (f(x,n),g(x,n))
Mike L
la source
11
%a toujours été un opérateur de chaîne, non lié à l' printinstruction. Vous pouvez, par exemple, créer une chaîne avec s="a=%d,b=%d"%(f(x,n),g(x,n)), puis imprimer cette chaîne avec print s.
chepner

Réponses:

207

En Python2, printétait un mot-clé qui introduisait une instruction:

print "Hi"

En Python3, printest une fonction qui peut être appelée:

print ("Hi")

Dans les deux versions, %est un opérateur qui nécessite une chaîne sur le côté gauche et une valeur ou un tuple de valeurs ou un objet de mappage (comme dict) sur le côté droit.

Donc, votre ligne devrait ressembler à ceci:

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

De plus, la recommandation pour Python3 et plus récent est d'utiliser le {}formatage -style au lieu du %formatage -style:

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

Python 3.6 introduit encore un autre paradigme de formatage de chaîne: les f-strings .

print(f'a={f(x,n):d}, b={g(x,n):d}')
Robᵩ
la source
14
ou: print('a={first:4.2f}, b={second:03d}'.format(first=f(x,n),second=g(x,n))) où cet exemple montre comment vous pouvez utiliser les modificateurs de style printf et utilisent encore des mots - clés.
fbicknel
2
@rapt, il présente d'énormes avantages. Vous ne pouvez pas faire référence au même format plusieurs fois ou dans le désordre: "{1}, {1}, {0} et {1}" .format ("eggs", "spam") = = "spam, spam, oeufs et spam"
Dr Xorile
53

La méthode la plus recommandée consiste à utiliser la formatméthode. En savoir plus ici

a, b = 1, 2

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

Fonction printf () simple du livre de recettes Python d' O'Reilly .

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

Exemple de sortie:

i = 7
pi = 3.14159265359
printf("hi there, i=%d, pi=%.2f\n", i, pi)
# hi there, i=7, pi=3.14
stackoverflowuser2010
la source
Heh ... PRINTet FORMAT...? Retour dans le temps 60+ ans à l'époque de FORTRAN :)
Skeeve
1
Le lien vers le livre de cuisine O'Reilly est mort.
Idéogramme
22

Python 3.6 a introduit des chaînes f pour l'interpolation en ligne. Ce qui est encore plus agréable, c'est qu'il a étendu la syntaxe pour autoriser également les spécificateurs de format avec interpolation. Quelque chose sur lequel j'ai travaillé pendant que je cherchais ceci (et suis tombé sur cette vieille question!):

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

PEP 498 a les détails. Et ... il a trié ma bête noire avec des spécificateurs de format dans d'autres langages - permet des spécificateurs qui eux-mêmes peuvent être des expressions! Yay! Voir: Spécificateurs de format .

kva1966
la source
2
Remarque: c'est également le moyen le plus performant d'injecter des variables dans des chaînes.
Rotareti
17

Exemple simple:

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

Donald Derek
la source
11

Un plus simple.

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

Ensuite:

printf("Hello, this is my name %s and my age %d", "Martin", 20)
Famory Touré
la source
2

Parce que vous êtes en %dehors des print(...)parenthèses, vous essayez d'insérer vos variables dans le résultat de votre printappel. print(...)revient None, donc cela ne fonctionnera pas, et il y a aussi le petit problème que vous ayez déjà imprimé votre modèle à ce moment-là et que le voyage dans le temps soit interdit par les lois de l'univers dans lequel nous vivons.

Tout ce que vous voulez imprimer, y compris le %et son opérande, doit être dans votre print(...)appel, afin que la chaîne puisse être construite avant d'être imprimée.

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

J'ai ajouté quelques espaces supplémentaires pour le rendre plus clair (bien qu'ils ne soient pas nécessaires et généralement pas considérés comme un bon style).

kindall
la source
2

Autres mots printf absent en python ... Je suis surpris! Le meilleur code est

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

En raison de cette forme permet de ne pas imprimer \ n. Tous les autres non. C'est pourquoi l'impression est un mauvais opérateur. Et vous devez également écrire des arguments sous une forme spéciale. Il n'y a pas d'inconvénients dans la fonction ci-dessus. C'est une forme habituelle standard de la fonction printf.

Anatoliy
la source
1
Vous pouvez facilement éviter \ n dans l'impression. Ajoutez simplement "," après la valeur à imprimer.
Hejazzman
1
print("Name={}, balance={}".format(var-name, var-balance))
Utilisateur707
la source