一、问题引入:
在廖雪峰网站雪python切片的时候,这道课后题
让我困惑了下
课后题是利用切片去除字符串首尾空格
二、3个人的代码
①我的做法如下,多加了几个判断排除空str或全空格str带来的对空字符串切片的out of index问题
def trim1(s):#w我写的;繁琐,且不够健壮,需要额外判断空str、全空格str等
if(s == ''):return s #排除空Str
judgement = 1
for x in s:
if( x != ' ') :judgement = 0
if(judgement):return ''
h = 0
length = len(s)
while(s[h]==' '):
h += 1
r = -1
while(s[r]==' '):
r -= 1
length -= 1
return s[h:length]
②有个盆友这么写:
while s[0] == ' ':
s = s[1:]
while s[-1] == ' ':
s = s[:-1]
return s
这个想法我觉得非常好,跟人脑解决过程很相似,从头开始把前面空格一个一个删了,再从后开始一个一个删空格。但是,遇到s为空str,或全空格str(后面会压缩为空str)时仍然会出现out of index问题。
于是,我加了几个判断:
def trim2(s): #这个思想绝对值得学习:从头压缩,再从尾压缩;不过也要注意空str或者全为空格然后被压缩到空str的情况
if(s==''):return s #s为空str
else:
while s[0]==' ':
s = s[1:]
if(s==' '):return ''#s为全空格str,从头开始压缩到只s为一个空格str时,s[1:}out of index;而从头开始压缩,后面压缩到只剩下一个空格,就可以判断它是全空格str,返回空str即可
while s[-1]==' ':
s = s[:-1]
return s
貌似挺好?
③然而,这位老兄很吊
def trim(s):#此法真牛逼
b = 1
while(b==1):
if (s[:1]==' '):#这里才是重点!!若是s[0]会报错out of index ,而s[:1]则不会
s=s[1:]
elif (s[-1:]==' '):
s=s[:-1]
else:
b=0
return s
这个方法不会报错。然而,这个逻辑是跟二号老兄一样的呀,从头删,再从后面删除。那么,为什么他的不会错?
三、问题所在
问题不是出在逻辑上,而是出在对python切片的了解程度上。
试一下,将三号老哥 的if (s[:1]==' ')
判断条件写成if( s[0]==' ')
,就会出现out of index.
而这就是我、2号老哥代码报错、只能啰嗦地添加判断条件的关键所在。
四、分析
参考:–为什么Python中s为空字符时,输出s[0]会报错,但是输出s[0:]不会报错
–首先s[0]其实和s[0:1]是一样的获取第一个元素的。所以空字符串会报错。但是s[0:]这个是从0个元素开始到最后一个,如果空字符串就是s[0:0]所以不会报错
首先,要明白在python中,无论s是否为空字符串,s[0:0]都=‘’(空str)
其次,
①对于空字符串,s[0]或者s[0:1]都表示取第一个元素,这会报错。
若写成s[0:],表示从第0个元素开始到最后一个(对于空字符串, s[0:]则相当于s[0:0]了),不会报错;s[:1]也不会
也就是说,切片时,若考虑空字符串,取元素时候则不能写s[0],而是应该写s[0:]或者s[:1],他们是不一样的。
②对于非空字符串,s[0]与s[:1],s[0:1]则没什么不同了
而s[-1]与s[-1:]同理
五、所以,把二号老哥代码中的循环条件中切片的方式改改,我们就能得到最简代码了
①原来的
def trim2(s): #这个思想绝对值得学习:从头压缩,再从尾压缩;不过也要注意空str或者全为空格然后被压缩到空str的情况
if(s==''):return s #s为空str
else:
while s[0]==' ':
s = s[1:]
if(s==' '):return ''#s为全空格str,从头开始压缩到只s为一个空格str时,s[1:}out of index;而从头开始压缩,后面压缩到只剩下一个空格,就可以判断它是全空格str,返回空str即可
while s[-1]==' ':
s = s[:-1]
return s
②修改的-----简直完美!!
def trim(s):
while s[:1] == ' ': #麻麻,就是它搞事!
s = s[1:]
while s[-1:] == ' ': #麻麻,就是它搞事!
s = s[:-1]
return s