从廖雪峰老师的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]
[]

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