如何在 f 字符串中使用换行符 '\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 字符串指定:
Backslashes may not appear inside the expression portions of f-strings, [...]
一个选项是将 '\n'
分配给一个名称,然后在 f
字符串中的名称上分配 .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
字符串和 str.format
之间的细微差别之一。在后者中,您始终可以使用标点符号,前提是解压缩了包含这些键的相应古怪字典:
>>> "{\} {*}".format(**{"\": 'Hello', "*": 'World!'})
"Hello World!"
(请不要这样做。)
在前者中,标点符号是不允许的,因为您不能拥有使用它们的标识符。
旁白:我肯定会选择 print
或 format
,正如其他答案所建议的那样。我给出的选项仅在您 出于某种原因必须 使用 f 弦时才适用。
仅仅因为某些东西是新的,并不意味着你应该尝试用它做任何事情;-)
您不需要 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)))
其他答案给出了如何将换行符放入 f 字符串字段的想法。但是,我认为对于 OP 给出的示例(可能表示也可能不表示 OP 的实际用例),none 这些想法实际上应该被使用。
使用 f 字符串的全部意义在于提高代码的可读性。 format
不能用 f-strings 做任何事。仔细考虑是否有什么更可读关于这个(如果你能做到的话):
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 字符串中使用反斜杠,但您可以使用 os.linesep
(although note this won't be \n
on all platforms, and is not recommended unless reading/writing binary files; see Rick's 评论来解决这个问题:
>>> 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 字符串对于制作简单的函数自我记录非常有用。在以下情况下,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
我想知道如何使用 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 字符串指定:
Backslashes may not appear inside the expression portions of f-strings, [...]
一个选项是将 '\n'
分配给一个名称,然后在 f
字符串中的名称上分配 .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
字符串和 str.format
之间的细微差别之一。在后者中,您始终可以使用标点符号,前提是解压缩了包含这些键的相应古怪字典:
>>> "{\} {*}".format(**{"\": 'Hello', "*": 'World!'})
"Hello World!"
(请不要这样做。)
在前者中,标点符号是不允许的,因为您不能拥有使用它们的标识符。
旁白:我肯定会选择 print
或 format
,正如其他答案所建议的那样。我给出的选项仅在您 出于某种原因必须 使用 f 弦时才适用。
仅仅因为某些东西是新的,并不意味着你应该尝试用它做任何事情;-)
您不需要 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)))
其他答案给出了如何将换行符放入 f 字符串字段的想法。但是,我认为对于 OP 给出的示例(可能表示也可能不表示 OP 的实际用例),none 这些想法实际上应该被使用。
使用 f 字符串的全部意义在于提高代码的可读性。 format
不能用 f-strings 做任何事。仔细考虑是否有什么更可读关于这个(如果你能做到的话):
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 字符串中使用反斜杠,但您可以使用 os.linesep
(although note this won't be \n
on all platforms, and is not recommended unless reading/writing binary files; see Rick's 评论来解决这个问题:
>>> 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 字符串对于制作简单的函数自我记录非常有用。在以下情况下,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