一些关于自己学习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 这个没有弄明白。
帮主解答:
因为分片索引在空字符串的时候就不会报错,而索引遇到空字符串就会报错
网友评论