wake-up-neo.com

Wie verwendet man newline '\ n' in f-string, um die Ausgabe in Python 3.6 zu formatieren?

Ich würde gerne wissen, wie man diesen Fall pythonisch mit f-Strings formatiert:

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

Das Problem ist, dass '\' nicht in einem F-String verwendet werden kann . Erwartete Ausgabe:

Winners are:
Adam
Bob
Cyril
18
malmed

Das kannst du nicht. Backslashes dürfen nicht in geschweiften Klammern stehen {}; dies führt zu einem SyntaxError:

>>> f'{\}'
SyntaxError: f-string expression part cannot include a backslash

Dies wird im PEP für f-Strings angegeben:

Backslashes werden möglicherweise nicht in den Ausdrucksabschnitten von [...]

Eine Möglichkeit besteht darin, '\n' Einem Namen zuzuweisen und dann .join In der Zeichenfolge f- darauf zu setzen. das heißt, ohne ein Literal zu verwenden:

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

Ergebnisse in:

Winners are:
Adam
Bob
Cyril

Eine andere Möglichkeit, wie von @wim angegeben, besteht darin, chr(10) zu verwenden, um \n Zurückzugeben und sich dort anzumelden. f"Winners are:\n{chr(10).join(names)}"

Eine weitere Möglichkeit ist natürlich, vorher '\n'.join Und dann den Namen entsprechend hinzuzufügen:

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

was zu der gleichen Ausgabe führt.

Hinweis:

Dies ist einer der kleinen Unterschiede zwischen f- Strings und str.format. In letzterem Fall können Sie immer die Zeichensetzung verwenden, die voraussetzt, dass ein entsprechendes verrücktes Diktat entpackt wird, das die folgenden Schlüssel enthält:

>>> "{\\} {*}".format(**{"\\": 'Hello', "*": 'World!'})
"Hello World!"

(Bitte tu das nicht.)

Im ersten Fall ist die Zeichensetzung nicht zulässig, da Sie keine Bezeichner haben können, die sie verwenden.


Nebenbei: Ich würde mich definitiv für print oder format entscheiden, wie die anderen Antworten als Alternative vorschlagen. Die von mir angegebenen Optionen gelten nur, wenn Sie aus irgendeinem Grund f-Zeichenfolgen verwenden müssen .

Nur weil etwas neu ist, heißt das nicht, dass Sie versuchen sollten, alles damit zu tun ;-)

Sie benötigen keine F-Zeichenfolgen oder andere Formatierungselemente, um eine Liste von Zeichenfolgen mit einem Trennzeichen zu drucken. Übergeben Sie einfach das Argument sep an print() :

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

Ausgabe:

Winners are:
Adam
Bob
Cyril

Die Verwendung von str.format() hier wäre jedoch einfacher und lesbarer als jeder F-String-Workaround:

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

Die anderen Antworten geben Anregungen, wie das Newline-Zeichen in ein F-String-Feld eingefügt werden kann. Ich würde jedoch argumentieren, dass für das Beispiel, das das OP gegeben hat (was möglicherweise auf den tatsächlichen Anwendungsfall des OP hindeutet oder nicht zeigt), keine dieser Ideen verwendet werden sollte. 

Bei der Verwendung von f-Strings wird die Lesbarkeit des Codes verbessert. Mit f-Strings können Sie nichts mit format tun. Überlegen Sie genau, ob es etwas lesbarer gibt (falls Sie es tun könnten): 

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

...oder dieses:

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

...oder dieses:

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

gegen diese: 

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

Der letzte Weg ist mindestens genauso lesbar, wenn nicht mehr. 

Kurz gesagt: Verwenden Sie keinen Hammer, wenn Sie einen Schraubendreher brauchen, nur weil Sie einen glänzenden neuen haben. Code wird viel öfter gelesen als geschrieben. 

Für andere Anwendungsfälle ist es möglich, dass die chr(10)-Idee oder newline-Idee geeignet ist. Aber nicht für den einen. 

5
Rick Teachey

Sie können keine Backslashes in f-Strings verwenden, wie andere bereits gesagt haben, aber Sie könnten dies mit os.linesep umgehen (obwohl dies nicht auf allen Plattformen \n ist). Dies wird nur empfohlen, wenn Sie Binärdateien lesen/schreiben ; siehe Rick's Kommentare):

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

Oder vielleicht auf eine weniger lesbare Art, aber garantiert \n mit chr() :

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