python空字符切片的注意事

一、问题引入:
在廖雪峰网站雪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

你可能感兴趣的:(python空字符切片的注意事)