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

一些关于自己学习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 这个没有弄明白。

帮主解答:

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


©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,546评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,224评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,911评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,737评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,753评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,598评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,338评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,249评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,696评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,888评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,013评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,731评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,348评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,929评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,048评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,203评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,960评论 2 355