我想知道如何用f字符串以Pythonic方式格式化这种情况:
names = ['Adam', 'Bob', 'Cyril']
text = f"Winners are:\n{'\n'.join(names)}"
print(text)
问题是'\'
无法在{...}
f字符串的表达式部分内使用。预期产量:
Winners are:
Adam
Bob
Cyril
Answers:
你不能 反斜杠不能出现在花括号内{}
;这样做会导致SyntaxError
:
>>> f'{\}'
SyntaxError: f-string expression part cannot include a backslash
这是在PEP中为f字符串指定的:
反斜杠可能不会出现在f字符串的表达式部分内,[...]
一种选择是先'\n'
命名,然后再.join
在f
-string 内进行命名;也就是说,不使用文字:
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
-string和之间的细微差别之一str.format
。在后者中,您可以始终使用标点符号,只要打开包含这些键的相应古怪字典即可:
>>> "{\\} {*}".format(**{"\\": 'Hello', "*": 'World!'})
"Hello World!"
(请不要这样做。)
在前一种情况下,标点符号是不允许的,因为您不能使用它们的标识符。
撇开:我肯定会选择print
或format
,因为其他答案也可以替代。我给出的选项仅在由于某些原因必须使用f字符串的情况下适用。
仅仅因为有些新事物,并不意味着您应该尝试用它做一切;-)
您不需要f字符串或其他格式化程序即可使用分隔符打印字符串列表。只需使用sep
关键字参数即可print()
:
names = ['Adam', 'Bob', 'Cyril']
print('Winners are:', *names, sep='\n')
输出:
Winners are:
Adam
Bob
Cyril
就是说,使用str.join()
/str.format()
这里比任何f字符串解决方法更容易理解。
print('\n'.join(['Winners are:', *names]))
print('Winners are:\n{}'.format('\n'.join(names)))
print(*dir(some_object), sep='\n')
或)的内部print(*vars(some_object), sep='\n')
。
str.join()
:text = '\n'.join(['Winners are:', *names])
。BTW,print()
可用于写入任何文件(默认情况下使用file
参数指定sys.stdout
)。
您不能像其他人所说的那样在f字符串中使用反斜杠,但是您可以使用来解决这个问题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
os.linesep
仅用于以二进制方式读取或读写。我知道在这种情况下也可以使用,但是这是一个不好的习惯。但是再说一遍:我不是不赞成投票的人。警告对我来说足够好了。:)
其他答案给出了有关如何将换行符放入f字符串字段的想法。但是,我认为对于OP给出的示例(可能指示OP的实际用例),实际上不应该使用这些想法。
使用f字符串的全部目的是提高代码的可读性。f字符串是您无法使用的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"Winners are:\n{chr(10).join(names)}"