![例解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=1739278940-GgHwtmlPjjTr3xNQNZw5l1U1d2lNeTKA-0-56e104c54a4cfe55a1f4aa9d3811f20d)
为了正确地表示字符串中的单引号,需要在字符串两边使用双引号。如果采用了单引号,就会出现语法错误,因为Python将找到的第二个单引号与第一个单引号实行配对,如下所示:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_19.jpg?sign=1739278940-xumLB61bmkZYEvL2QCyAfHWKzwOPY3eI-0-7d6d24986b1dc9c5875bd5cddf0d811e)
如果字符串中间有回车,则输入时需要使用转义字符:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_20.jpg?sign=1739278940-apKL3osn2hQWI9HdY8g8Oj8vAjCAR0FB-0-a4d39356a1a7ebed36fc6a2bf7a3c7fe)
三引号能够保存输入时的原始样式,如下所示:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_21.jpg?sign=1739278940-pcfz9deFNQB0ZecgvOMPQ9dsoIiUN6s7-0-a8ea1b4b5f52722d8de3311dc489d353)
在Python内部保存的时候,并没有分成多行,还是用\n表示回车。不使用print语句,直接输入变量就可以看到Python存储的样式:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_22.jpg?sign=1739278940-vPc22DyBTav5tMrzVVTKqHNtYVLjvm3K-0-74c7294948f1df78490b4be03a15e5b4)
2.2.2 通过字符串切片获取字符或子串
使用索引运算符[ ]来得到一个字符。按照从左到右的顺序取字符,第一个字符的索引(也常被称为下标)是0;按照从右到左的顺序取字符,还可以使用负数,最后一个字符的索引是-1。如果使用的下标已经超出范围,则会出现IndexError的异常:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_23.jpg?sign=1739278940-2AVApQNbUGtbRQBKZpQiMY8Xge3ieeOt-0-d40a104d9d2a388837c51e57d6bc8e3b)
使用切片运算符[:]来得到一部分字符串。冒号左侧是起始下标,右侧是结束下标。其中,起始下标对应的字符包含在子串内,而结束下标对应的字符不包含在子串内。所以取出字符串“Python”的前两个字符,需要使用以下方式:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_24.jpg?sign=1739278940-i9ACDnJM1JJU9yfcnDCxpwBeoPtToJPh-0-8112af57660d53c050a36222c75bf1ac)
那么,如果需要取出“thon”呢?字符“n”的下标是5,从下标为2的第三个字符取到下标为5的子串只能取出“tho”:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_25.jpg?sign=1739278940-9W1Noia46AfVuG6T1HHf8GYURhNtvikF-0-bb28c1ee631da9367d2de86765dd7062)
试一下将结束下标改为6,虽然字符串没有这个下标值:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_26.jpg?sign=1739278940-dGnKLOyPG7Cnnm0OAUXa2nZzmr1pwub1-0-529cb6001c09e7bf131cbb8ed466efa6)
通过上面的例子,可以得到结论:通过索引运算符取出一个字符,如果索引超出范围会发生错误,而通过切片运算符取子串,下标值可以是任意值。既然6都能用,60是不是也能使用呢?如下所示:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_27.jpg?sign=1739278940-11H9o3LXJtmzx5XctoJOfWmDRKpNabOJ-0-913a8d0f6d14a252985282f232c174e6)
在实际使用过程中,如果想取到结尾,结束下标干脆就不用写了:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_28.jpg?sign=1739278940-KPozGk24ShezozJg9PMk2PLDBRtlbOhz-0-bc67b84ad2643a475df93fc5f2f1843d)
同样的道理,从开头取,起始下标也是不用写的:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_29.jpg?sign=1739278940-uBZfWAsGUDUxcqdC1yGuaxUHeIYNNhBO-0-c5fa5983c408057634c468cbceabd49a)
字符串取切片还支持一个步长值,可以跳跃地取子串,如只想取出“Pto”:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_30.jpg?sign=1739278940-ATytelii9SaiSIC4VywHXw5T2FOGrPmA-0-675f1dd1125bcf6541f5dacee0aaaa03)
起始下标和结束下标都没有写,表示从头取到尾,步长为2表示每隔一个字符取一个字符。如果只需要取出“yhn”,则如下所示:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_31.jpg?sign=1739278940-EdbbcFlxDzOmDlpKCnYiV06OxyA5JQRq-0-8f2c6d2206b840c8b9aaaa12ecbf9125)
步长值也能使用负数,表示自右向左取切片:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_32.jpg?sign=1739278940-My2X27wN6Zm6rCuk5QpFEyyOfwEDdjvO-0-d85d6da78c7ce538ed5fea568476fbc4)
2.2.3 字符串的拼接与重复
字符串支持+操作,和数字运算不一样,字符“相加”只是简单地将两个字符串拼接到一起:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_33.jpg?sign=1739278940-QzUocX03X1AAFL7ZZAqq55AyDPNiDnNi-0-1609de2c22198c8ee44046ce37826504)
只要参与拼接的双方最终都是字符串对象就行,变量py_str是字符串类型,也可以实现拼接操作:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_34.jpg?sign=1739278940-WsSwxJF73VonSiNl1xrn1inm694xBvmB-0-f5975dc076c1ed23677aef84ea966bc4)
字符串还支持*操作,字符串的*表示将字符串重复多次:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_35.jpg?sign=1739278940-QBLQludkV36gpCrmJpwZFE1IxZ5nKG5N-0-4c9929ff58ea9710fa9ad57be305b5de)
2.2.4 字符串成员关系判断
判断字符或字符串是否存在于另一个字符串中:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_36.jpg?sign=1739278940-XHRVBqc5UlwuShmYuhreTuZGH1UjpDRz-0-a44653bdef1e861ea7a3b19e26f330e2)
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_37.jpg?sign=1739278940-x47DVlll2pjtHcwMzEjqe5VfkzCWWdfl-0-1d96bae2ee3968af362062fe96f676b1)
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=1739278940-tbdZLQXfcy1jpqXwxagxVI49KFFQmwkg-0-23a4b774b88c54aba4332a16528d91bd)
strip()也可以去除两端指定的字符:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_39.jpg?sign=1739278940-YDSV8ZV4HTRhiikcTN0HpJHL8HdnTrau-0-a547d0dccda03301b399524624a5d019)
如果只是去除左端或右端的字符,则使用lstrip()或rstrip():
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_40.jpg?sign=1739278940-Bm3wtqDg9p6meSRN7zJaVnR6JgiV1Clk-0-a370c68aaf229bc3fce82f3975b31b4b)
➢ str.split()。
split()默认使用空格作为分隔符,将字符串分隔开。
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_41.jpg?sign=1739278940-aadQNGBKohVjwzK8oL5foAbF1mRBw7R4-0-c354057ba8c15aa70caad93a0b5bd141)
也可以指定分隔符:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_42.jpg?sign=1739278940-IwI0u5TxV7vJFTcJ2V9khKxGI3SNnRs2-0-08076c99fc20e962a17be77033833a0e)
➢ str.replace()。
通过名称就能猜到,它用于字符串的替换操作:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_43.jpg?sign=1739278940-rNTDJw9LI7hO8iVuqGy906ptmEII8bwx-0-a1f195431faebde4022d86e20550f806)
➢ str.islower()。
字符串中的字母全部是小写则返回True,不考虑非字母字符:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_44.jpg?sign=1739278940-mfWj8gojLg4BB2mHUQPw5TX18yKHGUbR-0-bb1cca417fe656a1379113eae109bf69)
➢ str.isupper()。
字符串中的字母全部是大写则返回True,不考虑非字母字符:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_45.jpg?sign=1739278940-GVstygBokKw0BtVik6QUIIM4AzNP5ZVv-0-8c8794b7741cee586e9f963905ff8458)
➢ str.isdigit()。
字符串中所有字符全部是数字才返回True:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_46.jpg?sign=1739278940-YzZAZeZEEESkIidcXK4ivTpma1m7JGvM-0-40a66b618ddd9c7c68798cd80d8f3512)
➢ str.ljust()。
字符串左对齐:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_47.jpg?sign=1739278940-CZfmGl3oPhij676wJhYvCzsFMQzuXe0b-0-8cdb84f285898f0890e463454b8a0045)
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_48.jpg?sign=1739278940-D1oyUsqp4wXnIwOh9RJ8bR1oldWmcFwJ-0-216cbc6cc11fb71be44799da11029875)
➢ str.rjust()。
字符串右对齐:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_49.jpg?sign=1739278940-8xTy5RFnfNDY07KfgUHdlUBg7ub0Y2UW-0-236e26d3da567568ad06956fd3797ae2)
➢ str.center()。
字符串居中:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_50.jpg?sign=1739278940-ODiQgge8pNmmMVQVCfVl9Xd2Uep5ePe8-0-2c510646ed55a36b21702b796d45e37e)
➢ str.startswith()。
判断字符串以哪些字符开头:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_51.jpg?sign=1739278940-BhZiqn1ilqeBJ5LSR3xqSvHphwg5VzML-0-2ceb4c3261c6c11c4577ea5fc0596eba)
➢ str.endswith()。
判断字符串以哪些字符结尾:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_52.jpg?sign=1739278940-yV4V2ffwItYTnRMrfuxx979Uf99WKYpt-0-c366affb11bdd7717fc911b599910f44)
2.2.6 字符串格式化方法
如果字符串中有变化的数据,则可以用%s进行占位:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_53.jpg?sign=1739278940-d6OrOciA4VTEpUWhPEflsyLR7N3wmkGR-0-fc449e6b7b9286706c841f8067bac7ce)
在中间%的前面有一个字符串,字符串中有两个%s进行占位,这两个%s被后面元组中的字符串“Tom”和数字20替换。
%s表示使用str()函数将相应的数据进行转换。上面的例子中,20是十进制整数,它也可以使用%d进行占位:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_54.jpg?sign=1739278940-K4eDBsC689jYnopx83l8QC9TAcMO8OJk-0-afd4d359344f6bea14a5be5de66da56c)
占位符还可以是一个表示宽度的数字:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_55.jpg?sign=1739278940-DauwmIGz7w8kga7wd8mHP3B2SHwz5CEN-0-90280b0397468af65b51080eafefc72e)
第一个%10s表示后面元组中的“name”字符将占据10个字符的宽度,因为“name”的宽度是4,那么需要在它前面补上6个空格。
%s中间的数字,正数表示右对齐,采用负数可以实现左对齐:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_56.jpg?sign=1739278940-mKKp7w4nhmkD2Ox0eQXGVUlgjs9gFKSO-0-f5cec8276ba3196988617d52e2b6da6d)
浮点数使用%f:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_57.jpg?sign=1739278940-kB65BuIeKyAvW8qfvTYCUdJFLJxHmase-0-87b9916893e17a4572d54f4738e66419)
以八进制数进行输出:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_58.jpg?sign=1739278940-P2DICxFoEwY8oIXy1mS7ioSmkPMbLAWz-0-fc1c997066e6d2ff62d9f7db881cee20)
以十六进制数进行输出:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_59.jpg?sign=1739278940-n9JxALNjjD7ZhqqgB6JKR4MCwFj2oW1d-0-59d9b37b79edf8ab45c78431f624cc8c)
使用%%输出百分号:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_60.jpg?sign=1739278940-E4UdZ7sXtIAspCRziNDEdmIOBvZ5EtB0-0-04f6cf846ebfc02118feeb2a161dfc92)
2.2.7 利用原始字符串表达字面本身的含义
如果你正在使用Windows系统编写程序,很可能会需要定义一个路径,就像这样的:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_61.jpg?sign=1739278940-pNyGKbTY4kkSnS4VcrPcBiDZ9b6BAyN0-0-069489d151ea766994a3e0364eb36484)
接下来我们用print语句进行输出:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_62.jpg?sign=1739278940-tXVzAAdCW58VkW70HQretcRSCVXIYchA-0-9ecb5e0da7f276b18195d6d90f51696b)
你没有看错,就是这样的!为什么呢?因为\t将会变成Tab键,而\n会被翻译成回车。因此,路径就不得不这么书写:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_63.jpg?sign=1739278940-OC90JT9hu2Xm0ql1VmdWMyumcLnXAGae-0-0f2c2708ee61b32cc5a7807cf2e7c996)
现在好了,Windows系统的路径不再出现错误,两个反斜线表示一个真正的反斜线,它不会再和后面的字母t和n组合起来表示其他含义。不过,这种写法很麻烦,每次都要写两个反斜线,这个时候,原始字符串就派上用场了。
原始字符串就是在字符串前面加一个r而已:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_64.jpg?sign=1739278940-D78TpxYdoA6Y4tYjgX9QycBx2BbqqEoM-0-db737c80c85ff0dbaab0deb892904d55)
有了原始字符串,路径看上去就真的是一个Windows路径了,不再显得那么奇怪。那么,原始字符串是怎么办到的呢?print打印出来的内容是方便给人看的,如果不用print,则Python交互解释器就会显示出它在内部存储的真正的样子:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_65.jpg?sign=1739278940-qzJLqDhI9BLzFujaFe6ztluaABw3cciE-0-808ed221f0aaa8054c602e62d7546f41)
原来是加上r后,Python自动把一个反斜线变成两个了!