从廖雪峰老师的Python教程中的题目引发了我对于字符串切片和索引的思考。
题目:
利用切片操作,实现一个trim()函数,去除字符串首尾的空格,注意不要调用str
的strip()
方法:
# -*- 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]
[]
因而要选择通过切片去除字符串首尾的空格,而非索引。