繁体   English   中英

如何在 f-string 中使用换行符 '\\n' 来格式化 Python 3.6 中的输出?

[英]How to use newline '\n' in f-string to format output in Python 3.6?

我想知道如何使用 f-strings 以 Pythonic 的方式格式化这个案例:

names = ['Adam', 'Bob', 'Cyril']
text = f"Winners are:\n{'\n'.join(names)}"
print(text)

问题是'\\'不能在 f 字符串的{...}表达式部分中使用。 预期输出:

Winners are:
Adam
Bob
Cyril

你不能。 反斜杠不能出现在花括号{} 这样做会导致SyntaxError

>>> f'{\}'
SyntaxError: f-string expression part cannot include a backslash

这是在PEP 中为 f 字符串指定的:

反斜杠可能不会出现在 f 字符串的表达式部分中,[...]

一种选择是将'\\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"Winners are:\\n{chr(10).join(names)}"

当然,另一个是'\\n'.join事先,然后相应地添加名称:

n = "\n".join(names)
text = f"Winners are:\n{n}"

这导致相同的输出。

注意:

这是f -strings 和str.format之间的细微差别str.format 在后者中,您始终可以使用标点符号,只要解压缩包含这些键的相应古怪字典:

>>> "{\\} {*}".format(**{"\\": 'Hello', "*": 'World!'})
"Hello World!"

(请不要这样做。)

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


旁白:我肯定会选择printformat ,因为其他答案建议作为替代。 我给出的选项仅适用于出于某种原因必须使用 f 字符串的情况。

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

您不需要 f 字符串或其他格式化程序来打印带有分隔符的字符串列表。 只需将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)))

您不能像其他人所说的那样在 f 字符串中使用反斜杠,但您可以使用os.linesep解决此os.linesep (尽管请注意这不会在所有平台上都是\\n ,除非读取/写入二进制文件,否则不推荐使用;见瑞克的评论):

>>> 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 字符串字段的想法。 但是,我认为对于 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想法可能是合适的。 但不是给定的。

如果(且仅当!)可读性是重中之重,并且速度确实不是一个因素,那么即使有更简单的编程方法,f 字符串对于使简单的函数自文档化也非常有用。 在以下情况下,f-strings 的可读性最大化:(1) 改变参数状态的语句很明显,以及 (2) 打印参数时,打印语句经过仔细格式化,并以视觉方式呈现以使参数脱颖而出: ''' 函数打印出标识标题,由程序员提供的标题、姓氏和名字组成: ''' 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)

output:
* Lovelace, Ada
* Bernoulli Numbers algorithm implemented in Python
* 10-28-42 20:13:22
print(f'{"blah\n"}')

上面的语句会引发SyntaxError ,但是为了避免错误,您可以简单地将包含 \\n 的字符串分配给一个变量并在 f-string 中使用它。

x = "blah\n"
print(f'{x}')

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM