Python基础之索引与切片

廖雪峰老师的Python教程中的题目引发了我对于字符串切片和索引的思考。


题目:

利用切片操作,实现一个trim()函数,去除字符串首尾的空格,注意不要调用strstrip()方法:

# -*- coding: utf-8 -*-
def trim(s):
##########
##填写内容
##########
# 测试:
if trim('hello  ') != 'hello':
    print('测试失败!')
elif trim('  hello') != 'hello':
    print('测试失败!')
elif trim('  hello  ') != 'hello':
    print('测试失败!')
elif trim('  hello  world  ') != 'hello  world':
    print('测试失败!')
elif trim('') != '':
    print('测试失败!')
elif trim('    ') != '':
    print('测试失败!')
else:
    print('测试成功!')

错误:

def trim(s):
    while (s[0] == ' '):
        s = s[1:]
    while (s[-1] == ' '):
        s = s[:-1]
    return s
#
#Traceback (most recent call last):
#  File "/app/main.py", line 18, in <module>
#    elif trim('') != '':
#  File "/app/main.py", line 3, in trim
#    while (s[0] == ' '):
#IndexError: string index out of range 

正确:

def trim(s):
    while (s[:1] == ' '):
        s = s[1:]
    while (s[-1:] == ' '):
        s = s[:-1]
    return s

字符串,元祖,列表的索引和切片是相同的,因为他们都是序列。

Python 能够处理没有意义的切片:当切片范围超出序列的实际长度,只取切片的有效部分,没有有效部分就返回空序列。
示例:

>>> a = [1,2,3]
>>> a[1:23]
[2, 3]
>>> a[20:100]
[]

但是索引如果无效就会报错

>>> a[8]
IndexError: list index out of range

所以对于空序列,也是同样的道理:即使切片无效也没有关系,因为会返回空序列,而索引则会报错。

>>> a = []
>>> a[0:1]
[]

因而要选择通过切片去除字符串首尾的空格,而非索引。


另:关于切片:

对于s[a,b,c]:
a可以取到;b不可以取到;c为步长,可正可负
步长c为正时从a开始向右一直到b;步长c为负时从a开始向左一直到b

s = '0123456789'
for a in s[0:4:-2]:
    print(a, end=' ')

结果为
解释:s[0:4:-2]表示切片从0开始,步长为2方向从右到左,一直到4。由于不合法,所以为空

s = '0123456789'
for a in s[4:0:-2]:
    print(a, end=' ')

结果为4 2
解释:s[4:0:-2]表示切片从4开始,步长为2方向从右到左,一直到0。

s = '0123456789'
for a in s[0:4:2]:
    print(a, end=' ')

结果为0 2
解释:s[0:4:2]表示切片从0开始,步长为2方向从左到右,一直到4。

posted @ 2021-07-15 14:01  艾雅雅雅  阅读(212)  评论(0)    收藏  举报