web-dev-qa-db-fra.com

Comment utiliser newline '\ n' dans la chaîne f pour formater la sortie en Python 3.6?

Je voudrais savoir comment formater ce cas de manière pythonique avec des f-strings:

names = ['Adam', 'Bob', 'Cyril']
text = f"Winners are:\n{'\n'.join(names)}"
print(text)

Le problème est que '\' ne peut pas être utilisé dans une chaîne f ..... Sortie attendue:

Winners are:
Adam
Bob
Cyril
18
malmed

Vous n'avez pas besoin de f-strings ou d'autres formateurs pour imprimer une liste de chaînes avec un séparateur. Il suffit de passer l’argument du mot clé sep à print() :

names = ['Adam', 'Bob', 'Cyril']
print("Winners are:", *names, sep="\n")

Sortie:

Winners are:
Adam
Bob
Cyril

Cela dit, utiliser str.format() here serait sans doute plus simple et plus lisible que toute solution de contournement de chaîne f:

print("Winners are:\n{}".format("\n".join(names))
18
Eugene Yarmash

Les autres réponses donnent des idées sur la manière de placer le caractère de nouvelle ligne dans un champ f-string. Cependant, je dirais que pour l'exemple donné par OP (qui peut ou non être indicatif du cas d'utilisation réel de OP), aucune de ces idées ne devrait en réalité être utilisée. 

L’intérêt d’utiliser des chaînes de caractères f augmente la lisibilité du code. Vous ne pouvez rien faire avec les chaînes de caractères que vous ne pouvez pas faire avec format. Réfléchissez bien s'il y a quelque chose plus lisible à ce sujet (si vous pouviez le faire) 

f"Winners are:\n{'\n'.join(names)}"

...ou ca:

newline = '\n'
f"Winners are:\n{newline.join(names)}"

...ou ca:

"Winners are:\n{chr(10).join(names)}"

vs ceci: 

"Winners are:\n{}".format('\n'.join(names))

Le dernier moyen est au moins aussi lisible, sinon plus. 

En bref: n'utilisez pas de marteau lorsque vous avez besoin d'un tournevis, simplement parce que vous en avez un tout neuf. Le code est lu beaucoup plus souvent qu'il n'est écrit. 

Pour les autres cas d'utilisation, oui, il est possible que l'idée chr(10) ou newline soit appropriée. Mais pas pour celui donné. 

5
Rick Teachey

Comme d'autres l'ont déjà dit, vous ne pouvez pas utiliser de barres obliques inverses dans les chaînes de caractères, mais vous pouvez contourner ce problème à l'aide de os.linesep (bien que cela ne soit pas \n sur toutes les plateformes, il n'est donc pas recommandé de lire/écrire des fichiers binaires. ; voir Rick's commentaires):

>>> import os
>>> names = ['Adam', 'Bob', 'Cyril']
>>> print(f"Winners are:\n{os.linesep.join(names)}")
Winners are:
Adam
Bob
Cyril 

Ou peut-être d'une manière moins lisible, mais garantie d'être \n, avec chr() :

>>> print(f"Winners are:\n{chr(10).join(names)}")
Winners are:
Adam
Bob
Cyril
2
Chris_Rands