it-roy-ru.com

Как использовать символ новой строки '\ n' в f-строке для форматирования вывода в Python 3.6?

Я хотел бы знать, как отформатировать это дело на Pythonic с помощью f-строк:

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

Проблема в том, что '\' нельзя использовать внутри f-строки . Ожидаемый результат:

Winners are:
Adam
Bob
Cyril
18
malmed

Ты не можешь Обратные косые черты не могут появляться внутри фигурных скобок {}; в результате получается SyntaxError

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

Это указано в PEP для f-строк:

Обратные косые черты могут не появляться внутри частей выражений f-строк, [...]

Одним из вариантов является присвоение '\n' имени, а затем .join для этого внутри строки f-; то есть без использования литерала:

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

Результаты в:

Winners are:
Adam
Bob
Cyril

Другой вариант, указанный @wim, заключается в использовании chr(10) для получения возвращенного \n и последующего присоединения к нему. f"Winners are:\n{chr(10).join(names)}"

Еще один, конечно, заранее '\n'.join и затем добавить имя соответственно:

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

что приводит к тому же результату.

Заметка:

Это одно из небольших различий между f- строками и str.format. В последнем случае вы всегда можете использовать пунктуацию при условии, что распакована соответствующая дурацкая инструкция, содержащая эти ключи:

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

(Пожалуйста, не делайте этого.)

В первом пунктуация не допускается, потому что у вас не может быть идентификаторов, которые их используют.


За исключением: я определенно выбрал бы print или format, как другие ответы предлагают в качестве альтернативы. Параметры, которые я дал, применимы, только если вы по какой-то причине должны использовать f-строки. 

То, что что-то новое, не означает, что вы должны пытаться делать все с этим ;-)

31
Jim Fasarakis Hilliard

Вам не нужны f-строки или другие средства форматирования, чтобы напечатать список строк с разделителем. Просто передайте аргумент ключевого слова sep в print() :

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

Результат:

Winners are:
Adam
Bob
Cyril

Тем не менее, использование str.format() здесь было бы, возможно, проще и более читабельным, чем любой обходной путь f-строки:

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

Другие ответы дают идеи о том, как поместить символ новой строки в поле f-строки. Однако я бы сказал, что для примера, приведенного ОП (который может указывать или не указывать на фактический вариант использования ОП), ни одна из этих идей на самом деле не должна использоваться. 

Весь смысл использования f-строк - повышение читабельности кода. Вы не можете ничего сделать с f-строками, которые вы не можете сделать с format. Тщательно продумайте, есть ли что-нибудь более читабельное об этом (если бы вы могли это сделать): 

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

...или это:

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

...или это:

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

против этого: 

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

Последний способ, по крайней мере, читабелен, если не более. 

Вкратце: не используйте молоток, когда вам нужна отвертка только потому, что у вас новая блестящая. Код читается гораздо чаще, чем написано. 

Для других случаев использования, да, возможно, идея chr(10) или идея newline могут быть подходящими. Но не для одного. 

5
Rick Teachey

Вы не можете использовать обратную косую черту в f-строках, как говорили другие, но вы можете обойти это, используя os.linesep (хотя обратите внимание, что это не будет \n на всех платформах, и не рекомендуется, если вы не читаете/записываете двоичные файлы) ; см. Рик / комментарии):

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

Или, возможно, менее читабельным способом, но гарантированно будет \n, с chr() :

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