7. 字符串
7.1 定义与创建
字符串就是Python中的路人脸,它看起来非常普通也是python中最常见的数据类型。但也正是字符串无处不在的原因,让它具有极强的适应能力与包容性:哪儿都有它,它也能为了适应环境拥有多副面孔。
他的无处不在是环境的需要,因此他的创建也要足够简单干脆,把他装进一对引号 ‘’ 或 “” 中,然后赋给一个变量名就好:
# 他可以在单引号中成长:
>>> name1 = 'Think'
# 他也可以在双引号下出现:
>>> name2 = "About"
7.2 访问
7.2.1 普通访问
字符串内部存在两套索引,正向索引从0开始每次递增1、反向索引倒着从-1开始每次递减1。我们可以用 变量[索引] 的方式访问:
>>> a = 'Think'
>>> a[3]
'n'
我们还可以用 变量[索引:索引] 的方式来访问,此时记得采取 用 左闭右开 的原则。例如 用 变量[m:n] 即是以索引为m的字符开始截取,截取到索引为n-1的字符:
>>> a = 'Think'
>>> a[1:3]
'hi'
如果从第一个索引开始截取我们可以省略到引号前面的部分,用 变量[:索引] 的方式:
>>> a = 'Think'
>>> a[:2]
'Th'
如果截取到最后一个我们可以省略掉引号后面的部分,用 变量[索引:] 的方式:
>>> a = 'Think'
>>> a[3:]
'nk'
如果截取全部也可以省略掉冒号两边的数字,用 变量[:] 来访问:
>>> a = 'Think'
>>> a[:]
'Think'
为了便于理解,可以见图:
7.2.2 寻找特殊信息
7.2.2.A 查看字符串长度
我们也可以用一些方式来查看字符串的一些特殊信息,例如用 len(变量名) 查看字符串的长度:
>>> a = 'Think'
>>> len(a)
5
7.2.2.B 查看字符串极值
还可以用 max(变量名) 查看字符串中的最大值,或者用 min(变量名) 查看字符串中的最小值等:
>>> a = '3579'
# 查看最大值
>>> max(a)
9
#查看最小值
>>> min(a)
3
Ⅰ. 当字符串内容为数字或者英文时:
我们发现当字符串内都是整型数字时,即按照数字大小作为规则。当然也可以对英文字母排序,例如:
>>> a = 'abcdef'
# 查看最大值
>>> max(a)
'f'
#查看最小值
>>> min(a)
'a'
Ⅱ. 当字符串内容为汉字时:
但是当字符串内容为汉字的时候,排序起来就比较麻烦了。网上关于爬虫汉字排序的有不少文章,有人说是按照id值,有人说按照拼音首字母。某些情况下可能确实会出现这样的现象,但是当你对足够多的字符串进行测试后就会发现这个“规律”不是特定的,例如下面这个例题:
>>> a = '你好啊'
# 看一下max和min
>>> max(a); min(a)
'好'
'你'
'''
发现最大值是'好',最小值是'你'。
而A<H<N,所以显然不可能是按照首字母排序。
'''
# 我们再看一下a内三个字符串的id以及三个字本身的id
>>> id(a[0]);id(a[1]);id(a[2])
3099049834736
3099049834496
3099049834496
>>> id('你');id('好');id('啊')
3099049834496
3099049834736
3099052672544
#这时我们知道,盛传的“按首字母”和“按id”显然是错误的了。
那究竟是按照什么呢?其实在计算机中汉字排序本身是没有统一的规则的,这和最初计算机对汉字的编码有关系。我能力不够就不打肿脸充胖子了,这里有一篇关于Python汉字排序的文章很好,如果真的感兴趣可以了解一下:
Ⅲ. 当字符串英文数字混合时:
还要注意一点是,如果某个字符串中同时出现了字母和整型数字的话,Python默认字母大于数字,基于这个原则再进一步判断。我们可以先用最大的单位整型数字 9 和字母表判断一遍大小验证这个原则:
>>> a = '9'
>>> import string # 调用内部模块 string,这个模块内有很多内容我们可以直接用
>>> for i in string.ascii_lowercase: # 把26个字母赋给 i ,再依次判断它们是否大于a的值9:
··· print(i>a)
True
True
True
True
True
True
True
True
True
True
True
True
True
True
True
True
True
True
True
True
True
True
True
True
True
True
我们看到返回了26个 True ,就说明26个字母中每个字母都比最大的单位整型数字 9 大。
对于刚才遍历26个字母的过程,已经会至少一种方式的可以直接跳过下面这段,对上述代码还有疑惑的可以看这段详细解释:
刚才我在遍历26个字母的时候,用了这样的方式:
import string
for i in string.ascii_lowercase:
第一行:其中 import … 是调用某个模块的方式,我们在这里调用的是 string 这个内置模块,用它可以直接调用很多常用字符串。
第二行前半句:其中 for 目标 in 模块 是将某个模块下的内容赋给 i 用的,可以将 for … 理解为“给…”。所以 for i in string 的意思为:调用string模块给i。
第二行后半句:我们不需要把整个string模块都给i,只需要把小写字母给他就行了。而小写字母从目录上属于ASCII码,所以我们首先要用 for 目标 in 模块.模块下二级目录_模块下三级目录 的方式让这个调用更精确。所以 string.ascii_lowercase 的意思为:将string模块下ASCII码中的lowercase(小写字母)全部赋值给i。
这样,a~z就都成功给i了。
我们再看一个例子:
>>> a = 'Think25'
>>> max(a); min(a)
'n'
'2'
当字母与数字混合的条件下寻找最大值时,因为数字默认比字母小,所以会略过数字直接在字母中寻找排序最往后的就是最大值。而当寻找最小值时,也会略过字母直接在数字中寻找最小值。
7.2.3 简单查找
我们可以用 ‘内容’ in 变量名 与 ‘内容’ not in 变量名 对字符串内是否存在某个内容进行检索。关于这个用法有两个注意要点:
- 一次可以检查多个连续的内容。
- 检索时要区分大小写。
关于这两个特点,我们通过例题来感受:
>>> a = 'Think'
>>> 'h' in a
True
>>> 'in' in a
True
>>> 't' in a
False
通过观察上面的例题我们发现 ‘in’ 可以被检索到,即可得知特点1:一次可以检查多个连续的内容
同时 ‘t’ 检索不到,所以得知特点2:检索时区分大小写
7.2.4 特定检查
7.2.4.A 检查内容索引
Ⅰ. 从左边开始检索:
我们不仅仅可以检查字符串中是否包含某个内容,我们还可以用 变量名.find(内容) 和 变量名.index(内容) 来检查具体内容的索引。这两种用法一共有三个特点需要注意: