我尝试了这段代码:
names = ['Adam', 'Bob', 'Cyril']
text = f"Winners are:\n{'\n'.join(names)}"
print(text)
但是,“\”不能在{…}表达式的一部分。我该怎么做呢?结果应该是:
Winners are:
Adam
Bob
Cyril
参见为什么不能在f-strings的大括号内使用反斜杠?我怎样才能解决这个问题呢?关于为什么存在限制的一些额外讨论。
我尝试了这段代码:
names = ['Adam', 'Bob', 'Cyril']
text = f"Winners are:\n{'\n'.join(names)}"
print(text)
但是,“\”不能在{…}表达式的一部分。我该怎么做呢?结果应该是:
Winners are:
Adam
Bob
Cyril
参见为什么不能在f-strings的大括号内使用反斜杠?我怎样才能解决这个问题呢?关于为什么存在限制的一些额外讨论。
你不能。反斜杠不能出现在大括号{}内;这样做会导致SyntaxError:
>>> f'{\}'
SyntaxError: f-string expression part cannot include a backslash
这是在f-strings的PEP中指定的:
反斜杠不能出现在f-string的表达式部分,[…]
一种选择是将'\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
另一个选项,如@wim所指定的,是使用chr(10)来返回\n,然后连接到那里。f”的赢家:\ n{杆(10). join(名)}”
当然,还有一个是“\n”。提前加入,然后添加相应的名称:
n = "\n".join(names)
text = f"Winners are:\n{n}"
结果是相同的输出。
注意:
这是f-strings和str.format之间的一个小区别。在后者中,你总是可以使用标点符号,前提是对应的古怪字典被解包,其中包含这些键:
>>> "{\\} {*}".format(**{"\\": 'Hello', "*": 'World!'})
"Hello World!"
(请不要这样做。)
在前者中,不允许使用标点符号,因为不能有使用它们的标识符。
题外话:我肯定会选择打印或格式化,就像其他答案建议的那样。我给出的选项仅适用于由于某种原因必须使用f-string的情况。
仅仅因为某些东西是新的,并不意味着你应该尝试用它做所有事情;-)
不需要f-strings或其他格式化程序来打印带有分隔符的字符串列表。只需使用sep关键字参数打印():
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)))
其他答案给出了如何将换行符放入f-string字段的想法。然而,我认为对于OP给出的例子(可能是也可能不是OP的实际用例),这些想法都不应该被实际使用。
使用f-string的全部目的是增加代码的可读性。你可以用f-string做任何你不能用格式做的事情。仔细考虑是否有关于这个的更可读的东西(如果你可以的话):
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)思想或换行思想可能是合适的。但不是给定的。
你不能像其他人说的那样在f-string中使用反斜杠,但你可以使用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
print(f'{"blah\n"}')
上面的语句将引发SyntaxError, 但是为了避免这个错误,你可以简单地将包含\n的字符串赋值给一个变量,并在f-string中使用它。
x = "blah\n"
print(f'{x}')
如果(仅当!)可读性是最优先考虑的,而速度确实不是一个因素,即使有更简单的编程方法,f-string对于使一个简单的函数自文档化非常有用。当:(1)改变参数状态的语句非常明显,以及(2)打印参数时,打印语句经过仔细的格式化,并在视觉上呈现,以使参数突出时,f-string的可读性最大化:
'''
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