Wie kann ich Newline ‘\n’ in einem F-String verwenden, um die Ausgabe zu formatieren?

Lesezeit: 7 Minuten

Benutzeravatar von malmed
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

Benutzeravatar von Dimitris Fasarakis Hilliard
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

Dies ist in der angegeben PEP für f-Saiten:

Backslashes dürfen nicht innerhalb der Ausdrucksteile von f-Strings erscheinen, […]

Eine Option ist die Zuordnung '\n' zu einem Namen und dann .join darauf in der f-Zeichenfolge; 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 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:

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

(Bitte tun Sie dies nicht.)

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

Benutzeravatar von Eugene Yarmash
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():

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

Ausgang:

Winners are:
Adam
Bob
Cyril

Das heißt, mit str.join()/str.format() hier wäre wohl einfacher und lesbarer als jede F-String-Problemumgehung:

print('\n'.join(['Winners are:', *names]))
print('Winners are:\n{}'.format('\n'.join(names)))

  • 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


Benutzeravatar von Chris_Rands
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

Benutzeravatar von Rick
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):

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)}"

dagegen:

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

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}')

Benutzeravatar von HK boy
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

Benutzeravatar von Pavel Shishpor
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)

1443330cookie-checkWie kann ich Newline ‘\n’ in einem F-String verwenden, um die Ausgabe zu formatieren?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy