如何在 f 字符串中使用换行符 '\n' 来格式化字符串列表?
- 2025-03-13 09:02:00
- admin 原创
- 100
问题描述:
我尝试了这个代码:
names = ['Adam', 'Bob', 'Cyril']
text = f"Winners are:
{'
'.join(names)}"
print(text)
但是,不能在f 字符串的表达式部分''
内使用。我该如何让它工作?结果应该是:{...}
Winners are:
Adam
Bob
Cyril
请参阅为什么不能在 f 字符串的括号内使用反斜杠?如何解决该问题?了解有关存在限制的原因的更多讨论。
解决方案 1:
Python 3.12+
您可以在 f 字符串中使用反斜杠,问题中的现有代码可以按预期工作。请参阅https://docs.python.org/3.12/whatsnew/3.12.html#pep-701-syntactic-formalization-of-f-strings。
Python < 3.12
不可以。反斜杠不能出现在花括号内{}
;这样做会导致SyntaxError
:
>>> f'{}'
SyntaxError: f-string expression part cannot include a backslash
PEP中对 f 字符串有如下规定:
反斜杠不能出现在 f 字符串的表达式部分内,[...]
一个选项是分配`'
'给一个名称,然后
.join将其放在
f`字符串中;也就是说,不使用文字:
names = ['Adam', 'Bob', 'Cyril']
nl = '
'
text = f"Winners are:{nl}{nl.join(names)}"
print(text)
结果:
Winners are:
Adam
Bob
Cyril
@wim 指定的另一个选项是使用chr(10)
返回`然后加入那里。
f"Winners are:
{chr(10).join(names)}"`
当然,还有一种方法是`'
'.join`事先添加相应的名称:
n = "
".join(names)
text = f"Winners are:
{n}"
其结果为相同的输出。
笔记:
f
这是-strings 和之间的细微差别之一str.format
。在后者中,您始终可以使用标点符号,前提是解包了包含这些键的相应古怪字典:
>>> "{\\} {*}".format(**{"\\\": 'Hello', "*": 'World!'})
"Hello World!"
(请不要这样做。)
在前者中,不允许使用标点符号,因为您不能拥有使用它们的标识符。
另外:我肯定会选择print
或format
,正如其他答案所建议的那样。我给出的选项仅适用于您出于某种原因必须使用 f 字符串的情况。
仅仅因为某样东西是新的,并不意味着你应该尝试用它做所有事情 ;-)
解决方案 2:
您不需要 f 字符串或其他格式化程序来打印带有分隔符的字符串列表。只需使用sep
关键字参数即可print()
:
names = ['Adam', 'Bob', 'Cyril']
print('Winners are:', *names, sep='
')
输出:
Winners are:
Adam
Bob
Cyril
也就是说,在这里使用str.join()
/str.format()
可以说比任何 f 字符串解决方法更简单、更易读:
print('
'.join(['Winners are:', *names]))
print('Winners are:
{}'.format('
'.join(names)))
解决方案 3:
正如其他人所说,您不能在 f 字符串中使用反斜杠,但您可以使用以下方法解决这个问题os.linesep
(但请注意,这并不适用`
`于所有平台,并且除非读取/写入二进制文件,否则不建议使用;请参阅Rick 的评论):
>>> import os
>>> names = ['Adam', 'Bob', 'Cyril']
>>> print(f"Winners are:
{os.linesep.join(names)}")
Winners are:
Adam
Bob
Cyril
或者可能以一种可读性较差但保证正确的方式`,即
chr()`:
>>> print(f"Winners are:
{chr(10).join(names)}")
Winners are:
Adam
Bob
Cyril
解决方案 4:
其他答案给出了如何将换行符放入 f 字符串字段的想法。但是,我认为对于 OP 给出的示例(可能代表也可能不代表 OP 的实际用例),这些想法实际上都不应该使用。
使用 f 字符串的全部目的是提高代码的可读性。使用 f 字符串可以做的事情,用 都可以format
。仔细考虑一下这是否具有更好的可读性(如果你可以做到的话):
f"Winners are:
{'
'.join(names)}"
...或者这个:
newline = '
'
f"Winners are:
{newline.join(names)}"
...或者这个:
"Winners are:
{chr(10).join(names)}"
与此相比:
"Winners are:
{}".format('
'.join(names))
最后一种方法至少同样具有可读性,甚至更具可读性。
简而言之:当你需要一把螺丝刀时,不要仅仅因为你有一把崭新的螺丝刀就去使用锤子。代码被阅读的次数比被编写的次数多得多。
对于其他用例,这个chr(10)
想法或newline
理念可能适用。但对于给定的用例则不然。
解决方案 5:
在 Python 3.12 + 上,您可以:
>>> names = ['Adam', 'Bob', 'Cyril']
>>> print(f"Winners are:
{'
'.join(names)}")
Winners are:
Adam
Bob
Cyril
您还可以在 f 字符串的表达式部分重复使用相同的引用:
>>> print(f"Winners are:
{"
".join(names)}")
Winners are:
Adam
Bob
Cyril
有关详细信息,请参阅PEP 701。
解决方案 6:
print(f'{"blah
"}')
上述语句将引发SyntaxError
,但为了避免错误,您可以简单地将包含 \n 的字符串分配给变量并在 f 字符串中使用它。
x = "blah
"
print(f'{x}')
解决方案 7:
记住不要使用这种同样有效的奇怪方法:
names = ['Adam', 'Bob', 'Cyril']
text = f"""{'''
'''.join(names)}"""
print(text)
解决方案 8:
如果(且仅当!)可读性是首要考虑因素,而速度确实不是影响因素,那么 f 字符串对于使简单函数自我文档化非常有用,即使有更简单的编程方法。在以下情况下,使用 f 字符串可最大程度地提高可读性:(1) 改变参数状态的语句显而易见,(2) 打印参数时,打印语句经过精心格式化,并以视觉方式呈现,使参数脱颖而出:
'''
function to print out an identification header, consisting
of the programmer supplied title, lastname, and firstname:
'''
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
+ '
'
+ title_line
+ '
'
+ date_line)
输出:
* Lovelace, Ada
* Bernoulli Numbers algorithm implemented in Python
* 10-28-42 20:13:22
解决方案 9:
# Using Python 3.12.5
names = ['Adam', 'Bob', 'Cyril']
# Convert list [...] to str '[...]', apply replace method to remove '[', ']' , convert ', ' to '
' and remove single quotes
name = str(names).replace('[', '').replace(']', '').replace(', ', '
').replace("'","")
text = f"Winners are:
{name}"
# is not present inside{}
print(text)
# if one step is to be reduced
text = f"Winners are:
{str(names).replace('[', '').replace(']', '').replace(', ', '
').replace("'","")}"
print(text)
#here, join method is not used.
扫码咨询,免费领取项目管理大礼包!