Как использовать новую строку '\n' в f-string для форматирования вывода в 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
Ответы
Ответ 1
Вы не можете. Обратные косые черты не могут появляться внутри фигурных скобок {}
; это приводит к SyntaxError
:
>>> f'{\}'
SyntaxError: f-string expression part cannot include a backslash
Это указано в PEP для f-строк:
Обратные косые черты могут не отображаться внутри частей выражения f-строк, [...]
Один параметр указывает '\n'
на имя, а затем .join
на то, что внутри f
-string; то есть без использования литерала:
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
. В последнем случае вы всегда можете использовать пунктуацию, при условии, что соответствующий wacky dict распакован, содержащий эти ключи:
>>> "{\\} {*}".format(**{"\\": 'Hello', "*": 'World!'})
"Hello World!"
(Пожалуйста, не делайте этого.)
В первом случае пунктуация не допускается, потому что вы не можете использовать идентификаторы, которые их используют.
Кроме того: я бы выбрал print
или format
, поскольку другие ответы предлагают в качестве альтернативы. Параметры, которые я дал, применимы только в том случае, если по какой-то причине вы должны использовать f-строки.
Просто потому, что что-то новое, не означает, что вы должны попробовать и сделать все с ним; -)
Ответ 2
Вам не нужны 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))
Ответ 3
Другие ответы дают идеи о том, как поместить символ новой строки в поле f-string. Тем не менее, я бы сказал, что для примера, который дал OP (который может или не может указывать на фактический вариант использования OP), ни одна из этих идей не должна использоваться.
Весь смысл использования 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
может быть уместной. Но не для одного.
Ответ 4
Вы не можете использовать обратную косую черту в 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