(给Python开发者加星标,提升Python技能)
英文:Miguel Brito,翻译:Python开发者 / felixGuo26
在本文中,我将向你展示我认为对 Python 格式化字符串 f-string 来说最重要的一些技巧。你会通过各种样例学到多种格式化字符串的方法。总的来说,就是你会看到73个关于如何完美应用 f-string 的例子。
目录一览
1. f-string 是什么?
2. 用 python 做基本的文本格式化
3. f-string 局限性
4. 如何格式化表达式
5. 如何使用f-string调试你的代码
6. 如何在不同进制下格式化数字
7. 如何使用格式化字符串常量打印出对象
8. 如何在格式化字符串常量中设置浮点数精度
9. 如何将数字格式化为百分比
10. 如何调整或者增加f-string的缩进
11. 如何转义字符
12. 如何使字符串居中
13. 如何添加千位分隔符
13.1如何使用逗号作为千分位分隔符格式化数字
13.2如何使用逗号作为小数分隔符格式化数字
14.如何用科学计数法(指数计数法)格式化数字
15.在 f-string 中使用 if-else
16.如何在 f-string 中使用字典
17.如何用 f-string 拼接字符串
18.如何格式化 datetime 对象
19.如何改正 f-string 的无效语法错误
20.如何在字符串前补零
21.如何编写多行格式化字符串常量(怎样应对新行符号)
22.总结
1、python 中的 f-string 是什么?
在 Python 的历史中,字符串格式化的发展源远流长。在 python 2.6 之前,想要格式化一个字符串,你只能使用 % 这个占位符,或者string.Template 模块。不久之后,出现了更灵活更靠谱的字符串格式化方式: str.format 方法。
过去使用 % 做字符串格式化方式的代码样例:
>>> msg = 'hello world'
>>> 'msg: %s' % msg
'msg: hello world'
用string.format的样例:
>>> msg = 'hello world'
>>> 'msg: {}'.format(msg)
'msg: hello world'
为了进一步简化格式化方法,Eric Smith 在2015年提交了 PEP 498 -- Literal String Interpolation 提案。
PEP 498 提出了一种新的字符串插值方法,该方法可以更简单便捷的使用 str.format 方法。你只需要在字符串开头加上一个字母 f,形成 f”” 的格式就可以了。
使用f-string的样例:
>>> msg = 'hello world'
>>> f'msg: {msg}'
'msg: hello world'
这就可以了!再也不需要用 string.format 或者 % 了。不过 f-string 并不能完全替代 str.format。本文也将列举出这两者并不通用的情况。
2、基本的字符串格式化
如上文所述,使用f-string格式化字符串十分简单。唯一的要求就是给它一个有效的表达式。f-string 也可以用大写F开头或者与 r 原始字符串结合使用。但是你不能将其与 b”” 或者 ”u” 混用。
>>> book = "The dog guide"
>>> num_pages = 124
>>> f"The book {book} has{num_pages} pages"
'The book The dog guide has 124 pages'
>>> F"The book {book} has{num_pages} pages"
'The book The dog guide has 124 pages'
>>> print(Fr"The book {book} has{num_pages} pages\n")
The book The dog guide has 124 pages\n
>>> print(FR"The book {book} has{num_pages} pages\n")
The book The dog guide has 124 pages\n
>>> print(f"The book {book} has{num_pages} pages\n")
The book The dog guide has 124 pages
差不多就这些!下一节中,我会用一些例子向你展示一些你用f-string能做或不能做的事儿。
3、f-string 的限制
虽然f-string十分的便捷,但它并不能完全代替str.format。f-string在表达式出现的上下文中进行求值计算。根据PEP498,这意味着该表达式可以获取所有局部和全局变量。而且该表达式是在运行时计算的表达式。如果在 { <expr> } 之中使用的表达式无法被计算,就会跳出如下异常。
>>> f"{name}"
---------------------------------------------------------------------------
NameError Traceback(most recent call last)
<ipython-input-1-f0acc441190f> in<module>
----> 1 f"{name}"
NameError: name 'name' is not defined
这对 str.format 来说就不是问题,你可以提前定义一个模板字符串,并在之后调用.format方法时再传递上下文信息。
>>> s = "{name}"
>>> s.format(name="Python")
'Python'
>>> print(s)
{name}
另外还有个限制是,你不能在f-string中使用行内注释。
>>> f"My name is {name #name}!"
File "<ipython-input-37-0ae1738dd871>", line 1
f"My name is {name #name}!"
^
SyntaxError: f-string expression part cannot include '#'
4、如何格式化一个表达式
如果不想定义变量,那你可以在大括号中使用常量。Python会计算该表达式并显示最终计算结果。
>>> f"4 * 4 is {4 * 4}"
'4 * 4 is 16'
或者你可以...
>>