定义字符串
s = "012345"
索引下标
1.python的下标可以是0、正数、负数;
2.下标0、正数和其它语言一样,0是第一个字符的下标;
>>> print(s[0])
0
>>> print(s[1])
1
3.负数下标在底层实现时,是加上了一个字符串长度,转换为0、正数下标,再来索引的字符;
>>> print(s[-5]) # 下标-5转换为(-5+6) = 1
1
4.如果一个“负数+字符串长度”获得的下标超出了字符串合理的下标范围:
取单个字符的操作会报异常;
>>>s[-16]
Traceback (most recent call last):
File "C:\Program Files\JetBrains\PyCharm Community Edition 2023.1.3\plugins\python-ce\helpers\pydev\pydevconsole.py", line 364, in runcode
coro = func()
^^^^^^
File "<input>", line 1, in <module>
IndexError: string index out of range
截取字符串--不带step
s[start:end]
1.start和end为截取字符串的下标的左值和右值,不管下标是正数还是负数,都符合左闭右开的规则;
>>>s[0:6]
'012345'
>>>s[-6:-1] # 负数先转换为正数的下标,再从左值-->右值遍历
'01234'
>>>s[-6:0] # (-6+6)-->0遍历,为空字符串
''
>>>s[-6:1] # (-6+6)-->1遍历,遍历到下标0
'0'
2.异常的下标值
>>>s[0:7] # 部分下标在合法范围内,返回有效index索引到的字符串
'012345'
>>>s[-16:-1] # 部分下标在合法范围内
'01234'
>>>s[-16:] # 部分下标在合法范围内
'012345'
s[5:2] # 不满足循环遍历条件,返回空
''
>>>s[7:9] # 左右值都越界,不报异常,但下标都不在合法范围,返回空
''
>>>s[9:7] # 左右值都越界,不报异常,但是9-->7遍历时,初始条件就不成立,返回空
''
>>>s[-16:-10] # (-16+6)-->(-10+6)遍历,下标都不在合法范围
''
>>>s[-6:-16] (-6+6)-->(-16+6)遍历,不满足循环条件
''
截取字符串--带step
s[start:end:step]
1.start和end为截取字符串的下标的左值和右值,不管下标是正数还是负数,都符合左闭右开的规则;
2.step是截取的步长,按照start、start+step、start+step+step······来索引字符,得到的index需要小于end值;
>>>s[::1] # start、end为缺省值,start为最小值0、end为最大值6;也可以理解为遍历全部
'012345'
>>>s[0:5:1] #注意左闭右开
'01234'
>>>s[0:6:1]
'012345'
>>>s[::2]
'024'
>>>s[1:5:2]
'13'
>>>s[1:6:2] #注意左闭右开
'135'
3.step可以是负数,step为负数时不再是用第二点中的start、start+step、start+step+step······规则来算下标,而是将字符串翻转过来。
>>>s[::-1] # start、end为缺省值,start为最大值-1、end为最小值-7;也可以理解为遍历全部
'543210'
>>>s[::-2]
'531'
注意,当step为负数时,且start、end不是缺省值,start要比end值大,否则,会返回空字符串。
>>>s[1:6:-1]
''
>>>s[-6:-1:-1]
''
正确写法:
>>>s[-1:-7:-1]
'543210'
>>>s[-1:-6:-1] # 右开原则,index -6 (-6+6=0)娶不到
'54321'