![e9982453d589af8d4a75669ef11f2295.png](https://i-blog.csdnimg.cn/blog_migrate/caef37f802636fbf9eebd39e0143912f.jpeg)
在编写程序时,你会经常使用字符串。字符串是由单引号、双引号或三引号围住的一系列字母。Python 3将字符串定义为“文本序列类型”。你可以使用内置的str函数将其他类型转换为字符串。
在本文中,你将学习如何:
创建字符串
字符串方法
字符串格式化
字符串连接
字符串切片
让我们从学习创建字符串的不同方法开始吧!
创建字符串
这里是创建字符串的一些例子:
![413213c53e6803b86701288002f9c234.png](https://i-blog.csdnimg.cn/blog_migrate/ad0ef939fd63f582c8ae9d61be87a8f0.jpeg)
当你使用三重引号时,你可以在字符串的开头和结尾使用三个双引号或者三个单引号。另外,请注意,使用三重引号可以创建多行字符串。字符串中的任何空白也将包括在内。
下面是一个将整数转换成字符串的例子:
![598f2b9cf6d41582d19dc9148363ab56.png](https://i-blog.csdnimg.cn/blog_migrate/fe8f28b4a55207966c351b4db53a1ea8.jpeg)
在Python中,反斜杠可用于创建转义序列。这里有几个例子:
b – 退格符
– 换行
– ASCII 回车
– tab
你还可以去阅读Python文档了解其他的转义序列。
你也可以使用反斜杠来转义引号:
![6819811c256b9ab13ac4a72d9cb5c0dc.png](https://i-blog.csdnimg.cn/blog_migrate/38aa42c24feb368e5156f8c4444c1711.jpeg)
如果你在上面的代码中没有使用反斜杠,你会收到一个SyntaxError:
![7826e2166d91b3e905831cb695e077e4.png](https://i-blog.csdnimg.cn/blog_migrate/769605379776309c7dbab4ecb824a4f8.jpeg)
这个错误之所以发生是因为字符串会以第二个单引号结束。通常最好是将双引号和单引号混在一起来解决这个问题:
![6b92bda434e76904d9647932b155731d.png](https://i-blog.csdnimg.cn/blog_migrate/b390917a2d6283237c778a0900d83aaf.jpeg)
在本例中,你使用双引号创建字符串,并在其中放入单引号。这在处理“don’t”、“can’t”等缩略语时尤其有用。
现在让我们继续看看可以对字符串使用什么方法!
字符串方法
在Python中,一切皆对象。当你学习内省的时候,你将会在第18章学到它是多么的有用。现在,你只需知道字符串有可以调用的方法(或函数)就可以了。
这里有三个例子
![247015b820a8841eea658d724cddabf0.png](https://i-blog.csdnimg.cn/blog_migrate/0e98be9e99b60c12472d8c5891a132a8.jpeg)
方法名可以帮助你了解它们的作用。例如,.capitalize将会把字符串中的第一个字母变为大写。
要获得可以访问的方法和属性的完整列表,你可以使用Python的内置dir函数:
![9977d3c17fd9ba01d5a93ab328f1fd85.png](https://i-blog.csdnimg.cn/blog_migrate/6b33d0f1a72ed224bebc2295d0402c37.jpeg)
该列表的前三分之一是特殊的方法,有时称为“dunder方法”(也称为双下划线方法)或“魔术方法”。你现在可以忽略这些,因为它们更多地用于中级和高级用例。上面列表中开头没有双下划线的项可能是你最常使用的。
你会发现.strip和.split方法在解析或操作文本时特别有用。
你可以使用.strip及其变体,.rstrip和.lstrip,来去除字符串中的空格,包括制表符和换行符。这在你读取需要进行解析的文本文件时特别有用。
实际上,你经常会从字符串中去除行尾字符,然后对结果使用.split来解析出子字符串。
我们来做一个小练习,在这里你将学习如何解析出一个字符串中的第二个单词。
首先,这里有一个字符串:
![a0848bbd507626af912bdaa5616cf099.png](https://i-blog.csdnimg.cn/blog_migrate/88204a9fefee6c9b4dc324eed80bd1b8.jpeg)
要获取一个字符串的各个部分,你可以调用.split,如下所示:
![eaa1960dd97ebc21392feea2df975743.png](https://i-blog.csdnimg.cn/blog_migrate/749abc6cf654858f0a4443f9ac5aa7da.jpeg)
结果是一个字符串列表。通常你会把这个结果赋值给一个变量,但这里只是为了演示,你可以跳过这一部分。
相反,因为你现在知道结果是一个字符串,你可以使用列表切片来获得第二个元素:
![46bbbe4dedf1beb910a4ec43752cf1b6.png](https://i-blog.csdnimg.cn/blog_migrate/183b76c71de0678a163514353e4ad1ad.jpeg)
记住,在Python中,列表元素是从0开始的,所以当你告诉列表你想要元素1时,这个元素其实是列表中的第二个元素。
当你在工作中进行字符串解析时,我个人发现你可以非常有效地使用.strip和.split方法来获得你需要的几乎所有数据。你偶尔会发现你可能还需要使用正则表达式(regex),但大多数情况下这两个方法就足够了。
字符串格式化
字符串格式化或字符串替换是你想要将一个字符串插入到另一个字符串中。当你需要创建一个模板时,这一点特别有用,比如构建一封正式书信模板。同时对于调试输出、打印到标准输出等等操作,字符串替换也非常有用。
Python有三种不同的方式来完成字符串格式化:
使用 % 方法
使用.format
使用格式化的字符串字面量(f-strings)
本书将重点关注f-strings,并且也会不时地使用.format。但最好是理解这三种方法是如何工作的。
让我们花点时间来学习更多关于字符串格式化的知识。
使用%s(printf-style)格式化字符串
使用%方法是Python最古老的字符串格式化方法。它有时被称为“printf-style字符串格式化”。如果你以前使用过C或C++,那么你可能已经熟悉了对这种类型的字符串替换。为了简单起见,你将在这里学习使用%的基础知识。
注意:这种类型的格式化处理起来可能很古怪,并且会导致一些常见的错误,比如不能正确地显示Python元组和字典。在这种情况下,最好使用其他两种方法中的一种。
使用%符号最常见的用法是当你使用%s的时候,这意味着你要使用str将任何Python对象转换为字符串。
下面是一个例子:
![9d3e74ebed3cd0e82d51f3b194ac8f8c.png](https://i-blog.csdnimg.cn/blog_migrate/a1dbb766f055a565664a8160e14a32d8.jpeg)
在这段代码中,你获取变量name,并使用特殊的%s语法将其插入到另一个字符串中。要使它工作,你需要在字符串外面使用%,后面再跟着你要插入的字符串或变量。
下面是第二个例子,它展示了你可以把一个int类型的数据传入一个字符串,然后让系统自动为你转换:
![15bbf3114505e2904573c22a3156bc06.png](https://i-blog.csdnimg.cn/blog_migrate/57247517dd4013f105a6aaab41a6ae1c.jpeg)
当你需要转换一个对象但不知道它是什么类型时,这类东西特别有用。
你还可以使用多个变量进行字符串格式化。事实上,有两种方法可以做到这一点。
这是第一个:
![0d9d13d983674fbb234dfb263116ccbf.png](https://i-blog.csdnimg.cn/blog_migrate/54336d61758490b9e254cc548ca0eaee.jpeg)
在本例中,你创建了两个变量,并使用%s和%i。%i表示你将传递一个整数。要传递多个项,你可以使用百分号,后面再跟着要插入的项的元组。
你可以用name来让这一点更清楚,比如:
![941b9bf952ffc9f247c79a7a703fc27e.png](https://i-blog.csdnimg.cn/blog_migrate/7022d7e5c29c7915960e0162d1142132.jpeg)
当%符号右侧的参数是一个字典(或其他映射类型)时,字符串中的格式必须使用圆括号将字典中的键括起来。换句话说,如果你看到%(name)s,那么%右边的字典必须有一个name键。
如果你没有包括所有需要的键,你将收到一个错误:
![639479fc355060fe162930b0f8451674.png](https://i-blog.csdnimg.cn/blog_migrate/93b3138d3dc35fc181ef306041317f7b.jpeg)
有关使用printf-style字符串格式化的更多信息,请参阅以下链接:
https://docs.python.org/3/library/stdtypes.html#printf-style-string-formatting
现在让我们继续使用.format方法。
使用.format格式化字符串
Python字符串支持.format方法已经有很长一段时间了。虽然本书将重点介绍如何使用f-strings,但是你会发现.format仍然非常流行。
有关格式化如何工作的全部细节,请参阅以下内容:
https://docs.python.org/3/library/string.html#formatstrings
我们来看几个简短的例子,看看.format是如何工作的:
![c7b2278737c8de2b53d8bd15d36dbf28.png](https://i-blog.csdnimg.cn/blog_migrate/a14c5e3cf2bf22920c84625086b4bde8.jpeg)
本例使用了位置参数。Python会查找{}的两个实例,并相应地插入变量。如果你没有传入足够的参数,你会收到这样一个错误:
![7670cb37391fd91e34df53dc51c9ec0d.png](https://i-blog.csdnimg.cn/blog_migrate/d07399adce847be8df55ec31c2cf8d00.jpeg)
这个错误表明.format调用中没有足够的项。
你也可以用与前一节类似的方式来使用命名参数:
![9929635c7d2e8699bc4dc429f0d9af6a.png](https://i-blog.csdnimg.cn/blog_migrate/be1ca444209591fbd68b65768f95afaf.jpeg)
你可以通过名称传递参数,而不是将一个字典传递给.format。事实上,如果你试图传递一个字典,你会收到一个错误:
![cc5854399d42555a4fbc4f69c69e4a9b.png](https://i-blog.csdnimg.cn/blog_migrate/db6b60460e362c0864f84a4166e1ddd7.jpeg)
不过,这里有一个变通方案:
![0b12e2acdb43699f8e6364079bd03137.png](https://i-blog.csdnimg.cn/blog_migrate/46fe3e4325579091aab578cee232c6bf.jpeg)
这看起来有点奇怪,但是在Python中,当你看到像这样使用双星号(**)时,这意味着你正在将命名参数传递给函数。Python会为你将字典转换为name=name, age=age。
你还可以使用.format在字符串中多次重复一个变量:
![2c4830e4cf3dcf1b9b5ee894cdaa77f7.png](https://i-blog.csdnimg.cn/blog_migrate/5e0e9771b5a73cc47dcd1ad429e12da5.jpeg)
这里,你在字符串中两次引用了{name},并且你可以使用.format替换它们。
如果你想,你也可以使用数字进行插值:
![5f2c72544b98ba5a2dd8529ec457cf41.png](https://i-blog.csdnimg.cn/blog_migrate/008f6d57dbb408e8bf2537f2e8ef63d4.jpeg)
因为Python中的大多数东西都是从0开始的,所以,在本例中,你最终将age传递给了{1},将名称传递给了{0}。
使用.format时,一种常见的编码风格是创建一个格式化的字符串,并将其保存到一个变量中,以便以后使用:
![06c7728f1b936032ec9e8c45d74c81f5.png](https://i-blog.csdnimg.cn/blog_migrate/777b9c75993f3012bd7fe9f1d6262f13.jpeg)
这允许你重用greetings,并稍后在你的程序中为name和age传递更新后的值。
你也可以指定字符串宽度和对齐方式:
![eadb103340b0c2777f587b6ac96b4737.png](https://i-blog.csdnimg.cn/blog_migrate/91b5dcd1ce670a5ab13b074f84518c19.jpeg)
默认值是左对齐。冒号(:)会告诉Python你准备应用某种格式。在第一个示例中,你指定字符串为左对齐,宽度为20个字符。第二个例子也是20个字符宽,但它是右对齐的。最后,^会告诉Python将字符串放在20个字符串的中间。
如果你想像在前面的例子中一样传入一个变量,你可以这样做:
![0508b204cd68c6f331b633ec70f629a5.png](https://i-blog.csdnimg.cn/blog_migrate/7cbe3eceb0b743a78b1871f646968e9f.jpeg)
注意,name必须放在{}中的:之前。
至此,你应该已经非常熟悉.format的工作方式了。
让我们更进一步,继续来学习f-strings!
使用f-strings格式化字符串
格式化的字符串字面量或f-strings是在开头有一个“f”的字符串,其中有包含表达式的花括号,很像你在前一节中看到的那些。这些表达式会告诉f-string要对插入的字符串执行的任何特殊处理,例如对齐、浮点精度等。
f-string是在Python 3.6中添加的。你可以在这里查看PEP 498来了解更多关于它的信息以及它是如何工作的:
https://www.python.org/dev/peps/pep-0498/
包含在f-strings中的表达式会在运行时进行计算。这样,如果一个函数、方法或类包含表达式,我们就不可能使用f-string作为其文档字符串。原因是文档字符串是在函数定义时定义的。
让我们继续来看一个简单的例子:
![5297271b555fa5d21a266f06008e206d.png](https://i-blog.csdnimg.cn/blog_migrate/2c35e74c56bde49aaef4a5c5c194a565.jpeg)
在这里,你通过在字符串开头的单引号、双引号或三引号前加上“f”来创建f-string。然后在字符串内部,你使用花括号{}将变量插入到你的字符串中。
然而,你的花括号必须包含一些东西。如果你使用空的大括号创建一个f-string,你会得到一个错误:
![e8d510a6d51be23bf115f4db4185565f.png](https://i-blog.csdnimg.cn/blog_migrate/97d4cd4cde499d8d39b3bee999f0e286.jpeg)
但是,f-string可以做%s和.format都不能做的事情。由于f-strings是在运行时被计算的,所以,你可以将任何有效的Python表达式放在其中。
例如,你可以增加age变量:
![16caef477fba819c52f25dcde5dc55b5.png](https://i-blog.csdnimg.cn/blog_migrate/01768204fc2349c8c881d84263bb607b.jpeg)
或调用一个方法或函数:
![29f00301f2a01f1441269b58d6e6e68a.png](https://i-blog.csdnimg.cn/blog_migrate/b1da1d35a1e7e90a96291c713652eab6.jpeg)
你也可以直接在一个f-string里面访问字典的值:
![cfe8d80885110cd1c5aaf3343c470143.png](https://i-blog.csdnimg.cn/blog_migrate/5630b606211fdfa7ab06cad782578c5d.jpeg)
但是,反斜杠在f-string表达式中是不允许的:
![07e7c92904591031591568011fa72158.png](https://i-blog.csdnimg.cn/blog_migrate/f1091e233b787e3c75c01c4afc19fde4.jpeg)
但是你可以在f-string中的表达式之外使用反斜杠:
![1bccf87aacf83747673c0133349de2bb.png](https://i-blog.csdnimg.cn/blog_migrate/419a0662eb4276e56114e20ee42d35e2.jpeg)
另一件你不能做的事情是在f-string的表达式中添加注释:
![f4828c6fec410579015ed3ac99b1004c.png](https://i-blog.csdnimg.cn/blog_migrate/a38435a890a6542917dcc604413a7809.jpeg)
在Python 3.8中,f-strings添加了对=的支持,它将扩展表达式的文本,使其包含表达式的文本加上等号,然后是求值后的表达式。这听起来有点复杂,我们来看一个例子:
![403288effb11405d79f3c0f9bc5af646.png](https://i-blog.csdnimg.cn/blog_migrate/e0c4fcc6f9141bc893be9c2335be756a.jpeg)
这个示例演示了表达式中的文本,username=被添加到输出中,后面跟着引号中的username的实际值。
f-strings是非常强大,非常有用的。如果你明智地使用它们,它们将大大简化你的代码。你一定要试一试。
让我们看看你还能对字符串做什么!
字符串连接
字符串也允许连接,这是一个将两个字符串连接成一个字符串的时髦词。
要将字符串连接在一起,你可以使用+号:
![c6038c5cdf8c8f24dbf530a4864a0f4c.png](https://i-blog.csdnimg.cn/blog_migrate/fc47035ada00b76185a0045933cb4d72.jpeg)
哎呀!看起来字符串以一种奇怪的方式合并了,因为你忘记在first_string的末尾添加空格了。你可以这样改变它:
![816951abd3db359fbccc76b0b86ecd2b.png](https://i-blog.csdnimg.cn/blog_migrate/af7f5c5df2bfe8dcabca1d678f0ade36.jpeg)
合并字符串的另一种方式是使用.join方法。.join方法接受一个可迭代对象,比如一个字符串列表,并将它们连接在一起。
![f075c325131069943ba06071c5e5ee0f.png](https://i-blog.csdnimg.cn/blog_migrate/30088f2894b32a9c780461bf12837725.jpeg)
这将使字符串一个挨到一个进行连接。你也可以把一些东西放在你要连接的字符串里面:
![19410670164fad3e2a88975b4ee8cc78.png](https://i-blog.csdnimg.cn/blog_migrate/a48ac9c1e86d87b91e5356c5b6bd7c45.jpeg)
在本例中,它将把第一个字符串连接到***,然后再加上第二个字符串。
通常情况下,你可以使用f-string而不是连接或.join,这样代码会更容易理解一些。
字符串切片
字符串中切片的工作方式与Python列表中切片的工作方式大致相同。让我们以字符串“Mike”为例。字母“M”在位置0,字母“e”在位置3。
如果你想获取字符0-3,你可以使用这个语法:my_string[0:4]
它的意思是你想让子字符串从位置0开始,一直到但不包括位置4。
这里有几个例子:
![d9b82d43533aa4b7db609385793723ca.png](https://i-blog.csdnimg.cn/blog_migrate/1241e648349e763ec43ad43067b7d9fb.jpeg)
第一个示例从字符串中获取前四个字母并返回它们。如果你愿意,你可以删除0,因为它是默认值,并使用[:4]代替,这正是例2所做的。
你也可以使用负的位置值。因此[-4:]意味着你希望从字符串的末尾开始,并获得字符串的最后四个字母。
你应该自己尝试一下切片,看看你还能想出什么其他的切片。
总结
Python字符串很强大,也很有用。它们可以使用单引号、双引号或三引号进行创建。字符串是对象,所以它们有方法。你还了解了字符串连接、字符串切片和三种不同的字符串格式化方法。
字符串格式化的最新样式是f-string。它也是目前最强大的格式化字符串的首选方法。
英文原文:https://www.blog.pythonlibrary.org/2020/04/07/python-101-working-with-strings/
译者:天天向上
![59e7348acc746db4a9fd7679d10fcdd7.png](https://i-blog.csdnimg.cn/blog_migrate/57c151351ef0dce0b584c55a90421bbf.jpeg)