美文网首页
2020-07-08 Python学习笔记19 字符串索引

2020-07-08 Python学习笔记19 字符串索引

作者: 建渐升辉 | 来源:发表于2020-07-08 15:35 被阅读0次

    一些关于自己学习Python的经历的内容,遇到的问题和思考等,方便以后查询和复习。

    声明:本人学习是在扇贝编程通过网络学习的,相关的知识、案例来源于扇贝编程。如果使用请说明来源。

    字符串索引:

    可以通过 索引 来访问列表里的元素,其实字符串也一样有 索引。

    和列表一样,我们可以通过索引或反向索引的方式访问字符串中的字符

    正向索引是从 0 开始计数,而反向索引则是从 -1 开始计数,这一点一定要记清楚。

    一般我们采取“就近原则”来决定使用正向索引还是反向索引——即访问靠前的元素用正向索引,靠后的元素用反向索引,这样就可以尽可能少地数这是第几个元素了。

    字符串分片:

    除了索引之外,字符串和列表还有很多相似之处:它们都是有序序列,都可以使用 len() 函数获取元素个数,当然还有本节的重点——分片。字符串的分片和列表的分片是一样的。

    string = 'Hello World'

    # 从索引 0 开始,到索引 3 为止,不包括索引 3

    print(string[0:3])

    # 输出:Hel

    # 如果第一个索引是 0,可以省略

    print(string[:3])

    # 输出:Hel

    print(string[3:11])

    # 输出:lo World

    # 如果分片到末尾,后面也可以省略

    print(string[3:])

    # 输出:lo World

    # 如果都省略,则是复制一个一样的字符串

    print(string[:])

    # 输出:Hello World

    有两个注意点:

    分片是半闭半开区间,即包含前面索引位置的元素,不包含后面索引位置的元素。比如:string[m:n] 获取的是字符串 string 中索引为 m 到 n-1 之间的元素(包括 m 和 n-1);

    分片中前后索引的值是可以省略的,前索引省略默认为 0,后索引省略默认为序列长度。

    分片超出范围是不会报错的。你可以把字符串想象成一根绳子,分片就是用刀将绳子切分开来。在字符串长度内分片相当于在绳子上切割,而超出范围相当于一刀砍到了空气,对于绳子来说没有影响。

    注意!这一点和索引取值是不同的,如果索引取值超出范围将会报错。

    提示:上述字符串分片的知识对列表、元组分片同样适用。

    字符串不可变性:

    字符串一旦创建后是不可改变的,这个属性和元组类似,通过索引来改变字符串中元素就会报错:

    那么我们怎样才能修改字符串的内容呢?答案是使用字符串分片和拼接去生成一个新的字符串

    练习:五花肉

    小贝去菜市场买菜,她选中了一块猪肉,但是肥瘦相间。小贝只想要中间的瘦肉,你能帮她“切出瘦肉”吗?

    pork = '瘦肉肥肉瘦肉瘦肉瘦肉肥肉肥肉瘦肉肥肉'

    # 要“切出”中间的“瘦肉瘦肉瘦肉”哦

    i = 0

    a = len(pork)

    print(a)

    if i <= len(pork):

      print(pork[i] + pork[i + 1])

      i = i + 4

      print(i)

    结果:

    18

    瘦肉

    4

    也就是说没有循环起来,百思不得其解,后来群里问了一下帮助,才发现if不具备循环功能

    if 改成while之后就能循环起来了。

    这个题目看错了,其中有连续的三个瘦肉,题目的本意是把这块肉切出来,我理解为肥瘦相间,挑出瘦肉,审题不清

    pork = '瘦肉肥肉瘦肉瘦肉瘦肉肥肉肥肉瘦肉肥肉'

    # 要“切出”中间的“瘦肉瘦肉瘦肉”哦

    print(pork[4:10])

    想复杂了,这个题目就是练习对字符串进行分片,方法和列表完全一样

    练习:掐头去尾

    利用分片操作,实现一个 trim() 函数,该函数的功能是去除 字符串首尾 的所有空格,字符串中间的空格保留。如:' Hello World ' 处理成 'Hello World'。

    def trim(s):

      # 补充你的代码

      if trim[0] == ' ':

        s = trim[1:]

        return s

      if trim[-1] == ' ':

        s = trim[:-2]

        return s

      if trim[0] == ' ' and trim[-1] == ' ':

        s = trim[1:-1]

    print(trim(' Hello World'))

    print(trim('Hello World '))

    print(trim(' Hello World '))

    print(trim('  Hello World  '))

    print(trim(' '))

    报错说:

    TypeError: 'trim' does not support indexing on line 3

    看了答案,才发现trim是函数,s是变量,而是才是字符串的。所以用错变量名了

    改了之后,仍然存在问题:

    def trim(s):

      # 补充你的代码

      if s[0] == ' ':

        s = s[1:]

        return s

      if s[-1] == ' ':

        s = s[:-1]

        return s

      if s[0] == ' ' and s[-1] == ' ':

        s = s[1:-1]

    print(trim(' Hello World'))

    print(trim('Hello World '))

    print(trim(' Hello World '))

    print(trim('  Hello World  '))

    print(trim(' '))

    运行结果:

    Hello World

    Hello World

    Hello World

      Hello World 

    看运行结果,头尾只有一个存在空格的,能够产生正确的结果,而首尾都有空格,以及首尾空格不止一个的,就无法得到正确的结果了。

    答案:

    答案只用了两个循环,当头存在空格时,当尾存在空格时,进行剪切,最后返回s,用的是while循环,结果我用的if,if只在条件成立时操作一次。无法进行多次循环操作

    修改之后:

    def trim(s):

      # 补充你的代码

      while s[:1] == ' ':

        s = s[1:]

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

        s = s[:-1]

      return s  #最初把这个缩进,和s同一层,结果第一个变成none,最后一个没有切干净。因为此时只是返回第二个循环的结果,所以第一个就没有结果,只给个none,第二个循环是切尾巴的,所以有的头没有切干净。

    print(trim(' Hello World'))

    print(trim('Hello World '))

    print(trim(' Hello World '))

    print(trim('  Hello World  '))

    print(trim(' '))

    (1)return s 和s同一个层次,即在while循环内部

    def trim(s):

      # 补充你的代码

      while s[:1] == ' ':

        s = s[1:]

        return s

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

        s = s[:-1]

    print(trim(' Hello World'))

    print(trim('Hello World '))

    print(trim(' Hello World '))

    print(trim('  Hello World  '))

    print(trim(' '))

    把return放在第一个循环内的结果

    Hello World

    None

    Hello World

      Hello World 

    第一个运行第一个循环,把头去掉了,得到正确结果

    第二个不符合条件,所以返回的结果是none

    第三个运行第一个循环,把头去掉之后,返回结果,但是尾没有切掉。

    第四个首尾都有三个空格,切掉头的一个空格之后,返回结果,头没有切干净,尾没有切。

    此时,运行的只是第一个循环。而且符合条件的切头,返回值,不符合条件的都是none,比如把第四个的头上的三个空格都去掉,运行结果也是none。由于return和s一个层次的,只循环一次就返回值了。所以第四个的头部空格并没有切干净。

    (2)return s 和while一个层次时,在第二个循环外

    def trim(s):

      # 补充你的代码

      while s[:1] == ' ':

        s = s[1:]

      return s  # 这个和while一个层次,返回四个结果,头都切干净了,但是尾巴没切

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

        s = s[:-1]

    print(trim(' Hello World'))

    print(trim('Hello World '))

    print(trim(' Hello World '))

    print(trim('  Hello World  '))

    print(trim(' '))

    结果是:

    Hello World

    Hello World

    Hello World

    Hello World 

    此时,有头就切头,没头就直接返回,所以头切的比较干净,尾巴没有切,而且切不切都返回结果。因为return和while是同一个层次的。

    (3)return s放在第二个while,和s一个层次,在第二个循环内

    def trim(s):

      # 补充你的代码

      while s[:1] == ' ':

        s = s[1:]

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

        s = s[:-1]

        return s

    print(trim(' Hello World'))

    print(trim('Hello World '))

    print(trim(' Hello World '))

    print(trim('  Hello World  '))

    print(trim(' '))

    None

    Hello World

    Hello World

    Hello World 

    None

    此时的运行过程是,先运行第一个循环,因为所有头部由空格的,空格都被切掉了。所以第一个循环肯定运行,然后运行第二个循环,当发现串的尾部没有空格时,循环不运行,结果回复为none。所以,经过调试发现,只要尾部没有空格的,返回的结果都是none。而且第四个尾部有三个空格,只运行一次,就换回了。结果尾部还有两个空格,并没有切干净,因为return和s一个层次。

    (4)return在第二循环之后,和while同一层次,在两个循环之外

    def trim(s):

      while s[:1] == ' ':

        s = s[1:]

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

        s = s[:-1]

      return s

    print(trim(' Hello World'))

    print(trim('Hello World '))

    print(trim(' Hello World '))

    print(trim('  Hello World  '))

    print(trim(' '))

    答案:

    Hello World

    Hello World

    Hello World

    Hello World

    四个字符串,头尾都切的很干净。因为两个循环都运行了,第一个循环切头,第二个循环切尾,如果头部或者尾部有多个空格,对多次循环,知道切干净,再返回结果。因为return和while是一个层次的,而且在得个循环之外。

    从这个例子可以看出来,程序的层次很重要,return的不同层次、不同位置会导致不同的结果。

    本题我想到头==空格,尾等于空格的情况,但是开始没有用循环,所以剪切不干净。因为有的是一个空格,有的是多个空格,所以用if是不能达到目的的。

      while s[:1] == ' ':

    第二个行的这个索引[:1]改成[0]的话,就会报错,IndexError: string index out of range on line 2 这个没有弄明白。

    帮主解答:

    因为分片索引在空字符串的时候就不会报错,而索引遇到空字符串就会报错

    相关文章

      网友评论

          本文标题:2020-07-08 Python学习笔记19 字符串索引

          本文链接:https://www.haomeiwen.com/subject/oysccktx.html