Python 是一种现代脚本语言,因此它为我们提供了灵活且可读的编码。因此,我们可以用多种不同的方式来做一件事。这就是为什么到目前为止我们甚至有 4 种主要的方法来格式化字符串:
在这篇文章中,我们将介绍每种字符串格式的样式,为每种样式做一个示例,并了解它是如何工作的。
在这篇文章的最后,我们很好地理解了 Python 中字符串格式化方法的所有内容。希望它能够在您的下一个 Python 项目中帮助您。
1. 经典风格的字符串格式
那么为什么这种方法被称为经典风格。因为它很简单,也是第一种在 Python 中格式化字符串的方法。可以肯定的是,每个 Python 开发人员都在使用。
它的语法与 C-Style 非常相似,我们使用%
运算符来接收参数。
<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code><span style="color:var(--syntax-error-color)">>>></span> <span style="color:var(--syntax-text-color)">my_name</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-string-color)">"Mark"</span>
<span style="color:var(--syntax-error-color)">>>></span> <span style="color:var(--syntax-string-color)">"My name is, %s"</span> <span style="color:var(--syntax-error-color)">%</span> <span style="color:var(--syntax-text-color)">my_name</span>
<span style="color:var(--syntax-string-color)">'My name is, Mark'</span>
</code></span></span>
%
运算符让 Python 知道使用变量(在我的示例中是)my_name
来填充由 标记的占位符%s
。
这种方法的优点之一是我们可以使用%
运算符来控制参数应该转换为的数据类型。例如,%s
表示转换为字符串,%x
转换为十六进制数。您可以参考printf-style文档了解更多转换类型。
我们能够将各种变量传递到字符串中。
<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code>>>> print("My name: %s. My id: %d" % ("Bob", 1234))
My name: Bob. My id: 1234
</code></span></span>
上面的语法看起来很简单,但如果我们有大量变量,就会变得复杂且难以维护。我们必须注意变量的顺序以确保字符串正确。
为避免这种情况,我们应该在运算符之后使用字典%
。如果在字典中找到变量,它将填充字符串。否则,我们会得到一个KeyError
异常。
<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code>>>> print("My name: %(my_name)s. My id: %(my_id)d" % {"my_name": "Bob", "my_id": 1234})
My name: Bob. My id: 1234
</code></span></span>
许多开发人员评论说,这种旧式字符串格式化缺乏格式化复杂字符串的灵活性,难以维护,并且不能重用。Python 基金会确实听到了他们的声音,他们在 Python 3 中引入了现代风格的字符串格式。
>>>您可能会喜欢的相关文章:Python Pandas for Beginners – A Complete Guide
2. 现代风格的字符串格式(str.format
)
在现代风格的字符串格式化中,我们将使用内置的字符串函数.format()
而不是运算符。
<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code>>>> my_name = "Foo"
>>> 'Hello, my name is {}'.format(my_name)
'Hello, my name is Foo'
</code></span></span>
现在我们调用str.format
格式化字符串。所以你可以只用一个参数来做简单的格式化,比如上面的例子。或者,您甚至可以使用键值对进行更复杂的字符串格式化。
<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code>>> 'Hello, my name is {my_name}. I am {my_age} years old'.format(my_name = "Foo", my_age = 25)
</code></span></span>
当我们可以改变字符串中参数的顺序而不考虑键值对的顺序时,这非常有用。这是一项强大的功能,可为您的字符串格式提供灵活性和可维护性。
所以我敢肯定,你们中的许多人都需要格式化参数的数据类型,比如旧式支持。好消息是它仍然受到现代风格的支持。
<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code>>>> 'Hello, my name is {my_name:s}. I am {my_age:d} years old'.format(my_name = "Foo", my_age = 25)
'Hello, my name is Foo. I am 25 years old'
</code></span></span>
我们添加了格式规范作为参数名称的后缀。在示例中,我们使用:s
格式化字符串和:d
格式化数字。
格式规范允许您定义每个单独的值如何出现在格式字符串中。Python 在这里支持许多选项,以在编程中制作灵活甚至最复杂的字符串。
我将假设您知道简单的选项,因此我将描述一些您在编码时很少看到的选项,或者您可能不知道它存在。任何时候,您想参考任何格式规范选项的更多细节,您可以点击链接Format Specification Mini-Language。
现代风格的文本对齐
使用左对齐选项的示例<
,它也是对齐的默认值。反之亦然,我们可以>
用于右对齐。
<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code>>>> '{:<30}'.format('left aligned')
'left aligned '
>>> '{:>30}'.format('right aligned')
' right aligned'
>>> '{:<30} {:>30}'.format('left aligned', 'right aligned')
'left aligned right aligned'
</code></span></span>
您甚至可以轻松制作漂亮的字符串,如下所示
<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code>>>> '{:+^30}'.format('centered')
'+++++++++++centered+++++++++++'
</code></span></span>
在这里,我们使用一个字符+
作为填充字符。您可以将其替换为您想要的任何字符。
处理字符串中的数字示例
有许多常见的情况,每个开发人员在他们的生活中至少必须处理一次字符串中的数字。有了现代风格,它变得比以往任何时候都容易。
<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code>>> "int: {0:d}; hex: {0:#x}; oct: {0:#o}; bin: {0:#b}".format(91)
'int: 91; hex: 0x5b; oct: 0o133; bin: 0b1011011'
</code></span></span>
只需一行代码,您就可以将数字转换为您想要的任何基数。它超级简单,超级方便。
<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code>>>> '{:,}'.format(1234567890)
'1,234,567,890'
</code></span></span>
在大数中插入分隔符也没有问题。
<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code>>>> points = 19
>>> total = 22
>>> 'Correct answers: {:.2%}'.format(points/total)
'Correct answers: 86.36%'
</code></span></span>
格式化百分比数字。
>>>您可能会喜欢的相关文章:Generator And Yield Keyword In 5 Minutes
3. 最新样式字符串格式(f-Strings)
在 Python 3.6 中引入的 f-Strings 添加了另一个选项来格式化字符串。这种风格让您可以将任何变量嵌入到字符串中,不再需要运算符,不再需要format()
.
F-strings 代表“格式化字符串”,也称为“字符串插值”。它是在运行时评估的表达式,而不是常量变量。这样您的字符串就可以在运行时动态更改。这是添加到 Python 字符串格式化的一个超级强大的功能。
支持 f-strings 并不意味着其他样式会被弃用,所以不要担心旧版本的代码。
在这里,我们将通过一些使用 f-strings 的示例
简单示例
<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code>>>> f"Hello, My name is {name}. I'm {age}."
"Hello, My name is Foo. I'm 25."
</code></span></span>
这是一个简单的示例,向您展示如何用 f 字符串替换旧样式。
如您所见,前缀f
让 Python 知道这个字符串是新样式 f-strings。使用 f-strings,您可以通过花括号将表达式放入字符串。在运行时,Python 将用其输出替换表达式。
<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code>>>> f"{2 * 2}"
'4'
</code></span></span>
表达评估
如上所述,f-strings 中的表达式将在运行时进行评估。这意味着我们既可以使用简单的表达式,例如上面的示例,也可以使用更复杂的表达式,例如调用函数或预处理列表、字典。
由于在运行时求值,表达式不仅可以访问局部变量,还可以访问全局变量。
<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code>>>> def get_name():
... return "Foo"
...
>>> f"Hello, My name is {get_name()}"
'Hello, My name is Foo'
</code></span></span>
现在我想打印出一个列表的所有正数。可以在结合 f-strings 和filter()function时完成。
<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code>>>> my_list = [0, -5, 8, 15, 12, -1, -3]
>>> f"Positive numbers: {list(filter(lambda x: x > 0, my_list))}"
'Positive numbers: [8, 15, 12]'
</code></span></span>
>>>你可能喜欢的相关文章:Python *args & **kwargs in depth
4. 标准样式字符串格式(模板字符串)
在这篇文章中格式化字符串的最后一种方法是模板字符串。尽管它比其他方法功率小,但在某些特定情况下,它变得比其他方法更有用。
在进行定义之前,我们先看一下简单的示例
<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code>>>> from string import Template
>>> t = Template("Hello, my name is $my\_name")
>>> t.substitute(my_name="Foo")
'Hello, my name is Foo'
</code></span></span>
您在此处看到模板字符串提供了更简单的字符串替换,您可以在其中将模板内定义的变量替换为您的数据。
这种方法在需要向客户发送电子邮件的系统中经常使用。您可以一次性定义电子邮件模板,将变量替换为用户信息,然后发送。
这是使用 Python 字符串模板作为欢迎消息的示例。
<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code>>>> from string import Template
>>> t = Template('Dear, $name! On behalf of Python Geeks, welcome you onboard!')
>>> users = ["Mark", "David", "Hen"]
>>> for user in users:
... t.substitute(name=user)
...
'Dear, Mark! On behalf of Python Geeks, welcome you on board!'
'Dear, David! On behalf of Python Geeks, welcome you on board!'
'Dear, Hen! On behalf of Python Geeks, welcome you on board!'
</code></span></span>
>>>你可能很想知道如何在 Python 中发送电子邮件
结论
在文章的最后,您已经了解了 Python 中的 4 种不同的字符串格式化方法。我很确定你会有一个问题“在你的代码中使用哪种方法最好”。
这个问题没有正确答案。您应该了解每种方法并选择最适合您的情况的方法。但是,根据我的经验,如果您的 Python 版本低于 3.6,我建议您使用“Modern Style”,如果您的项目使用 Python 3.6 及更高版本,则建议您使用 f-Strings。
如果您正在构建需要动态模板的服务/产品,那么字符串模板将非常有用,您可以在运行时动态更改它。如果对Python有兴趣,想了解更多的Python以及AIoT知识,解决测试问题,以及入门指导,帮你解决学习Python中遇到的困惑,我们这里有技术高手。如果你正在找工作或者刚刚学校出来,又或者已经工作但是经常觉得难点很多,觉得自己Python方面学的不够精想要继续学习的,想转行怕学不会的, 都可以加入我们,可领取最新Python大厂面试资料和Python爬虫、人工智能、学习资料!微信公众号【Python大本营】等你来玩奥~