如何在 f 字符串中使用换行符 '\n' 来格式化字符串列表?

2025-03-13 09:02:00
admin
原创
101
摘要:问题描述:我尝试了这个代码:names = ['Adam', 'Bob', 'Cyril'] text = f"Winners are: {' '.join(names)}" print(text) 但是,不能在f 字符串的表达式部分''内使用。我该如何让它工作?结果应该是:{...}Wi...

问题描述:

我尝试了这个代码:

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!"

(请不要这样做。)

在前者中,不允许使用标点符号,因为您不能拥有使用它们的标识符。


另外:我肯定会选择printformat,正如其他答案所建议的那样。我给出的选项仅适用于您出于某种原因必须使用 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.
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   4053  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   2777  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Freshdesk、ClickUp、nTask、Hubstaff、Plutio、Productive、Targa、Bonsai、Wrike。在当今快速变化的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多企业在项目管理过程中面临着诸多痛点,如任务分配不...
项目管理系统   95  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Monday、TeamGantt、Filestage、Chanty、Visor、Smartsheet、Productive、Quire、Planview。在当今快速变化的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多项目经理和团队在管理复杂项目时,常...
开源项目管理工具   111  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Smartsheet、GanttPRO、Backlog、Visor、ResourceGuru、Productive、Xebrio、Hive、Quire。在当今快节奏的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多企业在选择项目管理工具时常常面临困惑:...
项目管理系统   97  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用