我尝试了这段代码:
names = ['Adam', 'Bob', 'Cyril']
text = f"Winners are:\n{'\n'.join(names)}"
print(text)
然而,在f字符串的{...}
表达式部分中无法使用'\'
。我该怎么做才能让它正常工作?结果应该是:
Winners are:
Adam
Bob
Cyril
请查看为什么无法在f-strings的大括号内使用反斜杠?如何解决这个问题?,以获取有关为什么存在此限制的额外讨论。
我尝试了这段代码:
names = ['Adam', 'Bob', 'Cyril']
text = f"Winners are:\n{'\n'.join(names)}"
print(text)
然而,在f字符串的{...}
表达式部分中无法使用'\'
。我该怎么做才能让它正常工作?结果应该是:
Winners are:
Adam
Bob
Cyril
请查看为什么无法在f-strings的大括号内使用反斜杠?如何解决这个问题?,以获取有关为什么存在此限制的额外讨论。
你可以在 f-strings 中使用反斜杠,并且问题中的现有代码按预期工作。请参阅https://docs.python.org/3.12/whatsnew/3.12.html#pep-701-syntactic-formalization-of-f-strings。
不行。反斜杠不能出现在花括号 {}
内;这样做会导致 SyntaxError
。
>>> f'{\}'
SyntaxError: f-string expression part cannot include a backslash
这在 f-strings 的 PEP 中有明确规定:
反斜杠不得出现在 f-strings 的表达式部分中,[...]
一种选项是将 '\n'
分配给一个变量名,然后在 f
-string 中使用 .join
方法;也就是说,不使用字面量:
names = ['Adam', 'Bob', 'Cyril']
nl = '\n'
text = f"Winners are:{nl}{nl.join(names)}"
print(text)
结果如下:
Winners are:
Adam
Bob
Cyril
chr(10)
来获取返回的 \n
,然后在那里连接。 f"获胜者为:\n{chr(10).join(names)}"
当然,另一种方式是预先使用 '\n'.join
,然后相应地添加名称:n = "\n".join(names)
text = f"Winners are:\n{n}"
>>> "{\\} {*}".format(**{"\\": 'Hello', "*": 'World!'})
"Hello World!"
print
或format
,就像其他答案所建议的那样作为替代方案。我给出的选项只适用于如果你因某种原因必须使用f-strings。nl = '\n' text = f"Winners are:{nl}"
。请使用:text = f"Winners are:\n"
- Timojoin
函数来连接 \n
。 - Dimitris Fasarakis Hilliard{nl}
是不必要的,因为\n
不在f-string的表达式部分内。 text = f“获胜者是:\n”
是完全可以的,正是{"\n".join()}
部分在f-string中引起了问题。 - Sam'%s' % ('\n')
和'{}'.format('\n')
。 - Iuri Guilherme如果你想打印一个带有分隔符的字符串列表,不需要使用 f-strings 或其他格式化方法。只需使用 sep
关键字参数来调用 print()
函数:
names = ['Adam', 'Bob', 'Cyril']
print('Winners are:', *names, sep='\n')
输出:
Winners are:
Adam
Bob
Cyril
话虽如此,在这里使用str.join()
/str.format()
可能比任何f-string的变通方法更简单和易读:
print('\n'.join(['Winners are:', *names]))
print('Winners are:\n{}'.format('\n'.join(names)))
print(*dir(some_object), sep='\n')
或者 print(*vars(some_object), sep='\n')
。 - Rickstr.join()
:text = '\n'.join(['Winners are:', *names])
。顺便说一句,print()
可以用于写入_任何文件_(通过file
参数指定,默认为sys.stdout
)。 - Eugene Yarmash如其他人所说,您不能在f字符串中使用反斜杠,但是您可以使用os.linesep
来避开这个问题(尽管请注意,这不会在所有平台上都是\n
,并且除非读写二进制文件,否则不建议使用;参见Rick的评论):
>>> 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
os.linesep
并不是一个好主意。 - Rickos.linesep
仅适用于以二进制模式读取或读取和写入。我知道在这种情况下它将起到相同的作用,但这是一个不好的习惯。但再说一遍:我不是投反对票的人。对我来说,警告已经足够了。 :) - Rick其他答案提供了如何将换行符放入f-string字段的想法。然而,我认为对于OP提出的示例(可能或可能不是OP实际使用情况的指示),这些想法实际上都不应该被使用。
使用f-strings的整个重点是增加代码的可读性。你可以使用f-strings无法做到的任何事情,你都可以使用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
的想法可能是适当的。但对于给定的情况不是这样。
print(f'{"blah\n"}')
SyntaxError
错误,
但为了避免错误,您可以将包含 \n 的字符串赋值给变量,并在f-string中使用它。x = "blah\n"
print(f'{x}')
如果(仅当!)可读性是最重要的,而速度真的不是一个因素时,f-strings非常有用,即使有更简单的编程方法,也可以使简单的函数自文档化。当使用f-strings时,可读性最大化的方法是:(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
+ '\n'
+ title_line
+ '\n'
+ date_line)
输出:
* Lovelace, Ada
* Bernoulli Numbers algorithm implemented in Python
* 10-28-42 20:13:22
names = ['Adam', 'Bob', 'Cyril']
text = f"""{'''
'''.join(names)}"""
print(text)