![例解Python:Python编程快速入门践行指南](https://wfqqreader-1252317822.image.myqcloud.com/cover/703/35808703/b_35808703.jpg)
2.2 字符串
2.2.1 常用的定义字符串的方式
Python中,字符串被定义为引号之间的字符集合。引号既可以使用单引号,也可以使用双引号。无论单引号,还是双引号,表示的含义都完全相同。此外,Python支持三引号(三个连续的单引号或双引号),用于包含特殊字符,保存原始格式。如下所示:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_18.jpg?sign=1739252448-v466WUu6fDRJ3ad0cYRknnOB8kKanq0a-0-1be9f5cbbede1e745ce6c86aab0e23f8)
为了正确地表示字符串中的单引号,需要在字符串两边使用双引号。如果采用了单引号,就会出现语法错误,因为Python将找到的第二个单引号与第一个单引号实行配对,如下所示:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_19.jpg?sign=1739252448-hgnIpDiSRq5eXbY27JKsYvOPgVZeTiNm-0-c59aac4634a44330eab5b2b6c98ae3d1)
如果字符串中间有回车,则输入时需要使用转义字符:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_20.jpg?sign=1739252448-LoiXeA7iLQGYuS0bF3k4tqTyHjeXrS5P-0-f4dc3ad4baad645f07b90ff1752a8f8d)
三引号能够保存输入时的原始样式,如下所示:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_21.jpg?sign=1739252448-EcrlGg1klB5YmI5JQSNVB7zz1Tlg2mHg-0-bff9ae207006aead377bb70e5b421d1d)
在Python内部保存的时候,并没有分成多行,还是用\n表示回车。不使用print语句,直接输入变量就可以看到Python存储的样式:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_22.jpg?sign=1739252448-YB9ZsIhusw7bbmNzil1LrWyxc4mj4Exi-0-b357f4748155a2a832b828226a759990)
2.2.2 通过字符串切片获取字符或子串
使用索引运算符[ ]来得到一个字符。按照从左到右的顺序取字符,第一个字符的索引(也常被称为下标)是0;按照从右到左的顺序取字符,还可以使用负数,最后一个字符的索引是-1。如果使用的下标已经超出范围,则会出现IndexError的异常:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_23.jpg?sign=1739252448-2mDZCI05avadJND1nGgBMDeneznoqyS4-0-7796300be4032291dfe438a7ea5e1b54)
使用切片运算符[:]来得到一部分字符串。冒号左侧是起始下标,右侧是结束下标。其中,起始下标对应的字符包含在子串内,而结束下标对应的字符不包含在子串内。所以取出字符串“Python”的前两个字符,需要使用以下方式:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_24.jpg?sign=1739252448-a0dEvQ11K4GKntmnSr2jlDh0QscLhhWi-0-1dc1afc8d85f02891b2efc19c52d2abc)
那么,如果需要取出“thon”呢?字符“n”的下标是5,从下标为2的第三个字符取到下标为5的子串只能取出“tho”:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_25.jpg?sign=1739252448-lTDmbfBKSShRWKRYd25pK2NHpMFaNafO-0-a10f37c916aa5a84c3ef3cae57f94209)
试一下将结束下标改为6,虽然字符串没有这个下标值:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_26.jpg?sign=1739252448-Q1eNGNlSmlhGrIRE7Fbd7uM8ECyAslwO-0-dd79a360f1ef1f1666759d8c05fc4a07)
通过上面的例子,可以得到结论:通过索引运算符取出一个字符,如果索引超出范围会发生错误,而通过切片运算符取子串,下标值可以是任意值。既然6都能用,60是不是也能使用呢?如下所示:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_27.jpg?sign=1739252448-Yoh5kX5ZlhDFvJpBx9DVQR0WoboZqgK1-0-4afbfd41feb3d29958538c91a047a99a)
在实际使用过程中,如果想取到结尾,结束下标干脆就不用写了:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_28.jpg?sign=1739252448-riUO84XXJuN6JvPFrGwaOL9qqgEjLdag-0-74ef2709bad962fcc577d0fca08f7c57)
同样的道理,从开头取,起始下标也是不用写的:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_29.jpg?sign=1739252448-hI5nQlnis2oLlTubQfd6NsQUaNsCd4JZ-0-6e3b37bd5c285f69b45bd5ec79aab011)
字符串取切片还支持一个步长值,可以跳跃地取子串,如只想取出“Pto”:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_30.jpg?sign=1739252448-wtzVSxIYsb4IIAA0bbEZ31IOAgKp8mJ3-0-273b3c39619b0d20193a45df4305c67e)
起始下标和结束下标都没有写,表示从头取到尾,步长为2表示每隔一个字符取一个字符。如果只需要取出“yhn”,则如下所示:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_31.jpg?sign=1739252448-j6WDs5AJ1wrREkmMkVeeCRoK7qszPtPi-0-858b71fd961d7e39feff4624345111e5)
步长值也能使用负数,表示自右向左取切片:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_32.jpg?sign=1739252448-UUGrXmVI1gs2LeSiru07i8iu3WJs5Hkg-0-3fc9bddd88ca171e4a7b81482e4fba31)
2.2.3 字符串的拼接与重复
字符串支持+操作,和数字运算不一样,字符“相加”只是简单地将两个字符串拼接到一起:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_33.jpg?sign=1739252448-vAeCv1OHpaxrC9oN4GcQdRkj4wLwRFSC-0-04ea9a42eccba651fa081cbc333607ab)
只要参与拼接的双方最终都是字符串对象就行,变量py_str是字符串类型,也可以实现拼接操作:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_34.jpg?sign=1739252448-lrwosgiwH0slykK3GZy1WqfVAb9kbJPi-0-811401aad4d836b9f9eef467c510cafa)
字符串还支持*操作,字符串的*表示将字符串重复多次:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_35.jpg?sign=1739252448-qKnR4eRRhyzL7y8MBW7maVkkdPIWkXmx-0-88c6e85509c9a77328c1233cdbd7ac07)
2.2.4 字符串成员关系判断
判断字符或字符串是否存在于另一个字符串中:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_36.jpg?sign=1739252448-99o0FmYRmjl7R3OhqLA8jBuFkzGnVu9Z-0-2329d37317f1fb32c0415d4fa8f15b84)
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_37.jpg?sign=1739252448-kaJClJnDLFGQjX3GaBpHbq43oUP6Q7o0-0-0fe1d471f347b580b1c208863bad4d0e)
2.2.5 字符串方法
字符串拥有非常多方法,这里仅仅将常用的方法做一个简单的说明,完整方法请查阅官方文档,或使用help帮助。
➢ str.strip()。
strip()默认用于去除字符串两端的空白字符。空白字符并不是只有空格,全部的空白字符是" \r\t\v\f\n"。如下所示:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_38.jpg?sign=1739252448-IGnoAbIPEXCJ3Zfg0xTBazpiE3F89dwC-0-648ab4434e8ff9a8a05a6aaed1e61cf0)
strip()也可以去除两端指定的字符:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_39.jpg?sign=1739252448-Ey41NRBDOeFuVFhZZrJNHZlYI5Ft7Mz2-0-7b7679194d64caf713c411f80d32b57a)
如果只是去除左端或右端的字符,则使用lstrip()或rstrip():
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_40.jpg?sign=1739252448-zNMDTpJkMuLDFxfwB4s3AUOkvkgyDn4E-0-69e36844c1f5dd34fb3cfc97ea2f3509)
➢ str.split()。
split()默认使用空格作为分隔符,将字符串分隔开。
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_41.jpg?sign=1739252448-1IE38QOifS6AYXKOyfjdaO4Fi5kWaGAU-0-2377bb0e870c9c27393a256256b030e9)
也可以指定分隔符:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_42.jpg?sign=1739252448-JMoVWGFYnf8NlRLGTzUobfZBN6xbGCet-0-df856a4dd1b6ed47732b0e9eec6c61d0)
➢ str.replace()。
通过名称就能猜到,它用于字符串的替换操作:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_43.jpg?sign=1739252448-ohPz1UNDwxNKZZpLpg1dYsNmruaMVp9T-0-67e8432b061966aaedb480569f11be0e)
➢ str.islower()。
字符串中的字母全部是小写则返回True,不考虑非字母字符:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_44.jpg?sign=1739252448-VhIKOiDFqFmoMGFxYz4Eq0owYm1qbD6o-0-8f811b456cf732b3b0bc8275ab2a6d2c)
➢ str.isupper()。
字符串中的字母全部是大写则返回True,不考虑非字母字符:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_45.jpg?sign=1739252448-4I3EmWgTlxnKLUwjJBF6vJJsvXThIhPR-0-09bacee0659206d5a40b00987b4cbe5b)
➢ str.isdigit()。
字符串中所有字符全部是数字才返回True:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_46.jpg?sign=1739252448-rgNyKFLqeqi787irfplgeuFAe5MArqP0-0-6d1c6c361aa10335d0577705f73b1499)
➢ str.ljust()。
字符串左对齐:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_47.jpg?sign=1739252448-qAfBTDrbRSgjI0n6hfOK8hjcbLda2N1q-0-f9a88042172cbc81fa31f74bcc7a87f0)
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_48.jpg?sign=1739252448-XbmOJRW4cZLQrewLmboEOmlXh9lT4pzr-0-f32cee784dbab24b4ca69255d2db9e8a)
➢ str.rjust()。
字符串右对齐:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_49.jpg?sign=1739252448-Aylv8PkF4959rYjV5rR0XaOtd4tVeFIU-0-8f08ae2a35e4243744d663c538ae759d)
➢ str.center()。
字符串居中:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_50.jpg?sign=1739252448-az156uErfWw1egk0QQ0XINANF0gCsMXa-0-af32df64ccf050561b2103cd52b4aaa3)
➢ str.startswith()。
判断字符串以哪些字符开头:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_51.jpg?sign=1739252448-Y1R7zqESnTfCZWoyJ7AgdQkr5yzXCvii-0-dda73e368628284736f405cd467a11e7)
➢ str.endswith()。
判断字符串以哪些字符结尾:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_52.jpg?sign=1739252448-3ZIZ29nhyFnGpUjYLeKK0d13LB7aMJBZ-0-5bcc3b0693c23a7ed25b8fe21ad453e5)
2.2.6 字符串格式化方法
如果字符串中有变化的数据,则可以用%s进行占位:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_53.jpg?sign=1739252448-gofWovaSxZnnSffPrjXKubLFVvxXBQSv-0-a8782f3253cf195884c37d800ba7126a)
在中间%的前面有一个字符串,字符串中有两个%s进行占位,这两个%s被后面元组中的字符串“Tom”和数字20替换。
%s表示使用str()函数将相应的数据进行转换。上面的例子中,20是十进制整数,它也可以使用%d进行占位:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_54.jpg?sign=1739252448-XmlQIt5nd6FZiO6pTbLL7kc8pkc1MNhm-0-ccc16f432b8bc81393e569c057fc700b)
占位符还可以是一个表示宽度的数字:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_55.jpg?sign=1739252448-99oh0j3iRc01tN7djgcVtDn0DRZnGTdW-0-a394ad3a63235a1ecbfb68894a050b53)
第一个%10s表示后面元组中的“name”字符将占据10个字符的宽度,因为“name”的宽度是4,那么需要在它前面补上6个空格。
%s中间的数字,正数表示右对齐,采用负数可以实现左对齐:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_56.jpg?sign=1739252448-NfFKpIRpZ8WpWtkq8KDHGEZ8QqdiEtKr-0-e36acc4e392342526d4842e4f6fdfb1c)
浮点数使用%f:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_57.jpg?sign=1739252448-eJ0ArZS7GX7UjhYmmwoq44tgMCppRlaP-0-6459ea2578115498531e9a0948b0af83)
以八进制数进行输出:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_58.jpg?sign=1739252448-JcXkmzYCGASTz0rC0WJw37stoesDK2iv-0-22d83727a0290b90252e691083216f78)
以十六进制数进行输出:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_59.jpg?sign=1739252448-3VqL0c2GUettuLAeQUJYWLbYI7gfXOzk-0-bca363eead6bc4ccd64df8c44c1b908d)
使用%%输出百分号:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_60.jpg?sign=1739252448-gr6qh90Z0iJypCFla2tDc51IrgB352SY-0-ee4e495f4a230c96cdb670856b52a813)
2.2.7 利用原始字符串表达字面本身的含义
如果你正在使用Windows系统编写程序,很可能会需要定义一个路径,就像这样的:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_61.jpg?sign=1739252448-x2lsImCAFZmhr2W84u0aL0kc6gLCTl8a-0-93ea08cfd8e7eddd10888a8b3e764d91)
接下来我们用print语句进行输出:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_62.jpg?sign=1739252448-EJ79RGJlistgRbfJfG6JyylSL0qHDahM-0-0cacdd61ed9efca72171ecd3c4e8c096)
你没有看错,就是这样的!为什么呢?因为\t将会变成Tab键,而\n会被翻译成回车。因此,路径就不得不这么书写:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_63.jpg?sign=1739252448-tyFJz3nTtejDTwsRefZDLkzd9LqkSTq4-0-5d92eabedd0593e9089df90b45c4109a)
现在好了,Windows系统的路径不再出现错误,两个反斜线表示一个真正的反斜线,它不会再和后面的字母t和n组合起来表示其他含义。不过,这种写法很麻烦,每次都要写两个反斜线,这个时候,原始字符串就派上用场了。
原始字符串就是在字符串前面加一个r而已:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_64.jpg?sign=1739252448-jYQhhT9AJXGgYBLnPRIf0RZwLIwoDMDE-0-9df8dce86ef1706ba182080ad7ccb271)
有了原始字符串,路径看上去就真的是一个Windows路径了,不再显得那么奇怪。那么,原始字符串是怎么办到的呢?print打印出来的内容是方便给人看的,如果不用print,则Python交互解释器就会显示出它在内部存储的真正的样子:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_65.jpg?sign=1739252448-20wfWjjJLumz8jAJxSpI8uST1Pc9Z9ZB-0-be0b2fb5022696725ff771acafa24f09)
原来是加上r后,Python自动把一个反斜线变成两个了!