Chciałbym wiedzieć, jak sformatować ten przypadek w Pythonie za pomocą f-stringów:
names = ['Adam', 'Bob', 'Cyril']
text = f"Winners are:\n{'\n'.join(names)}"
print(text)
Problem polega na tym, że '\'
nie można go używać wewnątrz {...}
fragmentów wyrażenia ciągu f. Oczekiwany wynik:
Winners are:
Adam
Bob
Cyril
python
python-3.x
newline
python-3.6
f-string
malmed
źródło
źródło
f"Winners are:\n{chr(10).join(names)}"
Odpowiedzi:
Nie możesz. Wewnątrz nawiasów klamrowych nie mogą pojawić się ukośne ukośne
{}
; spowoduje toSyntaxError
:>>> f'{\}' SyntaxError: f-string expression part cannot include a backslash
Jest to określone w PEP dla f-stringów:
Jedną z opcji jest przypisanie
'\n'
nazwy, a następnie.join
umieszczenie jej wewnątrzf
-string; to znaczy bez użycia literału:names = ['Adam', 'Bob', 'Cyril'] nl = '\n' text = f"Winners are:{nl}{nl.join(names)}" print(text)
Prowadzi do:
Inną opcją, określone przez @wim, jest użycie
chr(10)
aby\n
powrócił, a potem przystąpić tam.f"Winners are:\n{chr(10).join(names)}"
Jeszcze innym jest oczywiście
'\n'.join
wcześniejsze dodanie nazwy:n = "\n".join(names) text = f"Winners are:\n{n}"
co daje taki sam wynik.
Uwaga:
To jedna z małych różnic między
f
-strings istr.format
. W tym drugim przypadku zawsze możesz użyć interpunkcji, pod warunkiem, że zostanie rozpakowany odpowiedni zwariowany dykt, który zawiera te klucze:>>> "{\\} {*}".format(**{"\\": 'Hello', "*": 'World!'}) "Hello World!"
(Proszę, nie rób tego.)
W pierwszym przypadku interpunkcja nie jest dozwolona, ponieważ nie możesz mieć identyfikatorów, które ich używają.
Poza tym: zdecydowanie wybrałbym
print
lubformat
, jak sugerują inne odpowiedzi, jako alternatywę. Opcje, które podałem, mają zastosowanie tylko wtedy, gdy z jakiegoś powodu musisz użyć f-stringów.To, że coś jest nowe, nie oznacza, że powinieneś próbować i robić z tym wszystko ;-)
źródło
Nie potrzebujesz f-stringów ani innych elementów formatujących, aby wydrukować listę ciągów z separatorem. Po prostu użyj
sep
argumentu słowa kluczowego, abyprint()
:names = ['Adam', 'Bob', 'Cyril'] print('Winners are:', *names, sep='\n')
Wynik:
To powiedziawszy, użycie
str.join()
/str.format()
tutaj byłoby prawdopodobnie prostsze i bardziej czytelne niż jakiekolwiek obejście f-string:print('\n'.join(['Winners are:', *names])) print('Winners are:\n{}'.format('\n'.join(names)))
źródło
print(*dir(some_object), sep='\n')
Lubprint(*vars(some_object), sep='\n')
.str.join()
:text = '\n'.join(['Winners are:', *names])
. BTW,print()
może służyć do zapisywania do dowolnego pliku ( domyślnie określonyfile
argumentemsys.stdout
).Nie możesz używać odwrotnych ukośników w f-stringach, jak powiedzieli inni, ale możesz obejść to za pomocą
os.linesep
(chociaż pamiętaj, że nie będzie to\n
na wszystkich platformach i nie jest zalecane, chyba że czytasz / zapisujesz pliki binarne; zobacz komentarze Ricka ):>>> import os >>> names = ['Adam', 'Bob', 'Cyril'] >>> print(f"Winners are:\n{os.linesep.join(names)}") Winners are: Adam Bob Cyril
A może w mniej czytelny sposób, ale gwarantowany
\n
, zchr()
:>>> print(f"Winners are:\n{chr(10).join(names)}") Winners are: Adam Bob Cyril
źródło
os.linesep
to nie jest dobry pomysł podczas pisania tekstu.os.linesep
służy tylko do czytania lub czytania i pisania w trybie binarnym . Wiem, że w tym przypadku będzie działać tak samo, ale zaczynanie jest złym nawykiem. Ale znowu: nie byłem przeciw. To zastrzeżenie jest dla mnie wystarczająco dobre. :)Inne odpowiedzi dają pomysły, jak umieścić znak nowej linii w polu f-string. Jednak argumentowałbym, że na przykład podany w PO (który może, ale nie musi wskazywać na faktyczny przypadek użycia PO), żaden z tych pomysłów nie powinien być faktycznie wykorzystywany.
Cały sens używania f-stringów polega na zwiększeniu czytelności kodu. Nie ma nic, co możesz zrobić z f-stringami, z którymi nie możesz zrobić
format
. Zastanów się dokładnie, czy jest coś bardziej czytelnego na ten temat (jeśli możesz to zrobić):f"Winners are:\n{'\n'.join(names)}"
...albo to:
newline = '\n' f"Winners are:\n{newline.join(names)}"
...albo to:
"Winners are:\n{chr(10).join(names)}"
w porównaniu z tym:
"Winners are:\n{}".format('\n'.join(names))
Ostatni sposób jest co najmniej tak samo czytelny, jeśli nie bardziej.
Krótko mówiąc: nie używaj młotka, gdy potrzebujesz śrubokręta tylko dlatego, że masz nowy, błyszczący. Kod jest czytany znacznie częściej niż jest pisany.
W innych przypadkach użycia tak, jest możliwe, że
chr(10)
pomysł lubnewline
pomysł będzie odpowiedni. Ale nie dla podanego.źródło