python空字符切片的注意事

一、问题引入:
在廖雪峰网站雪python切片的时候,这道课后题
让我困惑了下
【python空字符切片的注意事】课后题是利用切片去除字符串首尾空格
二、3个人的代码
①我的做法如下,多加了几个判断排除空str或全空格str带来的对空字符串切片的out of index问题

def trim1(s):#w我写的;繁琐,且不够健壮,需要额外判断空str、全空格str等 if(s == ''):return s #排除空Strjudgement = 1 for x in s: if( x != ' ') :judgement = 0 if(judgement):return ''h = 0 length = len(s)while(s[h]==' '): h += 1r = -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

    推荐阅读