Python中字符串格式化的剖析

字符串格式化剖析

 

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大本营】等你来玩奥~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值