Python字符串索引超出范围,s [0]和s [:1]之间的差

时间:2019-03-19 18:18:20

标签: python python-3.x string slice

嗨,我是Python的新手,正试图实现使用删除两端空白的功能。

trim_1()工作正常,但是使用trim_2()时出现此错误:

IndexError: string index out of range 

那么s[:1]s[0]是不是同一个人?为什么s[:1]有效而s[0]无效? 任何人都可以对此有所了解吗?

def trim_1(s) :
    while s[:1]  == ' ':
        s= s[1:]
    while s[-1:] == ' ':
        s= s[:-1]
    return s


def trim_2(s) :
    while s[0] == ' ':
        s= s[1:]
    while s[-1] == ' ':
        s= s[:-1]
    return s

3 个答案:

答案 0 :(得分:1)

这是因为Python可以容忍片的越界索引,而不能容忍列表/字符串本身的越界索引,如下所示:

>>> ''[:1] # works even though the string does not have an index 0
''
>>> ''[0]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: string index out of range

答案 1 :(得分:1)

如果您要求一个特定的索引,那么您就是在告诉计算机您的代码需要该值继续。因此,在指定的索引处必须有一个元素,否则您将看到错误。使用此方法时,通常的做法是先进行检查,例如:

value = None
if len(s) > 0:
    value = s[0]  # if index 0 doesn't exist, and error will be thrown

如果您要的是这样的开放式“切片”,那么您就告诉计算机要在指定范围内的所有所有元素。程序员将需要处理可能的结果:不存在任何元素,存在1个元素,存在多个元素。

values = s[:0]  # returns variable number of elements
if len(values) == 0:
    ...
elif len(values) > 0:
    ...

这两种方法都有其用途。请记住,程序员在控制之中。这些都是可以用来解决问题的工具。每个选项都带有必须处理的不同边缘情况。请记住,每种情况都有一个或两个适当的数据结构。如果您使用的是不合适的代码,例如将对象属性放入数组而不是使用类,则您的代码将显得笨拙和丑陋。只是要记住一点。这样的东西随着您的经验越来越丰富才有意义。希望有帮助!

答案 2 :(得分:0)

您尝试过-

sentence = ' hello  apple '
sentence.strip()