如何使用newline'\n';以f字符串格式在Python 3.6中格式化输出?

如何使用newline'\n';以f字符串格式在Python 3.6中格式化输出?,python,python-3.x,newline,python-3.6,f-string,Python,Python 3.x,Newline,Python 3.6,F String,我想知道如何使用f字符串以Python方式格式化此案例: names = ['Adam', 'Bob', 'Cyril'] text = f"Winners are:\n{'\n'.join(names)}" print(text) 问题是'\'不能在f字符串的{…}表达式部分中使用。 预期产出: Winners are: Adam Bob Cyril 你不能。反斜杠不能出现在大括号内{};这样做会导致出现语法错误: >>> f'{\}' SyntaxError: f-st

我想知道如何使用f字符串以Python方式格式化此案例:

names = ['Adam', 'Bob', 'Cyril']
text = f"Winners are:\n{'\n'.join(names)}"
print(text)
问题是
'\'
不能在f字符串的
{…}
表达式部分中使用。 预期产出:

Winners are:
Adam
Bob
Cyril

你不能。反斜杠不能出现在大括号内
{}
;这样做会导致出现
语法错误

>>> f'{\}'
SyntaxError: f-string expression part cannot include a backslash
这在f字符串的中指定:

names = ['Adam', 'Bob', 'Cyril']
text = f"Winners are:\n{'\n'.join(names)}"
print(text)
反斜杠不能出现在f字符串的表达式部分[…]

一个选项是将
'\n'
分配给一个名称,然后在
f
-字符串中加入
;也就是说,不使用文字:

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{chr(10).join(name)}”

当然,还有一种方法是
“\n”。事先加入
,然后相应地添加名称:

n = "\n".join(names)
text = f"Winners are:\n{n}"
结果是相同的输出

注: 这是
f
-字符串和
str.format
之间的一个小差异。在后一种情况下,只要打开包含这些键的相应古怪dict,就可以始终使用标点符号:

>>> "{\\} {*}".format(**{"\\": 'Hello', "*": 'World!'})
"Hello World!"
(请不要这样做。)

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


旁白:我肯定会选择
打印
格式
,正如其他答案所建议的那样。我给出的选项仅适用于出于某种原因必须使用f字符串的情况


仅仅因为有些东西是新的,并不意味着你应该尝试用它做每件事;-)

打印带有分隔符的字符串列表不需要f-strings或其他格式化程序。只需使用
sep
关键字参数即可:

输出:

Winners are:
Adam
Bob
Cyril
也就是说,与任何f字符串解决方案相比,在此处使用可能更简单、可读性更强:

print('\n'.join(['Winners are:', *names]))
print('Winners are:\n{}'.format('\n'.join(names)))

其他答案给出了如何将换行符放入f字符串字段的想法。然而,我认为,对于OP给出的示例(可能是也可能不是OP的实际用例),这些想法都不应该实际使用

使用f字符串的全部目的是提高代码的可读性。对于f字串,您无法使用
格式
。仔细考虑是否有更可读的东西(如果你能做到):

……或者:

newline = '\n'
f"Winners are:\n{newline.join(names)}"
"Winners are:\n{chr(10).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)
idea或
newline
idea可能是合适的。但这不是给你的

您不能像其他人所说的那样在f字符串中使用反斜杠,但您可以使用以下方法来解决此问题(尽管注意,在所有平台上都不使用反斜杠,除非读取/写入二进制文件;请参阅注释):

或者以可读性较差的方式,但保证是
\n
,具有:


f“获胜者是:\n{chr(10).join(names)}”
不是我,但在编写文本时使用
os.linesep
是。@Ricketachey我已经在括号中添加了警告并建议了另一种方法。无论如何,OP是打印到屏幕上,而不是写入以文本模式打开的文件。我认为这无关紧要<代码>操作系统。linesep
只是一个示例。我知道在这种情况下也是一样的,但这是一个坏习惯。但是,再一次:我不是落选者。警告对我来说已经足够好了。:)迄今为止最好的答案。这些天来,我一直在打印函数中使用星型解包来查看某些对象,例如
print(*dir(some_对象),sep='\n')
print(*vars(some_对象),sep='\n')
。如果不想直接打印列表,例如,如果要将列表传递给记录器,你该怎么办?@bob:然后使用
str.join()
text='\n'。加入(['Winners:',*名字])
。顺便说一句,可用于写入任何文件(默认情况下使用
file
参数,
sys.stdout
指定)。可读性是主观的:)。。。旧的做法适合熟练的人,在某些情况下更容易阅读,但noobs几乎不知道,因此无法阅读。抱歉,从哲学的角度来看。@malmed的可读性通常不是主观的。在这种情况下绝对不会。但这不值得争论太久。@malmed你是对的,可读性是“主观的”,因为它可以通过先前的经验来训练。但由于我们的大脑和感官都有局限性,可读性可以客观地衡量为:扫描相关文本在物理上有多容易,人类大脑倾向于模式匹配的频率有多高,它对我们大脑预测其他代码的提示有多正确(包括语句/行的开头暗示结尾),以及新手更容易阅读的程度。对我来说没有意义:
nl='\n'text=f“赢家是:{nl}”
。使用:text=f“赢家是:\n”@Timo OP需要将
连接到
\n
上的
格式字符串中,特别是在嵌入式表达式中。
>>> print(f"Winners are:\n{chr(10).join(names)}")
Winners are:
Adam
Bob
Cyril