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 '\'
es nicht innerhalb der {...}
Ausdrucksteile eines F-Strings verwendet werden kann. Erwartete Ausgabe:
Winners are:
Adam
Bob
Cyril
python
python-3.x
newline
python-3.6
f-string
malmed
quelle
quelle
f"Winners are:\n{chr(10).join(names)}"
Antworten:
Das kannst du nicht. Backslashes können nicht in den geschweiften Klammern erscheinen
{}
. dies führt zu einemSyntaxError
:Dies ist im PEP für F-Strings angegeben:
Eine Möglichkeit besteht darin
'\n'
, einen Namen und dann.join
diesen innerhalb derf
Zeichenfolge zuzuweisen. das heißt, ohne ein Literal zu verwenden:Ergebnisse in:
Eine andere Option, wie von @wim angegeben, besteht
chr(10)
darin,\n
zurückgegeben zu werden und dort beizutreten.f"Winners are:\n{chr(10).join(names)}"
Ein weiterer Grund ist natürlich,
'\n'.join
vorher den Namen entsprechend hinzuzufügen:was zu der gleichen Ausgabe führt.
Hinweis:
Dies ist einer der kleinen Unterschiede zwischen
f
-strings undstr.format
. In letzterem Fall können Sie immer Interpunktion verwenden, vorausgesetzt, dass ein entsprechendes verrücktes Diktat entpackt wird, das die folgenden Schlüssel enthält:(Bitte tu das nicht.)
Im ersten Fall ist die Interpunktion nicht zulässig, da Sie keine Bezeichner haben können, die sie verwenden.
Nebenbei: Ich würde mich definitiv für
print
oder entscheidenformat
, wie die anderen Antworten als Alternative vorschlagen. Die von mir angegebenen Optionen gelten nur, wenn Sie müssen aus irgendeinem Grund Verwendung f-Strings.Nur weil etwas neu ist, heißt das nicht, dass du versuchen solltest, alles damit zu machen ;-)
quelle
Sie benötigen keine F-Strings oder andere Formatierer, um eine Liste von Strings mit einem Trennzeichen zu drucken. Verwenden Sie einfach das
sep
Schlüsselwortargument, umprint()
:Ausgabe:
Das heißt, die Verwendung von
str.join()
/str.format()
here wäre wohl einfacher und lesbarer als jede F-String-Problemumgehung:quelle
print(*dir(some_object), sep='\n')
oderprint(*vars(some_object), sep='\n')
.str.join()
:text = '\n'.join(['Winners are:', *names])
. Übrigens,print()
kann zum Schreiben in eine beliebige Datei verwendet werden ( standardmäßig mit demfile
Argument angegebensys.stdout
).Sie können keine Backslashes in F-Strings verwenden, wie andere gesagt haben, aber Sie können dies mit umgehen
os.linesep
(obwohl dies nicht\n
auf allen Plattformen möglich ist und nur empfohlen wird, wenn Binärdateien gelesen / geschrieben werden; siehe Ricks Kommentare):Oder vielleicht weniger lesbar, aber garantiert
\n
mitchr()
:quelle
os.linesep
ist keine gute Idee beim Schreiben von Text.os.linesep
dient 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 die Gegenstimme. Die Einschränkung ist gut genug für mich. :)Die anderen Antworten geben Ideen, wie das Zeilenumbruchzeichen 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 hinweist oder nicht), keine dieser Ideen tatsächlich verwendet werden sollte.
Der Sinn der Verwendung von F-Strings besteht darin, die Lesbarkeit des Codes zu verbessern. Mit F-Strings können Sie nichts anfangen, was Sie nicht tun können
format
. Überlegen Sie genau, ob dies besser lesbar ist (wenn Sie es könnten):...oder dieses:
...oder dieses:
gegen dieses:
Der letzte Weg ist mindestens genauso lesbar, wenn nicht mehr.
Kurz gesagt: Verwenden Sie keinen Hammer, wenn Sie einen Schraubendreher benötigen, nur weil Sie einen glänzenden neuen haben. Code wird viel häufiger gelesen als geschrieben.
Für andere Anwendungsfälle ist es möglich, dass die
chr(10)
Idee odernewline
Idee angemessen ist. Aber nicht für den Gegebenen.quelle