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

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

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

Winners are:
Adam
Bob
Cyril

Ответы (6)

Вы не можете. Обратные косые черты не могут появляться внутри фигурных скобок {}; это приводит к ошибке 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 "Победителями стали: \ n {chr (10) .join (names)}"

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

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

, что дает тот же результат.

Примечание:

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

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

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

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


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

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

Вы не можете использовать обратную косую черту в 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
print(f'{"blah\n"}')

Приведенный выше оператор вызовет SyntaxError, Но чтобы избежать ошибки, вы можете просто назначить строку, содержащую \ n, переменной и использовать ее в f-строке.

x = "blah\n"
print(f'{x}')

Если (и только если!) Читаемость является наивысшим приоритетом, а скорость действительно не имеет значения, f-строки очень полезны для того, чтобы сделать простую функцию самодокументированной, даже если есть более простые способы ее программирования. Читаемость максимальна с помощью f-строк, когда: (1) операторы, которые изменяют состояние аргумента, явно очевидны и (2) когда аргументы распечатаны, оператор печати тщательно отформатирован и визуально представлен, чтобы аргументы выделялись: '' ' функция для распечатки идентификационного заголовка, состоящего из программиста предоставили титул, фамилию и имя: '' ' 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)

output:
* Lovelace, Ada
* Bernoulli Numbers algorithm implemented in Python
* 10-28-42 20:13:22

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

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

Вывод:

Winners are:
Adam
Bob
Cyril

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

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

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

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

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) или новая строка. Но не для данного.

2022 WebDevInsider