我尝试了这段代码:
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的大括号内使用反斜杠?我怎样才能解决这个问题呢?关于为什么存在限制的一些额外讨论。
当前回答
其他答案给出了如何将换行符放入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)思想或换行思想可能是合适的。但不是给定的。
其他回答
print(f'{"blah\n"}')
上面的语句将引发SyntaxError, 但是为了避免这个错误,你可以简单地将包含\n的字符串赋值给一个变量,并在f-string中使用它。
x = "blah\n"
print(f'{x}')
你不能像其他人说的那样在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
如果(仅当!)可读性是最优先考虑的,而速度确实不是一个因素,即使有更简单的编程方法,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
其他答案给出了如何将换行符放入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-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)))