Wie kann ich Newline ‘\n’ in einem F-String verwenden, um die Ausgabe zu formatieren?
Lesezeit: 7 Minuten
gemobbt
Ich habe diesen Code ausprobiert:
names = ['Adam', 'Bob', 'Cyril']
text = f"Winners are:\n{'\n'.join(names)}"
print(text)
Jedoch, '\' kann nicht innerhalb verwendet werden {...} Ausdrucksteile einer F-Zeichenfolge. Wie kann ich es zum Laufen bringen? Das Ergebnis sollte sein:
Winners are:
Adam
Bob
Cyril
Siehe Warum ist es nicht möglich, Backslashes innerhalb der geschweiften Klammern von F-Saiten zu verwenden? Wie kann ich das Problem umgehen? für eine zusätzliche Diskussion über Warum die Einschränkung besteht.
f"Winners are:\n{chr(10).join(names)}"
– Wim
27. Juni 2017 um 13:06 Uhr
Dimitris Fasarakis Hilliard
Du kannst nicht. Backslashes dürfen nicht innerhalb der geschweiften Klammern stehen {}; dies führt zu a SyntaxError:
>>> f'{\}'
SyntaxError: f-string expression part cannot include a backslash
Eine weitere Option, wie von @wim angegeben, ist die Verwendung chr(10) zu bekommen \n zurückgekehrt und dann dort mitmachen. f"Winners are:\n{chr(10).join(names)}"
Noch ein anderer ist natürlich zu '\n'.join vorher und fügen Sie dann den Namen entsprechend hinzu:
n = "\n".join(names)
text = f"Winners are:\n{n}"
was zur gleichen Ausgabe führt.
Notiz:
Dies ist einer der kleinen Unterschiede zwischen f-Saiten u str.format. In letzterem können Sie immer Satzzeichen verwenden, vorausgesetzt, dass ein entsprechendes verrücktes Diktat entpackt wird, das diese Schlüssel enthält:
Im ersteren Fall sind Satzzeichen nicht erlaubt, weil Sie keine Bezeichner haben können, die sie verwenden.
Nebenbei: Ich würde mich auf jeden Fall dafür entscheiden print oder format, wie die anderen Antworten als Alternative vorschlagen. Die Optionen, die ich angegeben habe, gelten nur, wenn Sie muss Verwenden Sie aus irgendeinem Grund F-Saiten.
Nur weil etwas neu ist, heißt das nicht, dass man alles damit machen sollte 😉
Für mich nicht nachvollziehbar: nl = '\n' text = f"Winners are:{nl}". Verwendung: text = f”Gewinner sind:\n”
–Timo
7. Januar 2021 um 19:10 Uhr
@Timo OP musste join An \n in einer Formatzeichenfolge, insbesondere im eingebetteten Ausdruck.
– Dimitris Fasarakis Hilliard
8. Januar 2021 um 8:15 Uhr
Ich glaube, der Punkt von @timo war der erste {nl} war nicht nötig, da die \n befindet sich nicht im Ausdrucksteil der F-Zeichenfolge. text = f"Winners are:\n" ist völlig in Ordnung, es ist die {"\n".join()} Teil, der Probleme innerhalb einer f-Zeichenfolge verursacht.
– Sam
3. Januar 2022 um 23:59 Uhr
Irgendeine Idee, warum F-Saiten auf diese Weise begrenzt sind? In JavaScript zum Beispiel gibt es keine solche Beschränkung für die Ausdrücke, die Sie in eine Zeichenfolgenvorlage einfügen können.
– Ron Inbar
10. März 2022 um 15:06 Uhr
@RonInbar in Python gibt es zwei andere Möglichkeiten, Zeichenfolgen zu formatieren, die diese Einschränkung nicht aufweisen, und sie existierten bereits vor f-Zeichenfolgen, die vorhanden sind '%s' % ('\n') Und '{}'.format('\n')
– Iuri Gilherme
1. Juli 2022 um 21:59 Uhr
Eugen Yarmash
Sie brauchen keine F-Strings oder andere Formatierer, um eine Liste von Strings mit einem Trennzeichen zu drucken. Verwenden Sie einfach die sep Stichwortargument zu print():
Beste Antwort bisher. Ich verwende heutzutage ständig Star Unpacking in der Druckfunktion, um einen Blick in das Innere eines Objekts zu werfen, z print(*dir(some_object), sep='\n') oder print(*vars(some_object), sep='\n').
– Rick
27. Juni 2017 um 13:41 Uhr
Was tun, wenn Sie die Liste nicht direkt ausdrucken möchten, zB wenn Sie sie an einen Logger weitergeben?
– Bob
3. Februar 2020 um 15:47 Uhr
@bob: dann einfach verwenden str.join(): text = '\n'.join(['Winners are:', *names]). Übrigens, print() kann zum Schreiben verwendet werden jede Datei (angegeben mit der file Streit, sys.stdout standardmäßig).
– Eugen Yarmash
3. Februar 2020 um 20:38 Uhr
Chris_Rands
Sie können keine Backslashes in F-Strings verwenden, wie andere gesagt haben, aber Sie könnten dies mit umgehen os.linesep (obwohl dies nicht der Fall sein wird \n auf allen Plattformen und wird nur empfohlen, wenn Binärdateien gelesen/geschrieben werden; siehe Ricks Kommentare):
>>> import os
>>> names = ['Adam', 'Bob', 'Cyril']
>>> print(f"Winners are:\n{os.linesep.join(names)}")
Winners are:
Adam
Bob
Cyril
Oder vielleicht weniger lesbar, aber garantiert \nmit chr():
>>> print(f"Winners are:\n{chr(10).join(names)}")
Winners are:
Adam
Bob
Cyril
War nicht ich, aber mit os.linesep Ist keine gute Idee beim Schreiben von Texten.
– Rick
27. Juni 2017 um 13:30 Uhr
@RickTeachey Ich habe bereits den Vorbehalt in Klammern hinzugefügt und einen alternativen Ansatz vorgeschlagen. Wie auch immer, das OP druckt auf dem Bildschirm und schreibt nicht in eine im Textmodus geöffnete Datei
– Chris_Rands
27. Juni 2017 um 13:34 Uhr
Ich denke nicht, dass es wichtig ist. os.linesep ist nur zum Lesen oder Lesen und Schreiben im Binärmodus. Ich weiß, dass es in diesem Fall genauso funktionieren wird, aber es ist eine schlechte Angewohnheit, damit anzufangen. Aber nochmal: Ich war nicht der Downvote. Der Vorbehalt ist gut genug für mich. 🙂
– Rick
27. Juni 2017 um 13:45 Uhr
Rick
Die anderen Antworten geben Ideen, wie man das Newline-Zeichen in ein F-String-Feld einfügt. Ich würde jedoch argumentieren, dass für das Beispiel, das das OP gegeben hat (was möglicherweise auf den tatsächlichen Anwendungsfall von OP hinweist oder nicht), keine dieser Ideen tatsächlich verwendet werden sollte.
Der ganze Zweck der Verwendung von F-Strings ist die Verbesserung der Lesbarkeit des Codes. Es gibt nichts, was Sie mit F-Saiten tun können, was Sie nicht tun können format. Überlegen Sie genau, ob es etwas gibt besser lesbar dazu (wenn du es könntest):
Der letzte Weg ist mindestens genauso lesbar, wenn nicht noch besser.
Kurz gesagt: Verwenden Sie keinen Hammer, wenn Sie einen Schraubendreher brauchen, nur weil Sie einen glänzenden neuen haben. Code wird viel häufiger gelesen als geschrieben.
Für andere Anwendungsfälle ist dies möglich chr(10) Idee bzw newline Idee mag passen. Aber nicht für den gegebenen.
print(f'{"blah\n"}')
Die obige Aussage wird angehoben SyntaxErrorAber um den Fehler zu vermeiden, können Sie einfach die Zeichenfolge, die \n enthält, einer Variablen zuweisen und sie in f-string verwenden.
x = "blah\n"
print(f'{x}')
HK-Junge
Wenn (und nur wenn!) Lesbarkeit oberste Priorität hat und Geschwindigkeit wirklich kein Faktor ist, sind F-Strings sehr nützlich, um eine einfache Funktion selbstdokumentierend zu machen, selbst wenn es einfachere Möglichkeiten gibt, sie zu programmieren. Die Lesbarkeit wird mit F-Strings maximiert, wenn: (1) die Anweisungen, die den Zustand des Arguments ändern, klar ersichtlich sind, und (2) wenn die Argumente gedruckt werden, die Druckanweisung sorgfältig formatiert und visuell dargestellt wird, um die Argumente hervorzuheben:
'''
function to print out an identification header, consisting
of the programmer supplied title, lastname, and firstname:
'''
FORMAT_DATE = "%m-%d-%y %H:%M:%S"
date_and_time = datetime.now()
name_line = f"* {lastname}, {firstname}"
title_line = f"* {title}"
date_line = f"* {date_and_time.strftime(FORMAT_DATE)}"
print(name_line
+ '\n'
+ title_line
+ '\n'
+ date_line)
Ausgang:
* Lovelace, Ada
* Bernoulli Numbers algorithm implemented in Python
* 10-28-42 20:13:22
Pavel Shishpor
Und denken Sie daran, diesen seltsamen Weg, der auch funktioniert, nicht zu verwenden:
names = ['Adam', 'Bob', 'Cyril']
text = f"""{'''
'''.join(names)}"""
print(text)
14433300cookie-checkWie kann ich Newline ‘\n’ in einem F-String verwenden, um die Ausgabe zu formatieren?yes
f"Winners are:\n{chr(10).join(names)}"
– Wim
27. Juni 2017 um 13:06 Uhr