python切片的使用or函数的理解

学习python切片时,是编写函数可以做到去除字符串前后的空格,代码如下:
def  trim(s):

    while s[:1]==' ':

        s=s[1:]      

    while s[-1:]==' ':

        s=s[:-1]      

    return s      

测试没有问题,但是想到,如果字符串是" " (即单独的一个空格)应该会进入死循环,但是并没有
问题一:为什么没进入死循环
问题二:后面自己改了一下代码如下:

def trim(s):
    while s[0]==" ":
        if len(s)==1:
            s=" "
            break
        s=s[1:]
    while s[-1]==" ":
        if len(s)==1:
            s=" "
            break
        s=s[:-1]
    return 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('测试成功!')

发现会出现报错,报错为:

  File "c:\Users\zdw\Desktop\python\study\qiepian.py", line 23, in <module>
    elif trim('') != '':
  File "c:\Users\zdw\Desktop\python\study\qiepian.py", line 2, in trim
    while s[0]==" ":
IndexError: string index out of range

问题二:为什么第二种单独测试字符串" "不会报错,而统一测试会报错

谢谢大家。刚开始学python,理论理解不清

我刚刚试了一下关于你的问题一

s=' '
print(len(s[:1]))
print(len(s[1:]))

这样输出的结果是1 0,说明s[1:]就是一个空字符串(因为这个切片是从字符串第二个到末尾,而字符串本身就只有一个空格)
所以s在经过一次循环以后就变成了空字符串,显然不再满足循环条件
那么没有进入死循环的原因也就解决了

1.单独一个空格,怎么会死循环?while s[:1]==' ':时你的s=s[1:] 这里s[1:]就得到的是空字符串,而不是一个空格的字符串
2.当s='' 即s为空字符串而不是空隔字符串时,s[0]就会报错
所以你要严格把空字符串与空格字符串区分开来。

首先:s[:1]是获取s字符串0到1(不包含)下标的字符
s[:1]==' ':的意思就是 s[:1]的值为一个空格字' '就进入循环

问题一:如果字符串是" " (即单独的一个空格)应该会进入死循环,但是并没有。为什么没进入死循环
先判断s[:1]=是不是等于 ‘ ’,是进入循环,然后重新赋值s,s=s[1:],因为你本身s就只有一个空字符,那么只有下标0,s[1:]表示从下标1到结束的所有字符。但你没有下标1,所有此时你的s是'',啥都没有,一个空的字符串。再去判断s[1:]==" ",也就是 ‘’ == “ ”,空字符是否等于空格字符。不等于,不进入循环