美文网首页
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 字符串索引

    一些关于自己学习Python的经历的内容,遇到的问题和思考等,方便以后查询和复习。 声明:本人学习是在扇贝编程通过...

  • python学习_01

    python的数字类型、字符串、索引、切片讲解 python的数据类型 【重点学习】字符串【表示、索引、切片、内置...

  • python学习笔记18_字符串相关操作

    python 笔记18 1.字符串简单操作 1.1 重复输出字符串 1.2 通过索引获取字符串字符 通过索引获取字...

  • Python ☞ day 3

    Python学习笔记之 字符串 & 列表 & 元组 & 字典 字符串 什么是字符串? 字符串运算 字符串方法 列表...

  • python学习指南之字符串、列表、文件

    一、字符串 1.1 基本知识点 1.1.1 控制台输入 1.1.2 索引 python中的字符串索引有正向索引和反...

  • 学习 Python 笔记

    学习 Python 笔记 eval()//去除双引号 字符串的切片 name =“1234567” name[2:...

  • Python之截取字符串

    python中可以通过字符串的索引值对字符切片。 python中的字符串有两种索引方式,下面通过一个例子来说明。 ...

  • 10.22 python学习(二)函数使用

    继续学习python基础教程。 第三章 使用字符串 基本字符串操作:索引,分片,乘,判断成员, 求长度,max,m...

  • Python 序列截取2021-06-21

    序列截取实际上也就是字符串截取 1.索引数字使用 Python 允许从字符串的两端使用索引: 当以字符串的左端(字...

  • Python学习-序列(list,tuple,str)

    查看所有Python相关学习笔记 序列相关知识点 序列: list 将字符串、元组转化为列表 tuple 将字符串...

网友评论

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

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